5

Я нашел макрос VBA, который автоматически печатает вложения Outlook. Правило запускает макрос.

Но для работы макроса нужна ссылка на 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

2 ответа2

9

Пожалуйста, ознакомьтесь с разделом "Раннее связывание VBA" и "Позднее связывание VBA". за преимущества и недостатки обоих методов.

Вы используете Earling Binding в этой строке: Set oFS = New FileSystemObject . "Новый" является хорошим показателем того, что используется Раннее связывание. Вот почему вы должны включить ссылку на каждую машину, на которой выполняется макрос.

Если вы используете Позднее связывание, вам не нужно включать ссылки. Макрос будет работать на каждой машине.

Вы можете конвертировать Раннее связывание

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

Повторите шаги для всех других проблемных переменных и замените их на их значение. Наконец, снимите отметку с ссылки на библиотеку, и ваш код будет запущен на каждом компьютере, включена ли библиотека или нет.

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

Приятно знать, что

  • Раннее связывание (явно проверенные ссылочные ссылки) полезно для разработки или отладки благодаря редактору 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .