Como evitar referências no VBA (vinculação antecipada versus vinculação tardia)

5

Eu encontrei uma macro VBA que imprime os anexos do Outlook automaticamente. Uma regra aciona a macro.

Mas a macro precisa de uma referência a Microsoft Scripting Runtime para funcionar. Salvei o código em ThisOutlookSession e ele funciona bem quando faço referência à biblioteca por meio de Ferramentas »Referências.

Mas a referência precisa ser adicionada toda vez que o programa é aberto. A macro está lá após a inicialização, mas a referência não é. Gostaria que a macro fosse executada continuamente sem a necessidade de cliques adicionais na inicialização do sistema.

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
    
por Michał Masny 04.07.2013 / 11:23

2 respostas

9

Por favor, dê uma olhada em "VBA Early Binding" e "VBA Late Binding". para vantagens e desvantagens de ambos os métodos.

Você está usando o Earling Binding nesta linha: Set oFS = New FileSystemObject . "Novo" é um bom indicador de que a vinculação antecipada é usada. É por isso que você precisa ativar uma referência em todas as máquinas onde a macro é executada.

Se você usa Late Binding, não é necessário habilitar referências. A macro funcionaria em todas as máquinas.

Vocêpodeconvertervinculaçãoantecipada

DimoFSAsFileSystemObjectSetoFS=NewFileSystemObject

paraligaçãotardia

DimoFSAsObjectSetoFS=CreateObject("Scripting.FileSystemObject")

Atenção: Se você usar Late Binding, valores numéricos subjacentes de variáveis nomeadas são desconhecidos para o sistema. Você precisa converter essas variáveis nomeadas em seu valor numérico correspondente.

Para obter o valor numérico, reative temporariamente sua biblioteca (por exemplo, Microsoft Scripting Runtime ), vá até o editor do VBA e abra a janela imediata ( CTRL + < kbd> G ). Escreva por exemplo ?TemporaryFolder na janela imediata e pressione enter. Como você pode ver na captura de tela 2 é o valor da nossa variável denominada TemporaryFolder

Repita as etapas para todas as outras variáveis problemáticas e substitua-as por seus valores. Por fim, desmarque a referência da biblioteca e seu código está sendo executado em todas as máquinas, independentemente de a biblioteca estar ativada ou não.

oFS.GetSpecialFolder(TemporaryFolder)   'with Early Binding
oFS.GetSpecialFolder(2)                 'with Late Binding
    
por 04.07.2013 / 11:43
3

É bom saber que

  • Early Binding (Links de referência marcados explicitamente) é útil para o desenvolvimento ou depuração, devido ao Intellisense do editor de VBA, ao controle de tipo de objeto strong e às constantes nomeadas. Também é supostamente mais rápido.
  • Ligação tardia (independente em links de referência) é útil para compatibilidade entre máquinas.

Eu uso com vantagem a troca rápida de ligação adiantada / atrasada.

  • Eu configurei pelo Editor VBA nas propriedades do Projeto VBA os argumentos de compilação condicional para EarlyBinding = 1 .

  • Euusoentãoparaodesenvolvimentoasdiretivasdecompilaçãocondicionalcomoabaixo,comramificaçãoEarlyBindingativa.
  • Quandoestiverprontoparaolançamento,mudoparaEarlyBinding=0eoprojetotransformaavinculaçãoantecipadaparaavinculaçãofinalparaotestedevinculaçãofinalfinal.
  • Editar:nãoseesqueçadecancelarasreferênciasusadasanteriormenteexplicitamenteparaavinculaçãoantecipada

ParaoexemploFileSystemObjectTemporaryFolder,podeserilustradocomo:

SubEarlyVsLateBindingtest()#IfEarlybindingThenDimoFSAsScripting.FileSystemObjectSetoFS=NewScripting.FileSystemObject#ElseConstTemporaryFolder=2DimoFSAsObjectSetoFS=CreateObject("Scripting.FileSystemObject")
#End If

oFS.GetSpecialFolder (TemporaryFolder)

End Sub
    
por 25.10.2017 / 17:40