VBA Advanced - Compreendendo o Early Binding e o Late Binding - Early Binding & Late Binding



Blog Office VBA | Blog Excel | Blog Access |

Sim, o desenvolvimento da linguagem VBA nos permite abordagens distintas. E é bom que isso ocorra, pois nos possibilita variância, adequação, e certa liberdade na escolha do caminho que percorreremos em busca de uma solução plausível para o nosso cliente.

Falaremos sobre 2 métodos de programação que dizem respeito ao uso de objetos no VBA, os quais são definidos na fase de declaração das variáveis:


Early Binding (Ligação Atual)  
No método Early Binding as variáveis são declaradas com o tipo de dados assumirão antes de serem invocadas.

Late Binding (Ligação Tardia)
No método Late Binding as variáveis são declaradas como objeto e assumem seu tipo na primeira vez que uma atribuição é feita ao mesmo.


Suponhamos que fôssemos automatizar uma aplicação MS Outlook a partir do MS Excel:
Primeiramente precisamos ter acesso ao Modelo de Objetos (object model) do Outlook.

Segundo, para manipularmos um objeto do Outlook, precisamos vê-lo e isso só é possível através de 2 métodos, isso mesmo, conhecendo os métodos Early Binding e Late Binding.

Para "encapsularmos" o Outlook (Client) na nossa aplicação Excel (Host). O OB (Object model) armazenado no arquivo OLB (Object Library) precisa estar vinculado ao Excel.

CheckBinding
Podemos fazer isso através do menu Ferramentas no VBE, especificamente em Referências. A caixa de diálogo Referências será mostrada com uma lista de arquivos com os quais podemos nos ligar. É provável que a lista seja bastante longa e cheia de opções que você nunca vai usar.

Inline image 2

