将错误代码从VBA模块传递给执行它的VBScript

时间:2016-04-26 15:17:11

标签: excel-vba vbscript vba excel

如何成功将第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.

1 个答案:

答案 0 :(得分:4)

IntelliSense没有显示,但Application.RunFunction,返回类型为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