我正在测试下面的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
答案 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.Select
,Selection.Offset(0, 1).Select
和Selection
,而是使用完全限定的Range
,并使用它Offest
和Resize
属性。
所以不要使用下面的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