我有一个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
中的代码,现在它可以正常工作。
我正在将这个问题归咎于微软的质量保证。
答案 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 ......)