我创建了一个加载项,可将工作表添加到工作簿并导入多个模块。然后,我希望外接程序运行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
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”,并将其从项目中删除。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句