A ligação (bindingOLB é chamada ligação inicial (early binding). É early (cedo) porque expomos o modelo de objeto durante o momento do design e não no tempo de execução. 

No exemplo acima pode observar a versão do Microsoft Outlook 9.0 Object Library. A parte 9.0 do nome será diferente se você estiver usando uma versão diferente do Outlook. Incidentalmente, o nome do arquivo OLB que aloja esta biblioteca é msoutl9.olb. Você pode ver o caminho onde ele é armazenado na parte inferior da caixa de diálogo.

Apenas selecionar uma referência nesta caixa diálogo não fará absolutamente nada. Algumas vezes simplesmente seleciono a referência e fecho a caixa de diálogo apenas para encontrar o erro de compilação: Tipo definido pelo usuário não definido (User Defined Type not Defined). Quando você receber esse erro, a primeira coisa que deve verificar é que tenha definido a referência corretamente.

Uma vez que tenha passado por este processo, pode criar um procedimento como este:

Sub CheckBinding()

    Dim olApp As Outlook.Application

    Set olApp = New Outlook.Application

    MsgBox olApp.Name

End Sub

A ligação (binding) tardia (Late) tem o mesmo efeito que o Early Binding. A diferença é que você efetua a ligação da biblioteca em tempo de execução (run-time). Não precisa usar as Referências previamente, mas sim as funções GetObject ou CreateObject. O código abaixo faz a mesma coisa que o CheckBinding acima, mas usa o Late Binding.

Sub CheckBindingLB()

    Dim olApp As Object

    Set olApp = CreateObject("Outlook.Application")

    MsgBox olApp.Name

End Sub

Na maioria dos exemplos que usamos aqui o CreateObject será muito útil. É usado quando precisamos criar uma nova instância do Outlook e usamos o GetObject se quisermos fazer referência a uma instância já em execução do Outlook.

Para enviarmos um e-mail, criarmos uma tarefa, ou diversas outras atividades, não importa se usamos uma instância nova ou existente. Usaríamos o GetObject se desejássemos mostrar algo no Outlook, por exemplo, um calendário. Nesse caso, não iríamos querer dois Outlooks executando só para exibir um calendário.

O código a seguir usa Late Binding para exibir a pasta do calendário na instância existente do Outlook, criando uma instância, se não houver uma.

Sub DisplayCalendar()

    Dim olApp As Object
    Dim olNs As Object

    On Error Resume Next
    Set olApp = GetObject(, "Outlook.Application")

    If Err.Number = 429 Then
        Set olApp = CreateObject("Outlook.application")
    End If

    On Error GoTo 0

    Set olNs = olApp.GetNamespace("MAPI")

    If olApp.ActiveExplorer Is Nothing Then
        olApp.Explorers.Add _
            (olNs.GetDefaultFolder(9), 0).Activate
    Else
        Set olApp.ActiveExplorer.CurrentFolder = _
            olNs.GetDefaultFolder(9)
        olApp.ActiveExplorer.Display
    End If

    Set olNs = Nothing
    Set olApp = Nothing

End Sub

Detalhando

Talvez para os que estão iniciando no VBA exista muita coisa acontecendo no código acima. E saiam já daqui! Não viram que o tópico é Advanced? Brincadeiras à parte, vamos olhar para as seções pertinentes uma de cada vez:

 Dim olApp As Object
 Dim olNs As Object

Na seção de declarações de variáveis usamos o tipo de dados Object. Com a Early Binding usamos Outlook.Application para dimensionar (Dim) a variável "olApp". Mas, sem um conjunto de referência, o VBA não saberá o que significa Outlook.Application porque ainda não expusemos o modelo de objeto. Portanto, quaisquer objetos que utilizarmos a partir do modelo de objeto do Outlook, devem ser declarados com o tipo genérico Object.

On Error Resume Next

Set olApp = GetObject(, "Outlook.Application")

If Err.Number = 429 Then
   Set olApp = CreateObject("Outlook.application")
End If

On Error GoTo 0

A função GetObject gerará um erro se não houver uma instância do Outlook, por isso usamos On Error Resume Next para ignorá-lo. Em seguida, testamos um erro específica, o qual se tiver ocorrido usaremos CreateObject. Redefiniremos o tratamento de erros com On Error GoTo 0, de modo a não disfarçarmos quaisquer erros no final do procedimento.

Porquê 2 métodos?

Ambos os métodos têm vantagens e desvantagens. A Late Binding é mais lenta do que a Early Binding porque ocorre durante o tempo de execução. Quando fazemos o trabalho durante o design, o código será executado mais rapidamente. Quando você está escrevendo o código usando a Late Binding, perde algumas conveniências. Mais especificamente, não ver o Intellisense mostrando as propriedades e métodos de objetos quando os digita. Além disso, o navegador de objetos (F2) não apresenta nenhum dos objetos do Outlook. E por fim, não terá a vantagem de usar constantes internas na Late Binding. Veja o código abaixo:

olNs.GetDefaultFolder (9)

O código ficaria assim numa ligação prévia:

olNs.GetDefaultFolder (olFolderCalendar)

olFolderCalendar é definido numa constante dentro do modelo de objeto do Outlook que não será exposto, se você não tiver definido uma referência. Embutidos constantes podem tornar o código muito mais legível e mais fácil de depurar.

Tudo parece fazer muito sentido e ser muito bom para a Early Binding, mas a Late Binding tem uma vantagem muito grande que não pode ser negligenciada. Ao se efetuar a Late Binding, não importa qual seja a versão do Outlook instalada, o VBA vai usar o nome da classe fornecido com GetObject ou o CreateObect ("Outlook.Application" no nosso caso) e encontrará o modelo de objeto correto para referência.

Ao discutir a Early Binding acima, vai notar que definir uma referência ao Microsoft Outlook 9.0 Object Library porque eu estou usando o Outlook 2000. Se fosse enviar um procedimento para alguém que estava usando uma versão anterior do Outlook, o código seria um fracasso, porque não teriam essa biblioteca objeto específica instalada. 

Para tirar o máximo proveito do ambiente de desenvolvimento VBA e ainda escrever um código robusto, devemos escrever o código com Early Binding, mas mudá-lo no final, antes de distribuí-lo. Mesmo que escreva apenas para uso pessoal, não faz sentido não convertê-lo no final. Algum dia terá um computador diferente ou enviará este código para o seu irmão e não vai funcionar porque eles vão ter uma versão anterior.


Referências:
Dick´s Clickshttp://www.dicks-clicks.com




Tags: VBA, Advanced, Early Binding, Late Binding, OLB, Object Library, MS Outlook,  Object Model, Object Library, msoutl9.olb, Microsoft Outlook 9.0 Object Library, GetObject, CreateObject, CheckBinding, 



Nenhum comentário:

Postar um comentário

diHITT - Notícias