如果输入为TRUE,我已经写了一个宏来为我的单元格着色为绿色,如果单元格的输入为FALSE,我写了一个红色。
Private Sub Worksheet_Change(ByVal Target As Range)
If ActiveSheet.Name = "Ribs" Then
If Not Intersect(Target, Range("G2:K200")) Is Nothing Then
If Target = "False" Then
Sheets("Ribs").Range(Target.Address).Style = "Bad"
ElseIf IsNumeric(Target) Then
Sheets("Ribs").Range(Target.Address).Style = "Good"
End If
ElseIf Not Intersect(Target, Range("D2:D200")) Is Nothing Then
RotateRib (Target.Address)
End If
End If
End Sub
现在的问题是,如果我更改范围值(例如在单元格G2中键入TRUE,而不是将鼠标指针从G2的右下角拖动到G10,则应将值TRUE复制到范围G2:G10)引发类型我的宏中的不匹配错误。
调试器说有问题的行是If Target = "False" Then
。
给定的错误是否有解决方法?忽略错误可能会完成这项工作,但这不是我想做的事情。
答案 0 :(得分:2)
问题是您正在尝试进行非法操作。您要求编译器查看G2:G10
的内容是否等于False
- 您可以通过将Debug.Print Target.Address
添加到代码顶部然后再次尝试来查看此内容。
可以做你想做的事,但你需要更多的代码。比较值时,您必须逐个单元地进行 - 您不能一次比较整个范围。这是一个基本的例子:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If ActiveSheet.Name = "Ribs" Then
For Each c In Target
If Not Intersect(c, Range("G2:K200")) Is Nothing Then
If c.Value = "False" Then
Sheets("Ribs").Range(c.Address).Style = "Bad"
ElseIf IsNumeric(c.Value) Then
Sheets("Ribs").Range(c.Address).Style = "Good"
End If
ElseIf Not Intersect(c, Range("D2:D200")) Is Nothing Then
RotateRib (c.Address)
End If
Next c
End If
End Sub
主要变化是我们不再与Target
进行比较,我们循环遍历{{1}的所有单个单元格内容(表示为c
的Range对象)并与那些进行比较。
同样,您可以通过尝试此代码并填写一些值来验证这是否有效:
Target
答案 1 :(得分:1)
Target
中的每个单元格,您可以直接接收交叉点并应用您的设置。RotateRib
说明相同的内容。总结一下:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngIntersect As Range, rngArea As Range, cell As Range
Set rngIntersect = Intersect(Target, Range("G2:K200"))
If Not rngIntersect Is Nothing Then
For Each rngArea In rngIntersect.Areas
For Each cell In rngArea
cell.Style = IIf(cell, "Good", "Bad")
Next
Next
End If
Set rngIntersect = Intersect(Target, Range("D2:D200"))
If Not rngIntersect Is Nothing Then RotateRib (rngIntersect)
End Sub