VBA 在运行时崩溃,但在单步执行时工作

Posted

技术标签:

【中文标题】VBA 在运行时崩溃,但在单步执行时工作【英文标题】:VBA crashes when run, but works when stepped through 【发布时间】:2018-09-12 23:04:43 【问题描述】:

已回答,见下文。

我有一段代码可以打开一个文件,从打开的文件中复制日期,然后粘贴到另一个文件中。当我单步执行代码时,一切正常。当我运行代码时,它会重新启动excel。想法?

Sub copyPastefile()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim currwb, wb1, wb2, wb3, wb4, wb5 As Workbook
Set currwb= ThisWorkbook
Set wb1 = Workbooks.Open(Filename:="FileLocation\workbook1.xls")

  wb1.Sheets("Sheet1").Range("C9:c11").Copy
  ThisWorkbook.Sheets("wb1").Range("k18").PasteSpecial Paste:=xlPasteValues
  wb1.Sheets("Sheet1").Range("o22:w22").Copy
  ThisWorkbook.Sheets("wb1").Range("e35").PasteSpecial Paste:=xlPasteValues
  wb1.Sheets("Sheet1").Range("b38:I48").Copy
  ThisWorkbook.Sheets("wb1").Range("a5").PasteSpecial Paste:=xlPasteValues
  wb1.Close
  currwb.Sheets("wb1").Range("A1").Activate

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

ThisWorkbook.Activate
ThisWorkbook.Sheets("Sheet6").Activate
Range("A1").Activate
currwb.Save
MsgBox ("Done")

此代码随后针对 wb2、wb3 等重复,但现在粘贴到其各自的工作表中。

【问题讨论】:

您是否在脚本结束时将 Applicaiton.ScreenUpdating 重置为 True 并将 .Calculation 重置为 Automatic?这里是否缺少更多代码?在调试模式下,Application.ScreenUpdating 命令被忽略并保留为 True,因此这很可能解释了为什么它在调试逐步模式下“工作”。我敢打赌它在运行时会按照您的预期进行,您只是看不到更新的结果。 这听起来像是一场幽灵般的休息 - ***.com/questions/2154699/… 所有 wb 变量不被视为工作簿,它们被视为变体。唯一被认为是工作簿的是 wb5。您需要将每一个标识为工作簿。 dim currwb as workbook, wb1 as workbook, wb2 as workbook...等 你也有set wb1=,但稍后在代码中调用它workbook1.sheets( 这就是我尝试调整代码时得到的结果。修复了语法错误,我的脚本末尾已经有了 .Calc Automatic。对此深表歉意。 【参考方案1】:

我不同意上面的海报——这听起来不像是鬼休息。当您遇到 Excel 完全崩溃时,幽灵中断会无缘无故地让您进行调试(ala 使用暂停/中断键)。

我的理论: excel中的复制/粘贴功能是一个高度密集的过程。这对于孤立的复制/粘贴是可以的。对于您的代码,尤其是没有任何 Application.CutCopyMode = False 语句(并非所有由记录函数插入的看似无关的语句实际上都是无关的),您正在堆叠一堆副本而从未清除它们。然后应用程序耗尽内存并崩溃。

我的解决方案:

替换每一行-

workbook1.Sheets("Sheet1").Range("C9:c11").Copy
ThisWorkbook.Sheets("wb1").Range("k18").PasteSpecial Paste:=xlPasteValues

有了这样的东西-

ThisWorkbook.Sheets("wb1").Range("k18:k20").value = workbook1.Sheets("Sheet1").Range("C9:c11").value

您的代码将停止崩溃,并且运行得更快。

【讨论】:

这不是它崩溃的原因,工作簿变量不正确。 OP 使 wb1 和 workbook1 相同,但只设置了 wb1 @Davesexcel:如果相信 OP,代码在调试中工作但不正常。如果是语法错误,它不会在逐步执行中仍然失败吗?我认为 OP 遗漏了很多信息。 @Davesexcel 我不确定不同意我的解决方案是否是投反对票的适当理由。请重新考虑。我根据提供给我的所有信息提供了一个解决方案,而不是忽略大部分帖子并只关注代码。我还适当地将我的解决方案发布为解决方案,而不是作为评论。 谢谢你的上述。我可能也应该说它在早些时候工作并且崩溃是全新的。我通过将每个变量“变暗”作为工作簿来修复它,但是因为我无法接受它作为答案。这个必须要做.... 没问题,@JackArmstrong!感谢您接受这个答案——只是为了确保您的问题得到了解决,对吧?

以上是关于VBA 在运行时崩溃,但在单步执行时工作的主要内容,如果未能解决你的问题,请参考以下文章

VBA断点引入错误?

GetElementByID() VBA Excel 不工作

Flutter iOS 应用程序在从 ipa 文件启动时崩溃,但在从 xCode 运行时工作正常

使用 Qt 的程序,OpenCV 从 VS 启动时运行良好,但在使用 OpenCV 功能时运行可执行文件通常会崩溃

iOS 应用程序由 WatchDog 崩溃,但在从 Xcode 运行时工作

完成处理程序不返回任何内容,即使它看起来像在单步执行时