VBA:如果在列中找到 Target.Value,则突出显示 Table 行

VBA: Highlighting Table Row if Target.Value is found within a column

我想弄清楚如果在列中找到另一个 sheet 中的 Target.value,如何突出显示行(A 到 Q)。我设法确定 Target.Value 是否在不同 sheet 的列中找到,但不确定如何突出显示仅从 A 列到 Q 列找到值的行.这是我到目前为止创建的代码。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Lastrow As Long
Dim Lastrow2 As Long
Dim c As Range

Lastrow = ActiveSheet.UsedRange.Rows.Count
Lastrow2 = Worksheets("Action Sheet").UsedRange.Rows.Count

Application.EnableEvents = False
For Each c In Target
    If c.Column = 16 Then
    Worksheets("Action Sheet").Cells(Lastrow2 + 1, 1).Value = Target.Value
    End If

Next c
Application.EnableEvents = True

Set Finder = Sheets("BC Contact List").Range("A:A").Find(Target.Value, LookAt:=xlWhole)
If Not Finder Is Nothing Then

Sheets("BC Contact List").Cells(Finder.Row, 18).Value = "Y"

Sheets("BC Contact List").Activate
ActiveSheet.Range(Cells(Finder.Row, 1), Cells(Finder.Row, 18)).Select
With Selection.Interior
    .PatternColorIndex = xlAutomatic
    .Color = 5296274
    .TintAndShade = 0
    .PatternTintAndShade = 0
End With

End If

End Sub

提供错误 "Method 'Range' of object '_Worksheet' failed" 将有助于理解我们如何提供帮助。如果您知道要为列 A:Q 着色,只需使用 Range 方法的重载即可。

Worksheets("BC Contact List").Range("A" & finder.Row & ":Q" & finder.Row).Select

您现有代码的问题在于,您正试图 select 使用对 sheet 的 Cells 对象的引用 "BC Contact List" 上的一个范围 Worksheet_Change 事件已被触发。 select 该范围的正确方法是(为简洁起见,使用 Worksheet 对象):

Dim ws as Worksheet
Set ws = Worksheets("BC Contact List")
ws.Range(ws.Cells(finder.Row, 1), ws.Cells(finder.Row, 18)).Select

工作代码:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Worksheets("BC Contact List")
    Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Worksheets("Action Sheet")
    Dim lastRow As Long: lastRow = ws2.UsedRange.Rows.Count

    If (Not (Intersect(Range("P:P"), Target) Is Nothing)) Then

        Dim finder As Range: Set finder = ws1.Range("A:A").Find(Target.Value, LookAt:=xlWhole)

        If (Not (finder Is Nothing)) Then
            ws1.Cells(finder.Row, 18).Value = "Y"
            With ws1.Range("A" & finder.Row & ":Q" & finder.Row).Interior
                .PatternColorIndex = xlAutomatic
                .Color = 5296274
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
        End If
    End If

    Application.EnableEvents = True

End Sub

一些注意事项:

  • 您应该始终在模块的顶部使用 Option Explicit(通过转到“工具”>“选项”并单击“需要变量声明”可以启用它以自动插入到新模块中。Option Explicit 有助于确保您没有拼写错误变量名。
  • 我使用 ThisWorkbook 对象而不是 ActiveWorksheet/ActiveWorkbook,因为如果您 运行 这不小心来自另一个 workbook/worksheet,将会出现不希望的结果。
  • 我为 Worksheet 对象设置了变量,而不是经常用 sheet 名称引用它们。通常最好使用该对象而不是一遍又一遍地引用同一事物(通过 sheet 名称、手机号码等)
  • 我使用 Intersect 方法来防止在 Target 中进行大范围迭代。简单的设置你关心的范围,看Target是否相交,相交才工作
  • 我删除了所有 Activate 和 Select/ion 调用。在处理大量数据时,这些方法效率极低。
    • 一种提高效率的方法是将 Application.ScreenUpdating = False 放在例程的开头,将 Application.ScreenUpdating = True 放在例程的末尾(或例程的任何出口)
    • 另一种是完全删除调用。通过使用 Worksheet 对象,我们现在可以直接与其成员交互,而不管我们处于什么 sheet 或范围。