web-dev-qa-db-ja.com

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
5
Michał Masny

両方の方法の長所と短所については、 "VBA早期バインディング"と "VBA遅延バインディング"。 をご覧ください。

次の行でイアリングバインディングを使用しています:Set oFS = New FileSystemObject。 「新規」は、早期バインディングが使用されていることを示す良い指標です。そのため、マクロが実行されるすべてのマシンで参照を有効にする必要があります。

遅延バインディングを使用する場合、参照を有効にする必要はありません。マクロはすべてのマシンで機能します。

enter image description here

アーリーバインディングを変換できます

Dim oFS  As FileSystemObject 
Set oFS = New FileSystemObject

遅延バインディングへ

Dim oFS  As Object 
Set oFS = CreateObject("Scripting.FileSystemObject")

注意:遅延バインディングを使用する場合、名前付き変数の基になる数値はシステムに認識されません。これらの名前付き変数を対応する数値に変換する必要があります。

数値を取得するには、ライブラリを一時的に再度有効にし(例:Microsoft Scripting Runtime)、VBAエディターに移動してイミディエイトウィンドウを開きます(CTRL+G)。たとえば?TemporaryFolderを直接ウィンドウに表示し、Enterキーを押します。スクリーンショットにあるように2は、名前付き変数TemporaryFolderの値です。

enter image description here

他のすべての問題のある変数について手順を繰り返し、それらをそれらの値に置き換えます。最後に、ライブラリ参照のチェックを外すと、ライブラリが有効かどうかに関係なく、すべてのマシンでコードが実行されます。

oFS.GetSpecialFolder(TemporaryFolder)   'with Early Binding
oFS.GetSpecialFolder(2)                 'with Late Binding
9
nixda

知っておくと良いです

  • アーリーバインディング(明示的にチェックされた参照リンク)は、VBAエディターのIntellisense、強力なオブジェクトタイプ制御、および名前付き定数があるため、開発またはデバッグに役立ちます。伝えられるところによると、より高速です。
  • 遅延バインディング(参照リンクに依存しない)は、マシン間の互換性に役立ちます。

アーリー/レイトバインディングの高速切り替えを有利に使用します。

  • VBAプロジェクトのプロパティでVBAエディターによって、条件付きコンパイル引数をEarlyBinding = 1に設定しました。

VBA Project properties

  • 次に、アクティブな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
5
Poutnik