Cara menghindari referensi di VBA (Binding Awal vs. Binding Akhir)

5

Saya menemukan makro VBA yang mencetak lampiran Outlook secara otomatis. Aturan memicu makro.

Tetapi makro perlu referensi Microsoft Scripting Runtimeuntuk bekerja. Saya menyimpan kode di ThisOutlookSession dan berfungsi dengan baik ketika saya mereferensikan perpustakaan melalui Tools »Referensi.

Tetapi referensi perlu ditambahkan setiap kali program dibuka. Makro ada di sana setelah startup, tetapi referensi tidak. Saya ingin makro berjalan terus menerus tanpa perlu klik tambahan apa pun saat startup sistem.

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

Jawaban:

9

Silakan lihat "VBA Early Binding" dan "VBA Late Binding". untuk kelebihan dan kekurangan dari kedua metode.

Anda menggunakan Earling Binding di baris ini: Set oFS = New FileSystemObject. "Baru" adalah indikator yang baik bahwa Penjilidan awal digunakan. Itu sebabnya Anda harus mengaktifkan referensi di setiap mesin tempat makro berjalan.

Jika Anda menggunakan Late Binding, Anda tidak perlu mengaktifkan referensi. Makro akan bekerja pada setiap mesin.

masukkan deskripsi gambar di sini

Anda dapat mengonversi Pengikatan Dini

Dim oFS  As FileSystemObject 
Set oFS = New FileSystemObject

ke Binding Terlambat

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

Perhatian: Jika Anda menggunakan Late Binding, nilai numerik yang mendasari variabel bernama tidak diketahui sistem. Anda harus mengonversi variabel-variabel yang disebutkan ke nilai numerik yang sesuai.

Untuk mendapatkan nilai numerik, aktifkan kembali perpustakaan Anda untuk sementara (mis. Microsoft Scripting Runtime ), buka editor VBA dan buka jendela langsung ( CTRL+ G). Tulis misalnya ?TemporaryFolderke jendela langsung dan tekan enter. Seperti yang Anda lihat di tangkapan layar 2adalah nilai dari variabel bernama kamiTemporaryFolder

masukkan deskripsi gambar di sini

Ulangi langkah-langkah untuk semua variabel bermasalah lainnya dan ganti dengan nilainya. Terakhir, hapus centang referensi perpustakaan dan kode Anda berjalan di setiap mesin apakah perpustakaan diaktifkan atau tidak.

oFS.GetSpecialFolder(TemporaryFolder)   'with Early Binding
oFS.GetSpecialFolder(2)                 'with Late Binding
nixda
sumber
Saya mendapatkan "75 - Path / File access error" setelah mengganti baris ...
Michał Masny
Program berhenti setelah saya menekan F8 dengan "MkDir (cTmpFld)" disorot
Michał Masny
Kesalahan saya, saya melewatkan variabel bernama itu TemporaryFolder. Lihat edit saya untuk penjelasan.
nixda
Apakah nilai numeriknya akan sama setiap kali saya menjalankan makro? Sangat penting bagi makro untuk bekerja tanpa waktu perantara.
Michał Masny
Ya, tentu saja.
nixda
5

Adalah baik untuk mengetahui hal itu

  • Binding Awal (Tautan Referensi yang diperiksa secara eksplisit) berguna untuk pengembangan atau debugging, karena editor VBA Intellisense, kontrol tipe objek yang kuat, dan konstanta bernama. Ini juga dilaporkan lebih cepat.
  • Binding Terlambat (independen pada tautan Referensi) berguna untuk kompatibilitas antar-mesin.

Saya menggunakan dengan cepat, beralih cepat dari ikatan Awal / Terlambat.

  • Saya atur oleh VBA Editor di VBA Project untuk mengajukan argumen kompilasi bersyarat EarlyBinding = 1.

Properti Proyek VBA

  • Saya menggunakan kemudian untuk pengembangan arahan kompilasi bersyarat seperti di bawah ini, dengan cabang EarlyBinding aktif.
  • Ketika siap untuk rilis, saya beralih ke EarlyBinding = 0dan proyek beralih Dari Awal ke Akhir Mengikat untuk pengujian akhir Akhir mengikat.
  • Sunting: Jangan lupa untuk membatalkan Referensi yang sebelumnya secara eksplisit digunakan untuk Pengikatan Dini

Untuk contoh TemporaryFolder FileSystemObject, dapat diilustrasikan sebagai:

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
Poutnik
sumber
Dalam hal ini, jangan malu-malu ... LEBIH BANYAK, tolong. ;-)
Steve Rindsberg