Worksheet_Event:如何查找单元格和偏移1& 2列

时间:2017-03-24 21:04:36

标签: vba excel-vba excel

我正在测试下面的Worksheet_Event代码。它做了一些奇怪的事情。这些代码基本上是3部分:

#1)  Enter "EXPL-" & Target.Value

#2)  Find a cell in Column R with this language:
"Out of Standard (Comment Needed)"
Then, move over one column, and highlight cell.
Then, go over 1 more column form there, and highlight cell.

#3)  Conditional Format for missing values

似乎#1和#3工作正常,但#2没有突出显示列S或列T中的单元格,它突出显示活动单元格中的下一个单元格。活动单元格应位于R列中。

Private Sub Worksheet_Change(ByVal Target As Range)

'#1)
  If Target.Column <> 1 Then Exit Sub

  On Error GoTo ErrHandler
  Application.EnableEvents = False
  If Target.Column = 1 Then
     If IsNumeric(Target.Value) Then
       Target.Offset(0, 0).Value = "EXPL-" & Target.Value
     End If
  End If
ErrHandler:
Application.EnableEvents = True

'#2)
lRow = Range("R" & Rows.Count).End(xlUp).Row
Set MyRows = Range("R19:R" & lRow)
For Each cell In MyRows
On Error Resume Next
    If cell.Value = "Out of Standard (Comment Needed)" Then cell.Address.Select
        Selection.Offset(0, 1).Select
            With Selection.FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorAccent2
                .TintAndShade = 0.399945066682943
            End With
    If cell.Value = "Out of Standard (Comment Needed)" Then cell.Address.Select
        Selection.Offset(0, 1).Select
            With Selection.FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorAccent2
                .TintAndShade = 0.399945066682943
            End With
Next

'#3)
lRow = Range("B" & Rows.Count).End(xlUp).Row
Set MyRows = Range("B19:B" & lRow)
MyRows.Select
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
    "=ISBLANK(B19)"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
    .PatternColorIndex = xlAutomatic
    .ThemeColor = xlThemeColorAccent2
    .TintAndShade = 0.399945066682943
End With
Selection.FormatConditions(1).StopIfTrue = False

End Sub

2 个答案:

答案 0 :(得分:2)

我不确定这是不是你想要做的。让我知道你的想法。所以这种方法有几个问题,但我只想关注你提到的两个单元格。

正如其他人所说,我不会使用选择。我会在for循环中使用对引用的单元变量的偏移量。

此外,如果R列包含“Out of Standard(Comment Needed)”,则有两个if语句似乎正在设置选择。这两个if语句没有封装单元格格式化语句。这意味着无论R列中的文本是什么(不确定这是否是设计),每次都会执行单元格格式化。我将其合并为一个封装了单元格格式的if语句。

例如

If 1=2 Then Debug.Print("1st")
    Debug.Print("2nd")

这相当于

If 1=2 Then
    Debug.Print("1st")
End If
Debug.Print("2nd")

第二个将始终在此语句中打印,因为第二个调试语句不在if块中。永远不会打印1st,因为1永远不会等于2。

If 1=2 Then
   Debug.Print("1st")
   Debug.Print("2nd")
End If

在这个例子中,第一个或第二个都不会被打印,因为它们都属于If块而1永远不会等于2

最后,我可能在这里错了,但我注意到你正在使用格式条件。也许您的条件格式在您的工作表中而不在代码中。您似乎没有向此范围添加条件格式,因此我删除了formatcondition并只设置了单元格的内部格式。

'#2)
lRow = Range("R" & Rows.Count).End(xlUp).Row
Set MyRows = Range("R19:R" & lRow)
For Each cell In MyRows
On Error Resume Next
    If cell.Value = "Out of Standard (Comment Needed)" Then
            With cell.Offset(0, 1).Interior
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorAccent2
                .TintAndShade = 0.399945066682943
            End With

            With cell.Offset(0, 2).Interior
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorAccent2
                .TintAndShade = 0.399945066682943
            End With
    End If
Next

答案 1 :(得分:1)

关于你的代码的一些评论(太长时间不作评论):

你已经拥有:

If Target.Column <> 1 Then Exit Sub

因此再次使用下面的行几乎没有用处(否则你将退出sub):

If Target.Column = 1 Then

在您的情况下,尽量避免使用On Error Resume Next,因为它只会跳过错误而不是处理错误。

无需使用cell.Address.SelectSelection.Offset(0, 1).SelectSelection,而是使用完全限定的Range,并使用它OffestResize属性。

所以不要使用下面的3行两次:

If cell.Value = "Out of Standard (Comment Needed)" Then cell.Address.Select
    Selection.Offset(0, 1).Select
        With Selection.FormatConditions(1).Interior

您可以使用:

With Cell.Offset(, 1).Resize(1, 2).FormatConditions(1).Interior