不明原因的Excel崩溃

我正在从工作簿macroWb运行Excel VBAmacros,其中:

  1. 打开Excel工作簿wb(k) ;
  2. 将该工作簿中的某些单元格复制到macroWb ;
  3. 在工作簿macroWb执行一些相当基本的Excel命令(格式化,赋值给单元格等);
  4. closureswb(k) ;
  5. wb(k+1)重复1-4。

WBs = {wb(1),...,wb(n)} ,似乎当我向WBs添加更多的工作簿时,Excel最终会崩溃。 但是,如果你在另一个时间运行macros,它不会再崩溃 – 例如昨天晚上macros观崩溃,那么我今天早上用同样的WBs运行它,它的工作正常, 然后,我给WBs添加了3个新的工作簿,并再次崩溃。

这个崩溃似乎与任何特定的wb(k)没有关系,因为我已经testing过了。

崩溃的细节如下:

 [...] Fault Module Name: StackHash_f2b6 Fault Module Version: 0.0.0.0 [...] Exception Code: c000041d Exception Offset: 74384f69 [...] Additional Information 1: f2b6 Additional Information 2: f2b6a6f8ea78ee3ad1bda3596b78feb6 Additional Information 3: 7b01 Additional Information 4: 7b010e90eab9e4895f15c0f6ba536eb5 

任何想法可能导致这个?

这看起来很像时间竞争问题。 在打开一个新文件之前有一个明显的区别,当使用debugging器运行时,在同一个位置有一个断点。 我的猜测是,断点不会暂停closures文件的subprocess,而等待

[如果你的WAIT不在断点的同一位置,我build议你把它移到那里然后重试]

我会尝试的是:

  1. 我假设这个问题与文件的closures和打开有关; 这个问题不是由打开的文件数量引起的(我以前也可能有20个excel文件同时打开),而是通过closures和打开的过程造成的; 为了testing这个理论,我将禁用文件closures部分,并保持打开文件(我记得你会得到10个文件以上的崩溃,所以它应该是容易和快速testing);

  2. 如果“1”的结果没有崩溃 ,我会search一个机制(事件?),只要文件closures进程完成,就会被触发,然后尝试打开下一个文件;

  3. 如果“1”的结果是肯定的崩溃 …发布你的代码的相关部分,我们将看看是否有任何可以build议的变化。

这确实是一个有趣的案例!

在@FDavidovbuild议之后,我最终find了一个(相当随机的)解决scheme,这个解决scheme包括popup一个消息框,在打开一个新文件之前的指定时间后自动closures; 令人惊讶的是,PopUp甚至不会暂停程序,PopUp执行行之后的行会在PopUp打开时继续执行。

具体来说,PopUp代码 – @Orphid的信用,看到他的答案在下面的线程 – 是:

 Sub subClosingPopUp(PauseTime As Integer, Message As String, Title As String) Dim WScriptShell As Object Dim ConfigString As String Set WScriptShell = CreateObject("WScript.Shell") ConfigString = "mshta.exe vbscript:close(CreateObject(""WScript.Shell"")." & _ "Popup(""" & Message & """," & PauseTime & ",""" & Title & """))" WScriptShell.Run ConfigString End Sub 

最终的结果是:

 Sub Main() Dim PauseTime as Integer Dim Message as String Dim Title as String Dim wbk as String Dim wb as Workbook 'Code PauseTime = ... Message = ... Title = ... 'Code For k = 1 to n '[Code] wbk = ... Call subClosingPopUp(PauseTime, Message, Title) Set wb = Workbooks.Open(wbk) '[Code] Next k 'Code End Sub