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

时间:2016-01-30 02:56:13

标签: vba events find highlight worksheet

如果在列中找到另一个工作表中的Target.value,我正试图弄清楚如何突出显示行(A到Q)。我设法达到了确定是否在另一个工作表中的列中找到Target.Value的点,但不确定如何突出显示仅从列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

1 个答案:

答案 0 :(得分:0)

提供错误"方法'范围'对象' _Worksheet'失败"本来有助于理解我们如何提供帮助。如果你知道你想要列A:Q着色,只需使用Range方法的重载。

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

您现有代码的问题在于您尝试在" BC联系人列表中选择范围"使用对已触发Worksheet_Change事件的工作表的Cells对象的引用。选择该范围的正确方法是(使用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(可以通过转到工具>选项并单击需要变量声明来启用此选项以自动插入新模块。选项显式有助于确保您在变量上没有拼写错误名。
  • 我使用ThisWorkbook对象而不是ActiveWorksheet / ActiveWorkbook,因为如果从其他工作簿/工作表中偶然运行此对象,将会发生意外结果。
  • 我将变量设置为Worksheet对象,而不是经常使用工作表名称引用它们。通常更好地使用对象而不是一遍又一遍地引用相同的东西(通过工作表名称,单元格编号等)
  • 我使用Intersect方法来防止在Target中的大范围内进行迭代。只需将您关注的范围放在目标与之相交的范围内,只有在它与之相关时才能正常工作。
  • 我删除了所有激活和选择/离子通话。在处理大量数据时,这些效率极低。
    • 提高效率的一种方法是将Application.ScreenUpdating = False放在例程的开头,将Application.ScreenUpdating = True放在例程的末尾(或者例程的任何退出)
    • 另一种方法是完全删除通话。通过使用Worksheet对象,我们现在可以直接与其成员进行交互,无论我们使用什么表或范围。