Sei sulla pagina 1di 5

VBA-Integrando aplicativos Office

http://www.macoratti.net/vba_ofce.htm

VBA - Integrando aplicativos Office


Alm de fornecer uma plataforma de desenvolvimento RAD o Visual Basic conta com a vantagem de poder usar sua facilidade de integrao com outros aplicativos Microsoft , em especial da suite office , que , quer queiram ou no tem uma enorme base instalada . Assim como Word sinnimo de processador de textos , Excel de planilha eletrnica , PowerPoint de programa para apresentaes , Access de Banco de dados e Visual Basic linguagem de programao visual. Por que no usar todo o poder destes aplicativos e suas funcionalidades em aplicativos Visual Basic. Para poder usar o mesmo contedo em aplicaes diferentes do Office , precisamos estabelecer uma comunicao entre eles; aqui que entra o VBA - Visual Basic for Applications. Como ele podemos fazer uma conexo entre dois aplicativos usando as funes CreateObject ou GetObject ou ainda a palavra-chave New em uma declarao ; feito isto podemos usar o contedo de um aplicativo em outro. Embora o assunto j tenha sido abordado por mim em artigos anteriores , nunca demais lembrar os fundamentos para os que esto iniciando com o VBA . Se voc quer lembrar ou esta chegando agora o mundo VBA leia os artigos abaixo para se inteirar: Usando VBA - Visual Basic for Applications ADO - Usando Visual Basic , VBScript e VBA Usando os Agents da Microsoft no VB Geralmente quem novo fica um tanto confuso e no sabe direito por onde comear quando quer usar VBA para integrar uma aplicao office no seu projeto Visual Basic. No sabia !!! uma descrio de como atingir este objetivo: Tarefa a ser realizada Abaixo eu estou listando uma relao de tarefas a serem realizadas e

Descrio de como realizar a tarefa usando VBA Use a funo CreateObject para retornar uma referncia para o objeto ; a seguir Eu quero criar um instncia de um objeto (Word,Excel, faa uma referncia para uma varivel com a declarao Set. Ex: Access etc...) Set appExcel = CreateObject("Excel.Application") No Visual Basic , clique no menu Project e a seguir em References... . Na caixa de Como fazer referncia s bibliotecas de objetos dos dilogo marque a referncia para a biblioteca de objetos de aplicativos com o qual aplicativos office. deseja trabalhar. Ex: Microsoft PowerPoint 9.0 Object Library Apos selecionar a biblioteca de objetos do aplicativo com o qual deseja trabalhar digite : Eu quero declarar uma varivel como um objeto do tipo especfico.(Ex: tipo Word , Excel , etc...) Dim Dim Dim Dim Dim appPPT As PowerPoint.Application appExc As Excel.Application appWd As Word.Application appAcc As Access.Application appOut As Outlook.Application

Eu quero declarar uma varivel como um objeto do tipo genrico (Exemplo de ligao tardia ou late binding). No recomendado. Como eu posso declarar uma varivel objeto e em seguida definir uma ocorrncia do objeto de uma nica vez. Eu quero declarar a ocorrncia de um objeto que j esta carregado. Eu quero iniciar um aplicativo , abrir um arquivo existente e a seguir atribu-lo para uma varivel de objeto de uma nica vez. Eu quero desconectar uma varivel de um objeto

Digite o nome da varivel usando a palavra-chave Dim e a seguir defina a varivel como objeto: Ex: Dim objVar As Object Apenas digite: Dim appWord as New Word.Application Use a funo GetObject e a seguir atribua a referncia para a varivel objeto:Ex: Set AppWord = GetObject(,"Word.Application") Ex: Set wrkBook = GetObject("Book1.xls") Ex: Set appWord = Nothing

Nota: A palavra-chave New no pode ser usada para declarar outros tipos de dados , s pode ser usada para declarar variveis de objeto. Em todos os aplicativos Office temos pelo menos um objeto que pode ser criado pela funo CreateObject. O Word e o Excel tambm permitem a criao de outros tipos de objeto , conforme a tabela a abaixo: Aplicativo Access Excel Excel Excel Outlook PowerPoint Word Word Tipo de Objeto Application Application Worksheet Chart Application Application Application Document Classe Access.Application Excel.Application Excel.Sheet Excel.Chart Outlook.Application PowerPoint.Application Word.Application Word.Document Cria nova ocorrncia Sim Sim --No No Sim --Propriedade Visible Sim Sim Sim Sim No Sim Sim Sim

Nota : Voc deve saber que quando voc usa CreatObject ou a palavra-chave New para criar uma ocorrncia de um aplicativo Office , o Visual Basic cria uma nova ocorrncia do aplicativo no sistema para todos os aplicativos , com exceo do PowerPoint e do Outlook. Alm disto cada objeto Application possui uma propriedade Visible que permite que voc exiba a janela do aplicativo depois da criao do mesmo com exceo do Outlook.

