如何避免 VBA 中的引用(早期绑定与后期绑定)

如何避免 VBA 中的引用(早期绑定与后期绑定)

我发现了一个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

VBA 项目属性

  • 然后我使用如下所示的条件编译指令进行开发,并激活 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

相关内容