Workbook_Open()方法导致崩溃

时间:2015-04-16 16:34:31

标签: excel excel-vba vba

我有一个VBA的工作簿,分布在几个模块,类模块和用户表单模块上。工作簿保存为启用宏的Excel工作簿(* .xlsm),从Alt + F8宏对话框窗口启动Main方法时运行正常。在Alt + F11开发人员窗口中“踩”它时,代码也运行正常 - 尽管这个方法需要很长时间非常,因为总代码是数千行,有很多循环。< / p>

当我将以下代码添加到ThisWorkbook模块时,会出现问题。当我插入此代码时,Excel会在打开时立即崩溃。

Private Sub Workbook_Open()
    Main
End Sub

此处调用的Main方法是指模块MainModule中的子过程。它没有参数,必需或可选,所有必要的变量都在MainModule模块的Option Explicit模块下正确声明。

我需要宏在加载时运行,因为我计划设置一个计划的Windows任务,以便通过VBS文件定期运行它。这是怎么回事?为什么从Main()方法调用Workbook_Open()方法导致Excel崩溃,而手动运行Main()方法可以正常工作?

修改Main()方法的代码。

Public Sub Main()
    Dim allTickets As Collection
    Dim grpTickets As Collection
    Dim sa() As String
    Dim strConfig() As String
    Dim rptFp As String
    Dim i As Integer

    SetDefaults

    If DEV_ENABLED Then
        Application.WindowState = xlNormal
        If MsgBox( _
            Prompt:="Run reporting script?", _
            Buttons:=vbYesNo _
        ) = vbNo Then Terminate
        Application.WindowState = xlMinimized
    End If

    MainForm.Show vbModeless
    EnsureCfgPath
    LoadConfig

    ' Check for valid config in memory.
    On Error Resume Next
    If Len(config(0)) = 0 Then
        MsgBox "Could not validate or create config file. Please contact support for assistance."
        Terminate
    ElseIf Err.Number <> 0 Then
        On Error GoTo 0
        MsgBox "Could not validate or create config file. Please contact support for assistance."
        Terminate
    End If
    On Error GoTo 0

    ' Import tickets from BA files.
    Set allTickets = ImportBAData(config(1))

    ' Create report(s) identified by config file.
    ReDim strConfig(7)
    For i = 0 To Ubound(config) Step 8
        On Error Resume Next
        strConfig(0) = config(i)
        strConfig(1) = config(i + 1)
        strConfig(2) = config(i + 2)
        strConfig(3) = config(i + 3)
        strConfig(4) = config(i + 4)
        strConfig(5) = config(i + 5)
        strConfig(6) = config(i + 6)
        strConfig(7) = config(i + 7)
        If Err.Number <> 0 Then
            Logger "[MainModule:Main] Config file contains too few options. Adopting ""END"" command option."
            strConfig(7) = "!~END//~!"
        End If
        On Error GoTo 0
        sa = Split(strConfig(5), ",")
        Set grpTickets = FilterTickets(allTickets, strConfig(4), sa)
        ' Create report.
        rptFp = CreateReport(configs:=strConfig, Tickets:=grpTickets)
        ' Send report.
        If Not rptFp = ".xlsx" Then SendReport FilePath:=rptFp, Recipients:=strConfig(6)
        If strConfig(7) = "!~END//~!" Then
            Exit For
        ElseIf Not strConfig(7) = "!~FOLLOW//~!" Then
            Logger "[MainModule:Main] Illegal config option """ & strConfig(7) & """ passed. Terminating process."
            Exit For
        End If
    Next i

    MainForm.SetStatus("Cleaning up...")
    Terminate
End Sub

编辑2:非常,非常奇数分辨率。

无论我在Exit Sub中放置Main语句,Excel都会立即崩溃。所以,我在Main中注释了除Exit Sub语句之外的所有内容,然后保存并关闭。接下来,我打开了工作簿,它没有崩溃 - 它执行Exit Sub语句就好了。因此,我删除了Exit Sub语句,并取消注释Main中的代码,现在它可以正常工作。

我正在将这个问题归咎于微软的质量保证。

1 个答案:

答案 0 :(得分:0)

当我设置以下代码进行测试时,我没有错误。

在module1中:

Option Explicit

Public Function Main()
  MsgBox "Hello World"
End Function

在Workbooks_Open中:

Private Sub Workbook_Open()
  Main
End Sub

测试此项,如果它在保存的XLSM文件中不起作用,那么问题可能是Excel的配置方式。 (例如,检查可信设置,允许VBA ......)