![如何避免 VBA 中的引用(早期绑定与后期绑定)](https://linux22.com/image/1369271/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%20VBA%20%E4%B8%AD%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%97%A9%E6%9C%9F%E7%BB%91%E5%AE%9A%E4%B8%8E%E5%90%8E%E6%9C%9F%E7%BB%91%E5%AE%9A%EF%BC%89.png)
我发现了一个VBA 宏自动打印 Outlook 附件。规则会触发该宏。
但宏需要引用才能Microsoft Scripting Runtime
工作。我将代码保存在此 Outlook 会话当我通过以下方式引用库时,它工作正常工具»参考。
但每次打开程序时都需要添加引用。启动后宏存在,但引用不存在。我希望宏能够持续运行,而无需在系统启动时进行任何额外的点击。
Sub LSPrint(Item As Outlook.MailItem)
On Error GoTo OError
'detect Temp
Dim oFS As FileSystemObject
Dim sTempFolder As String
Set oFS = New FileSystemObject
'Temporary Folder Path
sTempFolder = oFS.GetSpecialFolder(TemporaryFolder)
'creates a special temp folder
cTmpFld = sTempFolder & "\OETMP" & Format(Now, "yyyymmddhhmmss")
MkDir (cTmpFld)
'save & print
Dim oAtt As Attachment
For Each oAtt In Item.Attachments
FileName = oAtt.FileName
FullFile = cTmpFld & "\" & FileName
'save attachment
oAtt.SaveAsFile (FullFile)
'prints attachment
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(0)
Set objFolderItem = objFolder.ParseName(FullFile)
objFolderItem.InvokeVerbEx ("print")
Next oAtt
'Cleanup
If Not oFS Is Nothing Then Set oFS = Nothing
If Not objFolder Is Nothing Then Set objFolder = Nothing
If Not objFolderItem Is Nothing Then Set objFolderItem = Nothing
If Not objShell Is Nothing Then Set objShell = Nothing
OError:
If Err <> 0 Then
MsgBox Err.Number & " - " & Err.Description
Err.Clear
End If
Exit Sub
End Sub
答案1
请查看“VBA 早期绑定”和“VBA 后期绑定”。了解两种方法的优缺点。
您在此行中使用了 Earling Binding:Set oFS = New FileSystemObject
。“New”很好地表明使用了 Early binding。这就是为什么您必须在运行宏的每台机器上启用引用。
如果您使用后期绑定,则无需启用引用。该宏可以在每台机器上运行。
您可以转换早期绑定
Dim oFS As FileSystemObject
Set oFS = New FileSystemObject
后期绑定
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
注意力:如果使用后期绑定,系统将无法识别命名变量的底层数值。您必须将这些命名变量转换为其对应的数值。
要获取数值,请暂时重新启用您的库(例如Microsoft 脚本运行时),转到 VBA 编辑器并打开立即窗口 ( CTRL+ G)。例如,?TemporaryFolder
在立即窗口中写入并按回车键。如您在屏幕截图中看到的,2
这是我们命名变量的值TemporaryFolder
对所有其他有问题的变量重复上述步骤,并用它们的值替换它们。最后取消勾选库引用,无论库是否启用,您的代码都会在每台机器上运行。
oFS.GetSpecialFolder(TemporaryFolder) 'with Early Binding
oFS.GetSpecialFolder(2) 'with Late Binding
答案2
很高兴知道,
- 由于 VBA 编辑器 Intellisense、强大的对象类型控制和命名常量,早期绑定(明确检查的引用链接)对于开发或调试非常有用。据报道,它也更快。
- 后期绑定(独立于参考链接)对于机器间兼容性很有用。
我利用早期/晚期绑定的快速切换优势。
- 我通过 VBA 编辑器在 VBA 项目属性中将条件编译参数设置为
EarlyBinding = 1
。
- 然后我使用如下所示的条件编译指令进行开发,并激活 EarlyBinding 分支。
- 当准备发布时,我切换到
EarlyBinding = 0
并且项目从早期到后期绑定进行最后的后期绑定测试。 - 编辑:不要忘记取消先前明确用于早期绑定的引用
对于FileSystemObject TemporaryFolder示例,可以说明如下:
Sub EarlyVsLateBindingtest()
#If Earlybinding Then
Dim oFS As Scripting.FileSystemObject
Set oFS = New Scripting.FileSystemObject
#Else
Const TemporaryFolder = 2
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
#End If
oFS.GetSpecialFolder (TemporaryFolder)
End Sub