不明原因的Excel崩溃
我正在从工作簿macroWb
运行Excel VBAmacros,其中:
- 打开Excel工作簿
wb(k)
; - 将该工作簿中的某些单元格复制到
macroWb
; - 在工作簿
macroWb
执行一些相当基本的Excel命令(格式化,赋值给单元格等); - closures
wb(k)
; - 为
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议你把它移到那里然后重试]
我会尝试的是:
-
我假设这个问题与文件的closures和打开有关; 这个问题不是由打开的文件数量引起的(我以前也可能有20个excel文件同时打开),而是通过closures和打开的过程造成的; 为了testing这个理论,我将禁用文件closures部分,并保持打开文件(我记得你会得到10个文件以上的崩溃,所以它应该是容易和快速testing);
-
如果“1”的结果没有崩溃 ,我会search一个机制(事件?),只要文件closures进程完成,就会被触发,然后尝试打开下一个文件;
-
如果“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