【问题标题】:VBA MsgBox causes an erroVBA MsgBox 导致错误
【发布时间】:2016-01-12 16:15:11
【问题描述】:

在我的 VBA 项目中,我偶尔会弹出 MsgBox 以通知用户在子例程运行后某些内容已“完成”或“更新”。 如果没有 MsgBox,它似乎运行良好,但插入一个似乎给我一个错误。 不确定是否有必要在此处显示整个代码,因为它非常大,但在子例程结束时我只想...

MsgBox ("Completed")

后面是End Sub

但是,当我运行它然后单击 Msgbox 上的 OK 时,我收到一个运行时错误,单击 DeBug 时,它会突出显示 End Sub。

有什么理由会引发这样的错误吗? 我错过了什么吗? 非常感谢

这里有一些代码

'Add unique data to new location
For i = 1 To UnqArray1.Count
 rCell(i, 1) = UnqArray1(i)
Next

'Move Split Array into a new array
Set rTable2 = rCell
rng2() = rTable2.Value

'Filter into unique items
On Error Resume Next
For Each b In rng2
UnqArray2.Add b, b
Next

'Clear location
rCell.Clear

'Add new array to location
For i = 1 To UnqArray2.Count
rCell(i, 1) = UnqArray2(i)
Next

'Find the end of the category list
lastrow = Worksheets("CatMatch").Range("Q100000").End(xlUp).Row

'Sort alphabetically
Worksheets("CatMatch").Range("Q1:Q" & lastrow).Sort key1:=Range("Q1"), order1:=xlAscending, Header:=xlNo

'Copy it to CatMatch
Worksheets("CatMatch").Range("Q1:Q" & lastrow).Copy Destination:=Worksheets("CatMatch").Range("B15")

MsgBox "Completed"

End Sub

【问题讨论】:

  • 这取决于消息框在代码中的位置。也许发布更多代码,这样我们就可以看到发生了什么!注意:将代码发布在您的原始问题中,而不是在评论中。也许最后 10 - 20 行代码就足够了??
  • 错误是什么
  • 它应该是MsgBox "Completed"(没有括号),因为您没有使用MsgBox 的返回值——尽管这并不能解释为什么您的代码会抛出错误。跨度>
  • 我试过不带括号。错误是“代码执行已中断”。当我单击 Debug 时,它会突出显示 End Sub。我在原始问题中添加了一些代码。谢谢大家的cmets。
  • 不用On Error Resume Next 试试。这条线应该很少使用。这使得调试非常困难。

标签: vba excel


【解决方案1】:

我无法重现您的错误,但您几乎可以肯定没有MsgBox 运行正常是不正确的。问题是您的代码问题被片段中的On Error Resume Next 隐藏了:

'Filter into unique items
On Error Resume Next
For Each b In rng2
UnqArray2.Add b, b
Next

两个cmets:

1) 如果您正在尝试使用RemoveDuplicates 方法,那为什么不使用呢?

2) 您的代码使用的事实是,如果您尝试添加重复键,集合会引发错误。这On Error Resume Next 的有效使用——但只有在您完成向集合添加键时将其关闭。比如:

On Error Resume Next
    For Each b In rng2
        UnqArray2.Add b, b
    Next
On Error GoTo 0

养成的一个好习惯是将On Error Resume NextOn Error GoTo 0 视为定义一个代码块,甚至可能像我上面所做的那样缩进代码块内的代码。一个更好的习惯是不要假设只会发生一种错误。上面的代码预计可能会出现错误457(这是与尝试添加重复键相对应的错误号 - 您需要搜索文档才能找到它,或者只是在没有错误处理的情况下运行代码并查看它是如何崩溃)。任何其他都表明存在其他问题。为了最大限度地保证安全,您可以执行以下操作:

On Error Resume Next
    For Each b In rng2
        UnqArray2.Add b, b
        If Err.Number > 0 And Err.Number <> 457 Then
            MsgBox "Unhandled error: " & Err.Number
            Exit Sub
        End If
    Next
On Error GoTo 0

这样做不会解决您的问题,但应该让您的实际问题更加明显。

【讨论】:

  • 感谢约翰的解释和提示。这完全有道理。添加了 On Error GoTo 0 似乎已经停止了错误弹出窗口,并且程序似乎正在正常工作。非常感谢。
  • @user3683463 我很高兴它有帮助,并且记住这个提示很重要——但我完全不知道它是如何修复错误的。您的代码似乎触发了 VBA 解释器本身的错误。如果它再次弹出(没有被On Error Resume Next 隐藏),您可以随时发布新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多