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 DataOn Error GoTo Err_OpenWordAndFindDim strPrompt As StringDim objWd As ObjectDim strAppName As StringDim intPos As IntegerConst 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 = TrueIf Not IsMissing(WordFindText) ThenWith objWd.Application.Selection.FindLet .Text = WordFindTextLet .Forward = TrueLet .Wrap = wdFindContinueLet .Format = FalseLet .MatchCase = FalseLet .MatchWholeWord = FalseLet .MatchWildcards = FalseLet .MatchSoundsLike = FalseLet .MatchAllWordForms = False.ExecuteIf Not .Found ThenAppActivate Application.NameLet strPrompt = "O termo de busca '" & WordFindText & "' não pôde ser encontrado."MsgBox strPrompt, vbInformation + vbOKOnly, "Não encontrado!"AppActivate strAppNameLet OpenWordAndFind = FalseGoTo Exit_OpenWordAndFindEnd IfEnd WithEnd IfAppActivate strAppNameLet OpenWordAndFind = TrueExit_OpenWordAndFind:On Error Resume NextSet objWd = NothingExit FunctionErr_OpenWordAndFind:Select Case Err.NumberCase 432strPrompt = "Este documento do MS Word não pôde ser encontrado:" _& vbCrLf & vbCrLf & WordFileNameMsgBox strPrompt, vbInformation, "Não encontrado!"Case ElseMsgBox Err.Number & " " & Err.Description, , "OpenWordAndFind"End SelectLet OpenWordAndFind = FalseResume Exit_OpenWordAndFindEnd Function
Tags: VBA, Word, late binding, find, document, busca, procura, search,
Nenhum comentário:
Postar um comentário