我有一个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组件无法创建对象”。
我知道如何修改此代码以利用后期绑定,或以其他方式加载库引用并在同一过程/模块中运行其余代码?
答案 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设置(我个人从未设置过) )。