1 de 5

14/10/2010 17:41

VBA-Integrando aplicativos Office

http://www.macoratti.net/vba_ofce.htm

Quando eu devo usar a funo GetObject ? Voc deve us-las em duas situaes :

1. Quando quiser acessar uma ocorrncia de um objeto que j esta carregado. Assim voc evita a carga de uma nova ocorrncia. 2. Quando quiser iniciar um aplicativo e carregar um arquivo existente de uma nica vez.
Fora destas duas ocasies use a funo CreateObject ou a palavra-chave New. Aps voc usar a funo CreateObject , GetObject ou a palavra New para atribuir um objeto a uma varivel , o objeto fica na memria do computador. Para desconectar a varivel de objeto de um objeto defina a varivel do objeto para a palavra Nothing. Todos os aplicativos Office possuem como membro do objeto Application , um mtodo Quit que no Visual Basic tem o mesmo efeito que a opo Sair do aplicativo ; mas em alguns casos o mtodo Quit no libera a referncia ao objeto atual at que voc defina explicitamente a varivel objeto como Nothing.

Da Teoria para a Prtica - Gerando uma tabela no Word com os dados de uma tabela
O modelo de programao do Word esta centrado no objeto Range que representa uma rea de texto adjacente. O objeto Range permite que voc recupere ou defina textos e aplique formataes em textos em qualquer posio em um documento. Vamos ento por a mo na massa e mostrar como podemos gerar uma tabela no Word com os dados de uma tabela de um banco de dados Access. Para este exemplo eu criei um banco de dados chamado bancos.mdb e uma tabela saldos com a seguinte estrutura e dados:

Meu objetivo criar uma tabela no Microsoft Word com os dados desta tabela. Para isto eu vou criar um modelo de documento no Word com o nome de extrato.dot e usar este modelo para preencher com os dados da minha tabela saldos. Abaixo o modelo extrato.dot criado previamente no Word.

Meu objetivo mostrar o cdigo VBA usado para gerar a tabela . 1- Inicie um novo projeto no VB do tipo Standard EXE e inclua as seguintes referncias no projeto: ( Menu Project|References...) Microsoft Word 8.0 Object Library Microsoft DAO 3.6 Object Library 2- Inclua tambm no projeto os seguintes componente: Microsoft ADO Data Control 6.0 Microsoft DataGrid Control 6.0 2- no formulrio padro que vou chamar - frmextrato - inclua o seguintes controles : Um controle DataGrid - Dtagrid1 Um controle ADODC - Adodc1 Um boto de comando - cmdword Uma label - lblstatus O layout do formulrio dever ser parecido com a figura abaixo:

2 de 5

14/10/2010 17:41

VBA-Integrando aplicativos Office

http://www.macoratti.net/vba_ofce.htm

- Eu estou usando os controles DataGrid vinculado ao controle ADODC para exibir os dados . - Eu defino uma conexo com o banco de dados no controle ADODC e no controle DataGrid eu atribuo a propriedade DataSource ao controle adodc1.

Na seo - General Declarations - do formulrio inclua as declaraes das variveis usadas no projeto: Dim Dim Dim Dim Dim Dim db As Database tabela As Recordset oWordApp As New Word.Application oWordDoc As Word.Document gcaminho As String gvalorTotal As Single

No Evento Load do formulrio insira o cdigo a seguir Private Sub Form_Load() gcaminho = "c:\_vba" 'abre a base de dados no modo compartilhado Set db = DBEngine.Workspaces(0).OpenDatabase(gcaminho & "\bancos.mdb") Exit Sub 'tratamento de erros trata_erro: MsgBox Err.Number & " : " & Errors(0).Description, , "ERRO ATENO " End Sub - Estou definindo o caminho do banco de dados , do template - O arquivo extrato.doc tambm ser salvo no caminho definido em gcaminho - Estou abrindo o banco de dados via DAO , mas isto indiferente.

No evento Click do boto de comando - cmdWord - insira o seguinte cdigo : Private Sub cmdword_Click() lblstatus.Caption = "Criando uma aplicao e um documento no Word..." criarDocumentoWord lblstatus.Caption = "Gerando a tabela no Word com informaes da tabela saldos. Aguarde... " MontaDados lblstatus.Caption = "Incluindo o valor total na tabela gerada no Word..." incluiValorTotal End Sub Neste cdigo eu estou usando trs procedimentos : criarDocumentoWord , MontaDados e incluiValorTotal. A rotina criarDocumentoWord apenas cria um documento no Word com base no template extrato.dot. Private Sub criarDocumentoWord() 'cria documento no word baseado em um modelo extrato.dot Set oWordDoc = oWordApp.Documents.Add(Template:=gcaminho & "\extrato.dot", newtemplate:=False) End Sub Na rotina MontaDados() fazendo o seguinte : - Aqui eu vou invocar cada uma das rotinas que iro criar efetivamente o documento no Word , preencher a tabela e incluir o valor total.

