Excel加载项从ActiveWorkbook调用子例程

时间:2014-01-07 15:12:10

标签: vba excel-vba excel

我创建了一个加载项,它将工作表添加到工作簿并导入多个模块。然后我想让加载项运行现在在Active Workbook中的子例程。这是我到目前为止,我得到运行时错误'438':对象不支持此属性或方法。

正确的语法是什么(如果它甚至可以完成)。感谢。

' Class name is EventClassModule
Public WithEvents App As Application
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
    If Wb.Name = "Just To Test.xls" Then
        Wb.Sheets.Add Type:="C:\TestGLPage.xls"
    fname = Dir("C:\Users\Me\Desktop\BAS\*.*", vbNormal)
    While fname <> ""
       If Right(fname, 3) = "frm" Or Right(fname, 3) = "bas" Or Right(fname, 3) = "cls" Then
       ActiveWorkbook.VBProject.VBComponents.Import "C:\Users\Me\Desktop\BAS\" & fname
       End If
       fname = Dir()  'get the next file
    Wend
    Call Application.Workbooks("Just To Test.xls").starter
    End If
End Sub

1 个答案:

答案 0 :(得分:1)

VBA 是一种动态语言。在运行时更改代码或代码对象的名称时,VBA必须重新编译这些模块才能访问更改。在您进行此类更改后,您可能会发现断点无法正常工作。

此重新编译会自动立即发生,但无法从已执行的代码中访问。您需要让Excel重新输入VBA代码。

你可以使用Application.Run,​​但如果你不需要启动器作为阻塞调用,我可能会使用Application.OnTime更安全(在你的示例代码中似乎是这种情况) )。

为了清楚起见,在使用Application.Run或Application.OnTime调用子例程时,您无法使用模块名称对其进行限定。但是,您可以使用bang语法使用工作簿的名称对其进行限定。例如。 Application.Run "Book1.xlsx!SubNameToBeCalled"

实施例

我创建了一个空白工作簿 我创建了两个模块

进口

Public Sub RunMe()
    MsgBox "Test!"
End Sub

主要

Public Sub Run()
  ActiveWorkbook.VBProject.VBComponents.Import "C:\Temp\Imported.bas"
  ' Showing how to do it with Run
  Application.Run ThisWorkbook.Name & "!RunMe"
  ' Showing the safer way with OnTime
  Application.OnTime Now, ThisWorkbook.Name & "!RunMe"
End Sub

然后我将“已导入”模块导出到“C:\ Temp \ Imported.bas”并将其从项目中删除。