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
    遗留的实例。看到更新的答案,我想我都知道了。