Propósito

✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.

Mostrando postagens com marcador Late Binding. Mostrar todas as postagens
Mostrando postagens com marcador Late Binding. Mostrar todas as postagens

VBA Word - Abra um documento e encontre uma Palavra nele - Function to open/get a Word document and Find a string

Inline image 1












O propósito da função VBA disponibilizada a seguir é o de abrir um documento do MS Word e encontrar a próxima ocorrência de uma seqüência específica. Além disso, teremos mais um excelente exemplo do uso do late binding com essa automação vinculada à função AppActivate. Ahh, e sim, este é um post para usuários avançados.

É sempre bom relembrar que uma das vantagens de usarmos late binding (uso de objetos genéricos, como o objWd na função), é o de não sermos obrigados a fazermos uma referência a uma biblioteca em particular. Termos a liberdade de não efetuarmos uma referência direta liber-nos da necessidade de sabermos qual a versão do MS Word que está sendo usada pelo usuário final da aplicação. Mas como não existe almoço de graça, a desvantagem é a de que precisamos definir um constante para ser usado no MS Word, razão pela qual o wdFindContinue foi definido.

O AppActivate torna fácil ativarmos um aplicativo específico que estiver aberto na tela. Como? Fazendo referência direta a legenda contida no título da respectiva janela ativa. Neste caso, quando o texto não é encontrado, o documento do MS Word ainda fica ativo, sendo necessário apenas ativar o código do aplicativo em execução antes de mostrarmos a caixa de mensagem. Se não tivéssemos esse cuidado o usuário poderia acabar por ouvir aquele 'ding' quando a caixa de mensagem aparecesse, sendo coberta pelo documento do MS Word e despercebida pelo usuário.

Caso utilize um documento do MS Word como um manual do usuário para o seu aplicativo, digamos do MS Access, por exemplo, poderá usar essa função VBA no evento Click de um botão que abra o documento e detecte a posição da palavra ou expressão desejada num determinado título u trecho do texto no documento. Mas, caso clicasse no botão novamente, quando o documento já estivesse aberto, a próxima ocorrência do texto seria encontrada, tornando-se uma maneira simples de fornecer ajuda sensível ao contexto. Chique hein!

Function OpenAndFindWordExpression (WordFileName As String, Optional WordFindText) As Boolean
' If the Microsoft Word file specified in WordFileName is not open yet, it will
' be opened.  If a value for WordFindText is specified, it will find the next
' occurance of the value.
' Copyright © 2009 Extra Mile Data

On Error GoTo Err_OpenWordAndFind
   
    Dim strPrompt As String
    Dim objWd As Object
    Dim strAppName As String
    Dim intPos As Integer
    Const wdFindContinue As Integer = 1
    
    ' Get the name of the Word document from the path in WordFileName
    ' by finding the last \ and grabbing all the characters to the right
    ' of that position.

    Let intPos = InStrRev(WordFileName, "\")
    Let strAppName = Right(WordFileName, Len(WordFileName) - intPos)
    
    ' Se o documento do Word estiver aberto ele efetuará a busca, caso não esteja aberto, o abrirá.    
    ' Torna a aplicação visível.
    Let objWd.Application.Visible = True
  
    If Not IsMissing(WordFindText) Then
        With objWd.Application.Selection.Find
            Let .Text = WordFindText
            Let .Forward = True
            Let .Wrap = wdFindContinue
            Let .Format = False
            Let .MatchCase = False
            Let .MatchWholeWord = False
            Let .MatchWildcards = False
            Let .MatchSoundsLike = False
            Let .MatchAllWordForms = False
            
            .Execute            
      
            If Not .Found Then      
                AppActivate Application.Name

                Let strPrompt = "O termo de busca '" & WordFindText & "' não pôde ser encontrado."
                MsgBox strPrompt, vbInformation + vbOKOnly, "Não encontrado!"

                AppActivate strAppName

                Let OpenWordAndFind = False

                GoTo Exit_OpenWordAndFind
            End If
        End With
    End If
    
    AppActivate strAppName
    
    Let OpenWordAndFind = True
    
Exit_OpenWordAndFind:
    On Error Resume Next

    Set objWd = Nothing
    Exit Function
    
Err_OpenWordAndFind:
    Select Case Err.Number
    Case 432

        strPrompt = "Este documento do MS Word não pôde ser encontrado:" _
        & vbCrLf & vbCrLf & WordFileName
        MsgBox strPrompt, vbInformation, "Não encontrado!"
    Case Else
        MsgBox Err.Number & " " & Err.Description, , "OpenWordAndFind"
    End Select
    
    Let OpenWordAndFind = False
    Resume Exit_OpenWordAndFind
End Function


Tags: VBA, Word, late binding, find, document, busca, procura, search, 




VBA Outlook - Inserindo assinatura no e-mail com o Early Binding - Insert Outlook Signature in mail


O código nesta página só funciona quando você usa o Outlook como seu programa de email.

Early Binding (Compreendendo o Early Binding e o Late Binding)

Se quisermos melhorar o que desenvolvemos nos três códigos anteriores (12 e 3) e usarmos a ajuda do Intellisense para nos mostrar as propriedades e métodos dos objetos, bem como os seus tipos, podemos implementar a técnica do Early Binding

Isso certamente tornará a aplicação um pouco mais rápida ao executar o código, mas poderemos ter problemas ao distribuirmos as planilhas. O MS Excel automaticamente atualizará a versão da referência feita no MS Outlook quando abrirmos nossa planilha na versão mais atualizada disponível, mas não a atualizará quando esta for aberta numa versão inferior.

Com o Late Binding como usei nos exemplos de código, não teremos tal problema.

Adicione uma referência para o Microsoft Outlook Library no Excel:

1) Vá para o editor VBA com as teclas de combinação Alt - F11.

2) Clique em Ferramentas / Referências no Menu.

3) Marque a caixa antes de Microsoft Outlook XX Object Library. O valor que estiver em XX será o número da versão do MS Outlook.

Então troque as três linhas de código abaixo:

Dim OutApp As Object
Dim OutMail As Object

Set OutMail = OutApp.CreateItem(0)

Por estas 3 linhas:

Dim OutApp As Outlook.Application
Dim OutMail As Outlook.MailItem

Set OutMail = OutApp.CreateItem(olMailItem)

ReferênciaRon de Bruin 

Tags: VBA, Outlook, email, e-mail, send, enviar, assinatura, signature, Early Binding, Late Binding, Intellisense, 


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, 



diHITT - Notícias