我正在从工作簿macroWb
运行Excel VBA宏:
wb(k)
; macroWb
; macroWb
执行一些相当基本的Excel命令(格式化,为单元格赋值等); wb(k)
; wb(k+1)
重复1-4。让WBs = {wb(1),...,wb(n)}
,似乎当我向WBs
添加更多工作簿时,Excel最终会崩溃。但是,如果你在另一个时间运行宏,它不会再崩溃 - 例如昨天晚上,宏观正在崩溃,然后我今天早上和昨天一样WBs
运行它并且运行正常;然后我向WBs
添加了3个新工作簿,然后再次崩溃。
崩溃似乎与我测试的任何特定wb(k)
无关。
崩溃详情如下:
[...]
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
有什么可能导致这种情况的想法吗?
答案 0 :(得分:1)
它看起来像是一个时间竞争问题。在打开新文件之前使用 wait 与在使用调试器运行时在同一位置使用断点之间存在明显差异。我的猜测是断点不会停止关闭文件的子过程,而等待。
[如果你的WAIT与断点不在同一个位置,我建议你把它移到那里重试]
我会尝试的是:
我假设问题与关闭和打开文件有关;问题不是由于打开的文件数量造成的(我过去曾在同一时间打开过20个excel文件),而是通过关闭和打开的过程;为了测试这个理论,我会禁用文件关闭部分并保持文件打开(我的回忆是你会在10个文件之上得到崩溃,所以它应该简单快速地测试);
如果“1”的结果是没有崩溃,我会搜索一个机制(事件?),一旦文件关闭过程完成就会被触发,并且只有然后尝试打开下一个文件;
如果“1”的结果是是崩溃 ...张贴代码的相关部分,我们会看看是否有任何可以建议的更改。
这确实是一个有趣的案例!!!
答案 1 :(得分:0)
根据@FDavidov建议,我最终找到了一个(相当随机的)这个问题的解决方案,其中包括弹出一个消息框,该消息框在打开新文件之前的指定时间后自动关闭;令人惊讶的是,PopUp似乎甚至没有暂停程序,当PopUp打开时,PopUp执行行之后的行继续执行。
具体来说,PopUp代码 - 归功于@Orphid,请参阅以下thread中的答案 - 如下:
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
答案 2 :(得分:0)
我遇到了同样的问题,重复发生。事实证明问题与计算机中的错误RAM有关。其他计算机上没有出现同样的问题,我们现在正在更换有故障的RAM。