如果输入为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
。
给定的错误是否有解决方法?忽略错误可能会完成这项工作,但这不是我想做的事情。
问题是你正在尝试进行非法操作。您要求编译器查看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
进行比较,我们循环遍历c
的所有单个单元格内容(Range对象表示为Target
)并与之进行比较。
同样,您可以通过尝试此代码并填充一些值来验证这是否有效:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
Debug.Print c.Address
Next c
End Sub
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