【问题标题】:Excel 2016 VBA Runtime error 13Excel 2016 VBA 运行时错误 13
【发布时间】:2018-06-20 22:07:09
【问题描述】:

我编写了下面的代码,仅当 B 列相应行中的单元格值更改为特定列表/范围 (B118:B124) 的一部分时,才清除 D 列中的单元格。如果我将 B 中的单元格更改为不属于该列表的任何值,则 D 中相应行中的单元格将不会清除(这就是我想要的)。

下面的代码工作正常,除了,例如,如果我想同时删除 B 列中的 5 个(相邻)单元格,我会收到运行时错误 13。如果我在第一个输入新值也是如此删除/空白单元格,然后尝试将其自动填充到其余已删除/空白单元格中。基本上,如果我想同时更改 B 中的多个单元格(自动填充,...),下面的代码似乎不起作用。如果我一次只删除/更改一个单元格(在 B 中),它工作得很好。任何帮助将不胜感激。谢谢。

Private Sub Worksheet_Change (ByVal Target As Range)  

If Not Intersect(Target, Range("B:B")) Is Nothing Then
    If Application.WorksheetFunction.CountIf(Range("B118:B124"), Target) Then
        Range("D" & Target.Row).ClearContents
    End If
End If

End Sub

【问题讨论】:

  • 顺便说一下,出现错误消息时突出显示的行是:“If Application.WorksheetFunction.Countif(Range("B118:B124"), Target) Then”
  • 嗨 urdearboy,上面代码中唯一缺少的是:Private Sub Worksheet_Change(ByVal Target As Range)。这显然是第一行代码。其他一切都如上所示。谢谢
  • 当我尝试同时更改 B 中的多个单元格时,知道什么可能导致运行时错误吗?
  • 欢迎来到 Stack Overflow!标准的网站风格是更新您的问题,而不是澄清 cmets。祝你好运!

标签: vba excel


【解决方案1】:

认为问题是COUNTIF 期待一个奇异值,而不是包含值的范围。试试这个:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("B:B")) Is Nothing Then
    For Each cell In Range(Target.Address)
        If Application.WorksheetFunction.CountIf(Range("B118:B124"), cell) Then
            Range("D" & cell.Row).ClearContents
        End If
    Next cell
End If

End Sub

编辑:更新了每个人的贡献的答案:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("B:B")) Is Nothing Then
    For Each cell In Target
        If Not Intersect(cell, Range("B:B")) Is Nothing Then
            If Application.WorksheetFunction.CountIf(Range("B118:B124"), cell) Then
                Application.EnableEvents = False
                    Range("D" & cell.Row).ClearContents
                Application.EnableEvents = True
            End If
        End If
    Next cell
End If

End Sub

【讨论】:

  • 要获得简洁的编码模式,您必须在 ClearContents 行之前设置 Application.EnableEvents=False 并将其设置回 True 并防止将事件处理程序调用为无限循环(尽管情况并非如此)
  • 您检查与 Col B 的相交,然后遍历整个目标范围:您应该只处理相交范围中的单元格。顺便说一句Range(Target.Address)Target 相同
  • @TimWilliams 如果我去掉Private SubEnd Sub 之间的所有内容,只执行Debug.Print Target,它会打印Target.Value,所以我觉得我需要获取地址。
  • 如果查看方法参数,Target 已经是Range 对象,因此无需进行任何转换即可从中获取范围。 Debug.Print Target 将输出 Target 的 默认属性,恰好是它的 ValueDebug.Print Target 将在多单元格范围上出错,因为 Value 是一个数组而不是单个值。
  • 谢谢各位。 DisplayName,我将在哪里将 Application.EnableEvents 设置回 true?更清晰的内容线?谢谢
【解决方案2】:

选择范围时,在这种情况下,您必须单独处理每个范围。循环目标中的范围并完成。

Private Sub Worksheet_Change(ByVal Target As Range)
    For Each cell In Target
        If Not Intersect(cell, Range("B:B")) Is Nothing Then
            If Application.WorksheetFunction.CountIf(Range("B118:B124"), cell) Then
                Range("D" & cell.Row).ClearContents
            End If
        End If
    Next
End Sub

【讨论】:

  • 嗨,里卡多,感谢您的回复。我有一百个需要此代码的单元格。没有更简单/更短的方法来解决这个问题吗?这将是一个相当长的代码。如果还有其他方法,我将非常感谢您的帮助。谢谢
  • 另外,我是 VBA 新手。你说的循环是什么意思?它是指一种快速更正代码的方法吗?
  • 没关系。刚刚复制了你的代码。效果很好。非常感谢!
  • 很高兴它成功了。抱歉没有按时回复您的问题,我在上班。编辑:强烈建议阅读一些关于 VBA For Loops 的内容,一旦你知道如何使用它们,你就会经常使用它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多