原因不明的Excel崩溃

时间:2016-11-09 11:42:31

标签: excel excel-vba crash vba

我正在从工作簿macroWb运行Excel VBA宏:

  1. 打开Excel工作簿wb(k);
  2. 将该工作簿中的部分单元格复制到macroWb;
  3. 在工作簿中macroWb执行一些相当基本的Excel命令(格式化,为单元格赋值等);
  4. 关闭wb(k);
  5. wb(k+1)重复1-4。
  6. 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
    

    有什么可能导致这种情况的想法吗?

3 个答案:

答案 0 :(得分:1)

它看起来像是一个时间竞争问题。在打开新文件之前使用 wait 与在使用调试器运行时在同一位置使用断点之间存在明显差异。我的猜测是断点不会停止关闭文件的子过程,而等待

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

我会尝试的是:

  1. 我假设问题与关闭和打开文件有关;问题不是由于打开的文件数量造成的(我过去曾在同一时间打开过20个excel文件),而是通过关闭和打开的过程;为了测试这个理论,我会禁用文件关闭部分并保持文件打开(我的回忆是你会在10个文件之上得到崩溃,所以它应该简单快速地测试);

  2. 如果“1”的结果是没有崩溃,我会搜索一个机制(事件?),一旦文件关闭过程完成就会被触发,并且只有然后尝试打开下一个文件;

  3. 如果“1”的结果是是崩溃 ...张贴代码的相关部分,我们会看看是否有任何可以建议的更改。

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

答案 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。

相关问题