✔ VBA Brazil Specialist®: VBA Advanced - Compreendendo o Early Binding e o Late Binding - Early Binding & Late Binding
✔ Map ✔ Brazil SFE®
✔ VBA Brazil Specialist® ✔ VBA Excel Specialist® ✔ VBA Access Specialist® ✔ VBA Dashboards Specialist® ✔ VBA Infografics Specialist® ✔ VBA Pharma Specialist® ✔ Mídia Kit
VBA Advanced - Compreendendo o Early Binding e o Late Binding - Early Binding & Late Binding
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.
A ligação (binding) OLB é 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()
MsgBox olApp.Name
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()
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()
If olApp.ActiveExplorer Is Nothing Then
olApp.Explorers.Add _
(olNs.GetDefaultFolder(9), 0).Activate
Set olApp.ActiveExplorer.CurrentFolder = _
olNs.GetDefaultFolder(9)
olApp.ActiveExplorer.Display
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:
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.
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.
Micrsoft MSDN: http://msdn.microsoft.com/en-us/library/0tcf61s1.aspx
Bob Phillips: http://www.xldynamic.com/source/xld.EarlyLate.html
Dick´s Clicks: http://www.dicks-clicks.com
Word MVP: http://www.word.mvps.org/FAQs/InterDev/EarlyvsLateBinding.htm
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, Enviar por e-mailBlogThis!Compartilhar no TwitterCompartilhar no FacebookCompartilhar com o Pinterest