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

问题描述 投票:2回答:2

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

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

excel vba excel-vba
2个回答
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进行比较,我们循环遍历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

1
投票
  1. 由于Worksheet_Change事件在定义它的工作表上触发,因此绝对不需要检查活动工作表的名称。
  2. 而是迭代Target中的每个单元格,您可以接收交集并直接应用您的设置。
  3. 不要忘记Target可以包含非连续范围(通过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
© www.soinside.com 2019 - 2024. All rights reserved.