vba - Excel 加载项从 ActiveWorkbook 调用子例程

标签 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

最佳答案

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

这种重新编译会立即自动发生,但无法从已经执行的代码中访问。您需要获取 Excel 才能重新输入 VBA 代码。

您可能可以使用 Application.Run,​​但如果您不需要 starter 作为阻塞调用(在您的示例代码中似乎就是这种情况),我可能会使用 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

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

关于vba - Excel 加载项从 ActiveWorkbook 调用子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975138/

相关文章:

vba - 在Excel VBA中搜索函数用法

vba - 在多个单元格中找到最大值并将该值复制到另一个单元格中

excel - 如何在 Excel VBA 中从艺术效果中重置图片

excel - 当用户在相邻单元格中输入信息时,自动填充单元格中的日期

excel - Applescript:写入没有旧文件名的新文件

excel - 如果使用 VBA 中的全局变量不满足条件,则停止过程

vba - 关闭 Outlook 提醒

php - 如何解决 "Allowed memory size exhausted"错误?

c# - HRESULT 异常 : 0x8002000B (DISP_E_BADINDEX) for System. Runtime.InteropServices.COMException

java - 内联内容配置