如何加载VBA库引用并在同一过程中使用它?

时间:2016-09-15 20:28:04

标签: vba excel-vba class late-binding vbide

我有一个Excel的VBA脚本,它在活动工作簿中添加了一个小程序。最终版本将添加一个自动保存工作簿备份副本的过程。

代码需要Microsoft Visual Basic for Applications Extensibility 5.3库,我可以手动添加,但我有兴趣使用一个脚本可以将该库添加到Excel中然后使用它。

以下是将库引用添加到Excel的代码。它有效。

On Error Resume Next    ' If library already referenced, ignore the error
    ThisWorkbook.VBProject.References.AddFromGuid _
        GUID:="{0002E157-0000-0000-C000-000000000046}", _
        Major:=5, Minor:=3
On Error GoTo 0         ' Resume normal error handling

下面是使用此库将VBA过程添加到活动工作簿的代码。它可以工作,但只有首先将所需的库引用添加到Excel:

Sub AddProcedureToModule()
' This script adds a sample VBA procedure to the active workbook

    ' Add Library Reference:  Microsoft Visual Basic for Applications
    '   Extensibility 5.3
    On Error Resume Next    ' If library already referenced, ignore the error
        ThisWorkbook.VBProject.References.AddFromGuid _
            GUID:="{0002E157-0000-0000-C000-000000000046}", _
            Major:=5, Minor:=3
    On Error GoTo 0         ' Resume normal error handling

    Dim VBProj As VBIDE.VBProject   ' requires Ref: MS VB for Apps Extensibility 5.3
    Dim VBComp As VBIDE.VBComponent ' requires Ref: MS...5.3
    Dim CodeMod As VBIDE.CodeModule ' requires Ref: MS...5.3

    Dim LineNum As Long
    Const DQUOTE = """" ' one " character

    Set VBProj = ActiveWorkbook.VBProject       ' requires Ref: MS...5.3
    Set VBComp = VBProj.VBComponents("Module1") ' requires Ref: MS...5.3
    Set CodeMod = VBComp.CodeModule             ' requires Ref: MS...5.3

    ' Insert code into workbook
    With CodeMod
        LineNum = .CountOfLines + 1
        .InsertLines LineNum, "Public Sub SayHello()"
        LineNum = LineNum + 1
        .InsertLines LineNum, "    MsgBox " & DQUOTE & "Hello World" & DQUOTE
        LineNum = LineNum + 1
        .InsertLines LineNum, "End Sub"
    End With
End Sub

当我尝试将两者合并在一个程序中时,问题就出现了。 Excel抛出编译错误“用户定义的类型未定义”。如果我理解正确,我的代码使用称为早期绑定的东西。 Excel在执行任何代码之前查找库,但无法找到它。

答案可能是调整我的代码以使用后期绑定,以便Excel在执行部分脚本并且库可用之前不会查找该库。

使用this post作为指南我修改了部分代码,如下所示:

Dim VBProj As Object
Dim VBComp As Object
Dim CodeMod As Object
Dim LineNum As Long
Const DQUOTE = """" ' one " character

Set VBProj = CreateObject("ActiveWorkbook.VBProject")
Set VBProj = ActiveWorkbook.VBProject
Set VBComp = CreateObject("VBProj.VBComponents(""Module1"")")
Set CodeMod = CreateObject("VBComp.CodeModule")

Excel抛出错误“运行时错误'429':ActiveX组件无法创建对象”。

我知道如何修改此代码以利用后期绑定,或以其他方式加载库引用并在同一过程/模块中运行其余代码?

1 个答案:

答案 0 :(得分:4)

原始代码中存在错误的前提:

Set VBProj = ActiveWorkbook.VBProject       ' requires Ref: MS...5.3
Set VBComp = VBProj.VBComponents("Module1") ' requires Ref: MS...5.3
Set CodeMod = VBComp.CodeModule             ' requires Ref: MS...5.3

此代码本身不需要任何引用。需要引用的是上面的变量声明:

Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent 
Dim CodeMod As VBIDE.CodeModule 

只要用As Object替换它们,就可以按原样运行其余代码,而无需添加引用。确保顶部有Option Explicit以捕获您可能正在使用的任何现在未声明的常量。

但是我会建议您考虑一种不同的方法,例如将要放入文件的代码移动到文件可以引用的添加内容中。自动将VBA代码添加到文件是一个安全问题,因为它是传播恶意软件的常见方式,它可能会设置防病毒,并且需要在用户界面中设置Trust access to the VBA project object model设置(我个人从未设置过) )。