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

Mic*_*sny 7 windows-7 microsoft-outlook-2007 vba

我找到了一个自动打印 Outlook 附件的VBA 宏。规则触发宏。

但是宏需要引用Microsoft Scripting Runtime才能工作。我将代码保存在ThisOutlookSession 中,当我通过工具»引用引用库时,它工作正常

但是每次打开程序时都需要添加引用。启动后宏在那里,但引用不在。我希望宏能够连续运行,而无需在系统启动时进行任何额外的点击。

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
Run Code Online (Sandbox Code Playgroud)

nix*_*xda 11

请查看“VBA 早期绑定”和“VBA 后期绑定”。两种方法的优缺点。

您正在使用Earling在这一行绑定:Set oFS = New FileSystemObject。“新”是使用早期绑定的一个很好的指标。这就是为什么您必须在运行宏的每台机器上启用引用。

如果您使用后期绑定,则不必启用引用。该宏适用于每台机器。

在此处输入图片说明

您可以转换早期绑定

Dim oFS  As FileSystemObject 
Set oFS = New FileSystemObject
Run Code Online (Sandbox Code Playgroud)

后期绑定

Dim oFS  As Object 
Set oFS = CreateObject("Scripting.FileSystemObject")
Run Code Online (Sandbox Code Playgroud)

注意:如果您使用后期绑定,则系统不知道命名变量的基础数值。您必须将这些命名变量转换为其相应的数值。

要获得数值,请暂时重新启用您的库(例如Microsoft Scripting Runtime),转到 VBA 编辑器并打开即时窗口 ( CTRL+ G)。例如,?TemporaryFolder写入即时窗口并按回车键。正如你在截图中看到的2是我们命名变量的值TemporaryFolder

在此处输入图片说明

对所有其他有问题的变量重复这些步骤,并用它们的值替换它们。最后取消库引用,无论该库是否启用,您的代码都会在每台机器上运行。

oFS.GetSpecialFolder(TemporaryFolder)   'with Early Binding
oFS.GetSpecialFolder(2)                 'with Late Binding
Run Code Online (Sandbox Code Playgroud)


Pou*_*nik 6

很高兴知道,

  • 早期绑定(显式检查参考链接)对于开发或调试很有用,因为 VBA 编辑器智能感知、强大的对象类型控制和命名常量。据报道,它也更快。
  • 后期绑定(独立于参考链接)对于机器间兼容性很有用。

我有利地使用了早期/晚期绑定的快速切换。

  • 我通过 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
Run Code Online (Sandbox Code Playgroud)