【问题标题】:Type Mismatch error when range of data is changed in Excel在 Excel 中更改数据范围时出现类型不匹配错误
【发布时间】:2018-06-11 23:47:41
【问题描述】:

我编写了一个宏,如果输入为 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)会引发 Type我的宏中出现不匹配错误。

调试器说有问题的行是If Target = "False" Then。

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

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    问题在于您正在尝试进行非法操作。您要求编译器查看 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
    

    【讨论】:

    • 感谢您不仅提供解决方案,还感谢您的精彩解释。还需要将If Target = "False" Then 更改为If c = "False" Then。
    • 不客气——是的,最后的观察当然是正确的。没有发现它是我的坏事。 :)
    • @skrat 还有另一个Target 实例被留下。查看更新后的答案,我想我都知道了。
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      相关资源
      最近更新 更多