Vba 在Excel中更改数据范围时出现类型不匹配错误
我已经写了一个宏,如果输入为真,我的单元格颜色为绿色,如果输入为假,我的单元格颜色为红色Vba 在Excel中更改数据范围时出现类型不匹配错误,vba,excel,Vba,Excel,我已经写了一个宏,如果输入为真,我的单元格颜色为绿色,如果输入为假,我的单元格颜色为红色 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(
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),会在我的宏中引发类型不匹配错误
调试器说有问题的行是,如果Target=“False”,则为
是否有解决给定错误的方法?忽略此错误可能会完成此任务,但我不想这样做。问题在于您试图执行非法操作。您要求编译器查看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
进行比较,而是循环遍历Target
的所有单个单元格内容(范围对象表示为c
),并与这些内容进行比较
同样,您可以通过尝试此代码并填写一些值来验证此方法是否有效:
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
绝对不需要检查活动工作表的名称,因为Workplace_Change事件在定义它的工作表上激发
您可以接收交叉点并直接应用设置,而不是在目标中的每个单元格上进行迭代
不要忘记目标可以包含非连续范围(通过Areas属性访问)。我的代码可以处理这种情况,但不能对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
感谢您不仅提供了解决方案,还提供了一个很好的解释。另外,如果Target=“False”,则需要将更改为如果c=“False”,则需要将更改为。不客气-是的,最后一个观察结果当然是正确的。我的缺点是没有发现它。:)@skrat还有另一个Target
遗留的实例。看到更新的答案,我想我都知道了。