1. Abrindo a tabela Saldos e selecionando todos os registros da mesma = Set tabela = db.OpenRecordset("Select * from Saldos") 2. Percorro a fonte de dados at o fim e invoca a rotina criarTabelaWord com o parmetros que so os campos da tabela saldo. Call
criarTabelaWord(tabela(0), tabela(1), tabela(2), tabela(3))

3 de 5

14/10/2010 17:41

VBA-Integrando aplicativos Office

http://www.macoratti.net/vba_ofce.htm

3. Efetuo a totalizao do incluir o valor total na tabela - gvalorTotal = gvalorTotal + tabela(3)


Private Sub MontaDados() 'abre o banco a tabela saldos Set tabela = db.OpenRecordset("Select * from Saldos") DoEvents 'inicia a varivel para calculo do valor total com zero gvalorTotal = 0 'percorre a tabela at o ltimo registro Do While Not tabela.EOF Call criarTabelaWord(tabela(0), tabela(1), tabela(2), tabela(3)) gvalorTotal = gvalorTotal + tabela(3) tabela.MoveNext Loop End Sub Na rotina criarTabelaWord eu estou recebendo 4 argumentos ( codigo, data, historico e valor) e a seguir eu fao o seguinte :

1. Uso a tabela j existente no documento Word ( o meu template ) - With oWordDoc.Tables(1) 2. Vou para ltima linha da tabela - With .Rows.Last 3. Incluo os parametros recebidos nas clulas da tabela
.Cells(1).Range.Text = codigo .Cells(2).Range.Text = data .Cells(3).Range.Text = historico .Cells(4).Range.ParagraphFormat.Alignment = wdAlignParagraphRight .Cells(4).Range.Text = Format$(valor, "###0.00")

4. Ao final eu incluo a linha na tabela : .Rows.Add


Private Sub criarTabelaWord(codigo As Integer, data As String, historico As String, valor As Currency) 'inclui os dados da tabela saldos na tabela gerada no word With oWordDoc.Tables(1) With .Rows.Last .Cells(1).Range.Text = codigo .Cells(2).Range.Text = data .Cells(3).Range.Text = historico .Cells(4).Range.ParagraphFormat.Alignment = wdAlignParagraphRight .Cells(4).Range.Text = Format$(valor, "###0.00") End With .Rows.Add End With End Sub Na rotina incluiValorTotal eu estou incluindo na ltima linha da tabela um texto e o valor total da coluna Valor. O cdigo esta comentado para maiores esclarecimentos.. Private Sub incluiValorTotal() On Error GoTo trata_erro With oWordDoc.Tables(1).Rows.Last 'formata o texto a ultima linha : Negrito , fonte com tamanho 12 e a borda da clula uma linha dupla .Range.Bold = True .Range.Font.Size = 12 .Borders.Item(wdBorderTop).LineStyle = wdLineStyleDouble 'inclui o total na tabela na terceira clula e formatar para o padro monetrio .Cells(3).Range.Text = "Total" .Cells(4).Range.Text = gvalorTotal .Cells(4).Range.Text = Format$(gvalorTotal, "###0.00") End With 'Salvo o documento criado no caminho definido If MsgBox("Deseja salvar o arquivo gerado no Word", vbYesNo, "Macoratti") = vbYes Then oWordDoc.SaveAs caminho & "extrato.doc" End If lblstatus.Caption = "" oWordApp.Visible = True ' exibo o Word com a tabela gerada

4 de 5

14/10/2010 17:41

VBA-Integrando aplicativos Office

http://www.macoratti.net/vba_ofce.htm

Exit Sub trata_erro: If Err.Number = 5356 Then MsgBox "No possivel salvar o arquivo pois ele esta aberto por outro aplicativo !", vbCritical, "Macoratti" Else MsgBox Err.Number & " - " & Err.Description, vbCritical, "Macoratti" End If End Sub Aps executar o projeto e clicar no boto que gera a tabela , aps alguns segundos voc dever obter o seguinte resultado:

Voil !!!, como vemos o template - extrato.dot - foi usado e a tabela - extrato.doc - gerada conforme os dados da tabela saldos. Voc pode incrementar ainda mais o exemplo adicionando recursos para tornar mais poderosa sua aplicao. Aguarde mais um artigo VBA pare breve , tchau...

Jos Carlos Macoratti

5 de 5

14/10/2010 17:41

Potrebbero piacerti anche