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 或范围。
我想弄清楚如果在列中找到另一个 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 或范围。
- 一种提高效率的方法是将