如何成功将第2部分中的VBA模块中的错误代码传递给在第1部分中执行它的VBScript?
第1部分:在第2部分中执行VBA的VBScript
Option Explicit
Dim xlApp
Dim xlBook
If Err.Number <> 0 Then Err.Clear
Set xlApp = GetObject("","Excel.Application")
Set xlBook = xlApp.Workbooks.Open("\\(directory)\(File Name).xlsm", 0, True)
xlApp.Run "(Macro Name)"
If Err.Number <> 0 Then
Msgbox Err.Number & ": " & Err.Description & " The script will now quit."
WScript.Quit
Else
Msgbox Err.Number
End If
xlApp.Quit
第2部分:在第2部分中执行VBA的VBScript
Option Explicit
Sub (MacroName)()
'Snip - A bunch of working code
Err.Number = 7
Err.Description = "Made up error for testing - delete me"
End Sub
运行此脚本时,Err.Number在测试时为0,而Msgbox只显示0
。我需要做些什么才能让它显示7: Made up error for testing - delete me The script will now quit.
答案 0 :(得分:4)
IntelliSense没有显示,但Application.Run
是Function
,返回类型为Variant
,因此您可以拥有这样的宏:
Public Function Test() As Integer
Test = 42
End Function
然后调试/立即窗格将输出:
?Application.Run("test")
42
使(macro name)
函数返回错误编号,然后代替:
xlApp.Run "(Macro Name)"
你可以这样做:
Dim result
result = xlApp.Run("(Macro Name)")
然后检查result
的值,而不是Err.Number
的值。
现在,如果(macro name)
也应该被Excel称为作为宏,将其更改为Function
将使您的VBScript工作,并将打破Excel宏。
你可以做一个&#34;包装&#34;函数将宏公开为Sub
以供Excel使用,并从VBScript调用包装函数:
Function VBScriptMacroNameWrapper() As Integer
On Error Resume Next
' run macro sub here
VBScriptMacroNameWrapper = Err.Number
On Error GoTo 0
End Function