VBA 在 运行 时崩溃,但在单步执行时有效

VBA crashes when run, but works when stepped through

已回答,见下文。

我有一段代码可以打开一个文件,从打开的文件复制日期,然后粘贴到另一个文件。当我单步执行代码时,一切正常。当我 运行 通过代码时,它会重新启动 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 等,但现在粘贴到其各自的 sheet。

我不同意上面的海报——这听起来不像是鬼破。当你遇到 Excel.

的完全崩溃时,一个 ghost break 会无缘无故地让你调试(ala 使用 pause/break 键)

我的理论: excel中的copy/paste函数是一个高度密集的过程。这对于孤立的 copy/pastes 是可以的。对于您的代码,尤其是没有任何 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

您的代码将不再崩溃,而且 运行 更快。