在Excel中更改数据范围时键入不匹配错误

时间:2018-01-02 09:01:31

标签: excel vba excel-vba

如果输入为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

给定的错误是否有解决方法?忽略错误可能会完成这项工作,但这不是我想做的事情。

2 个答案:

答案 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)

  1. 由于Worksheet_Change事件在其定义的工作表上触发,因此绝对不需要检查活动工作表的名称。
  2. 而是迭代Target中的每个单元格,您可以直接接收交叉点并应用您的设置。
  3. 不要忘记Target可以包含非连续范围(通过Areas属性访问)。我的代码处理了这种情况,但不能对RotateRib说明相同的内容。
  4. 总结一下:

    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