VBA USANDO TABELA DO WORD COMO BANDO DE DADOS PREENCHENDO UMA TABELA ATRAVÉS DE UM USERFORM Nível: Avançado w w w. t u t o r i a i s w o r d. c o m
ÍNDICE O QUE É VBA?... 3 OBJETIVO DESTE EBOOK.... 4 AUTOR... 6 CAPÍTULO I... 7 CRIANDO A INTERFACE (FORMULÁRIO)... 8 CAPÍTULO II... 17 CRIAÇÃO DO CÓDIGO... 18 CAPÍTULO III... 53 PARA IR MAIS ALÉM... 54 CONSIDERAÇÃO FINAL... 54 DOWNLOAD... 54 w w w. t u t o r i a i s w o r d. c o m
O QUE É VBA? O Visual Basic for Applications é uma linguagem de programação interna, ligada a todos os aplicativos do pacote Office, como o Access, Word, Excel, PowerPoint e outros. O Visual Basic for Applications, também chamado de VBA, propicia o desenvolvimento de ferramentas e rotinas que proporcionam ao Office recursos quase ilimitados. w w w. t u t o r i a i s w o r d. c o m Página 3
OBJETIVO DESTE EBOOK. A finalidade deste e-book é mostrar na prática um pouco do que se pode fazer utilizando os recursos de programação VBA do Microsoft Word. Este e-book é voltado para usuários que já possuem um bom conhecimento em VBA, porém, também é muito instrutivo para aqueles que estão dando os primeiros passos em programação VBA. Neste e-book mostrarei como utilizar uma tabela do próprio Word como um pequeno banco de dados, onde o usuário poderá cadastrar, excluir, pesquisar, imprimir relatório e navegar pelos registros sem ter que fazer nenhuma referência a Biblioteca DAO (Microsoft DAO 3.6 Object Library) Antes de tudo quero deixar bem claro que a melhor opção para trabalhar com um banco de dados através do Word é fazendo referência a Biblioteca DAO, deste modo o Word pode gerenciar de forma apropriada qualquer banco de dados, estando a base dados no Access ou no Excel, porém, há um inconveniente, pois, sempre que você for abrir o arquivo em outro equipamento será necessário fazer a referência a Biblioteca para que tudo funcione perfeitamente. No exemplo que aqui será mostrado usaremos uma tabela do Word como nossa base de dados e um formulário (UserForm) que irá gerenciar este banco de dados. Infelizmente o Word também tem alguns limites como, por exemplo: Número máximo de colunas de uma tabela: 63 Número máximo de linhas de uma tabela: 32.767 Tamanho máximo do arquivo: 32 MB (somente texto) Tamanho máximo do arquivo: 512 MB (texto e elementos gráficos) Entretanto, se o seu banco de dados for pequeno, este exemplo é uma boa opção para usar o Word como se fosse um Banco de Dados. Na intenção de fazer este e-book com o menor número de páginas possível não farei uma abordagem explicativa de cada linha de código usado neste exemplo, no entanto, adicionarei comentários (textos em verde) dentro do código que ajudarão o leitor a compreender a sua funcionalidade. Mas lembre-se, em se tratando de programação não existe uma maneira correta de fazer isso, ou seja, o processo de desenvolvimento muitas vezes pode ser feito de maneira diferente, de acordo com a experiência do programador e se chegar ao mesmo resultado final, portanto, o ideal é procurar w w w. t u t o r i a i s w o r d. c o m Página 4
deixar o código mais enxuto possível e fazer com que tudo que funcione de forma prática, dessa maneira, peçoao leitor que encare os exemplos aqui apresentados como ponto de partida e/ou sugestões para que através deles o leitor possa ter ideias e criar novos projetos ou adaptá-los às suas necessidades. w w w. t u t o r i a i s w o r d. c o m Página 5
AUTOR Ednilson Muniz Mendes, Técnico de Informática: Possui mais de 15 anos de conhecimento e experiência em MS Office, automatização de Documentos, Aplicações e Soluções em VBA (Visual Basic For Applications). w w w. t u t o r i a i s w o r d. c o m Página 6
CAPÍTULO I w w w. t u t o r i a i s w o r d. c o m Página 7
CRIANDO A INTERFACE (FORMULÁRIO) Como este e-book é voltado para usuários que já possuem um conhecimento prévio de programação em VBA, não farei aqui um passo a passo de como criar o formulário, apenas mostrarei a relação dos controles que deverão ser utilizados e as propriedades que deverão ser alteradas bem como a aparência do formulário depois de concluído. De qualquer forma no final deste e-book será disponibilizado um link onde poderá ser feito o download do arquivo utilizado neste exemplo. Controles necessários para a construção do Formulário: Quantidade Controle 4 Frame (Quadro) 12 Label (Rótulo) 9 TextBox (Caixa de Texto) 1 ListBox (Caixa de Listagem) 1 SpinButton (Botão de Rotação) 7 CommandButton (Botão de Comando) Adicione os controles abaixo ao formulário e altere suas propriedades: Userform1 Name: frmcadastro Height: 417 Width: 430,5 Frame1 Caption:(deixar esta propriedade em branco) Height: 132 Top: 36 Width: 330 Frame2 Caption:Buscar pelo nº do Registro Height: 48 Left: 256 Top: 312 Width: 162 w w w. t u t o r i a i s w o r d. c o m Página 8
Frame3 Caption:(deixarestapropriedadeembranco) Height: 132 Left: 342 Top: 36 Width: 78 Frame4 Caption: Buscar pelo nº do RG Height: 48 Top: 312 Width: 180 Os controles abaixo devem ser adicionados dentro do Frame1: Label1 Caption: Nome: Font: Tahoma, Negrito, Tamanho 11 Height: 18 Top: 24 Width: 42 Label2 Caption: RG: Font: Tahoma, Negrito, Tamanho 11 Height: 18 Top: 48 Width: 36 Label3 Caption: CPF: Font: Tahoma, Negrito, Tamanho 11 Height: 18 Top: 72 Width: 30 w w w. t u t o r i a i s w o r d. c o m Página 9
Label4 Caption: Total de Registros: Font: Tahoma, Regular, Tamanho 10 Height: 12 Left: 198 Top: 108 Width: 84 Label5 Caption: Registro nº Font: Tahoma, Regular, Tamanho 10 Height: 12 Left: 96 Top: 108 Width: 54 Label6 Caption: Somente números (sem traço e sem ponto) Font: Tahoma, Regular, Tamanho 7 Height: 18 Left: 222 Top: 48 Width: 96 Label7 Caption:(Deixar esta propriedade em branco) Font: Tahoma, Regular, Tamanho 10 Height: 12 Left: 150 Top: 108 Visible: false Width: 42 TextBox1 Name: txtnome Font: Tahoma, Regular, Tamanho 10 Height: 20 Left: 48 Top: 24 Width: 276 w w w. t u t o r i a i s w o r d. c o m Página 10
TextBox2 Name: txtrg Font: Tahoma, Regular, Tamanho 10 Height: 20 Left: 48 Top: 48 Width: 168 TextBox3 Name: txtcpf Font: Tahoma, Regular, Tamanho 10 Height: 20 Left: 48 Top: 72 Width: 168 TextBox4 Height: 24 Left: 240 Top: 72 Width: 18 TextBox5 Height: 24 Left: 270 Top: 72 Width: 18 SpinButton1 Height: 24 Left: 12 Top: 102 Width: 78 w w w. t u t o r i a i s w o r d. c o m Página 11
O controle abaixo devem ser adicionado acima do Frame1: Label8 Caption: Cadastro de Dados Pessoais Font: Tahoma, Negrito, Tamanho 14 Height: 18 Left: 12 TextAlign: 2fmTextAlignCenter Top: 12 Width: 408 Os controles abaixo devem ser adicionados abaixo do Frame1: TextBox6 Height: 2 Left: 12 Top: 186 Width: 402 Label11 Caption: Nome: Font: Tahoma, Regular, Tamanho 10 Height: 12 Left: 72 Top: 192 Width: 42 Label12 Caption: RG: Font: Tahoma, Regular, Tamanho 10 Height: 12 Left: 246 Top: 192 Width: 24 Label13 Caption: CPF: Font: Tahoma, Regular, Tamanho 10 Height: 12 Left: 342 Top: 192 Width: 30 w w w. t u t o r i a i s w o r d. c o m Página 12
ListBox1 Height: 83,95 SpecialEffect: 3-fmSpecialEffectEtched Top: 204 Width: 413,20 Label14 Caption: BUSCA Font: Tahoma, Negrito, Tamanho 12 Height: 18 SpecialEffect: 3-fmSpecialEffectEtched Top: 294 Width: 413,20 Os controles abaixo devem ser adicionados dentro do Frame2: TextBox9 Name: txtbuscanumreg Font: Tahoma, Regular, Tamanho 10 Height: 20 Left: 12 Top: 12 Width: 60 CommandButton5 Name: cmdpesquisarnumreg Caption: Pesquisar Font: Tahoma, Negrito, Tamanho 10 Forecolor: &H00404000 Height: 22 Left: 78 Top: 10 Width: 60 w w w. t u t o r i a i s w o r d. c o m Página 13
Os controles abaixo devem ser adicionados dentro do Frame3: CommandButton1 Name: cmdnovo Caption: Novo Font: Tahoma, Negrito, Tamanho 10 Height: 24 Top: 6 Width: 60 CommandButton2 Name: cmdadicionar Caption: Adicionar Font: Tahoma, Negrito, Tamanho 10 Forecolor: &H00FF0000 Height: 24 Top: 36 Width: 60 CommandButton3 Name: cmdexcluir Caption: Excluir Font: Tahoma, Negrito, Tamanho 10 Forecolor: &H000000FF Height: 24 Top: 66 Width: 60 CommandButton4 Name: cmdimprimir Caption: Imprimir Font: Tahoma, Negrito, Tamanho 10 Forecolor: &H000080FF Height: 24 Top: 96 Width: 60 w w w. t u t o r i a i s w o r d. c o m Página 14
Os controles abaixo devem ser adicionados dentro do Frame4: TextBox8 Name: txtbuscarg Font: Tahoma, Regular, Tamanho 10 Height: 20 Top: 12 Width: 96 CommandButton6 Name: cmdpesquisarrg Caption: Pesquisar Font: Tahoma, Negrito, Tamanho 10 Forecolor: &H00404000 Height: 22 Left: 108 Top: 10 Width: 60 O controle abaixo devem ser adicionado abaixo dos Frame2 e Frame4: CommandButton7 Name: cmdfechar Caption: Fechar Font: Tahoma, Negrito, Tamanho 10 Height: 24 Left: 192 Top: 366 Width: 60 w w w. t u t o r i a i s w o r d. c o m Página 15
Imagem do Projeto do Formulário com os controles já incluídos e suas propriedades devidamente alteradas: Prévia do Formulário em tempo de execução: w w w. t u t o r i a i s w o r d. c o m Página 16
CAPÍTULO II w w w. t u t o r i a i s w o r d. c o m Página 17
CRIAÇÃO DO CÓDIGO Neste capítulo criaremos passo a passo o código que fará todo trabalho pesado por trás do formulário. Antes de adicionar os códigos ao nosso formulário devemos inserir uma tabela com uma linha e quatro colunas, como mostra imagem abaixo: Feito isso siga os passos a seguir: 1- Acesse o Editor do VBA clicando na Guia Desenvolvedor e no Grupo Código clique em Visual Basic ou através do atalho ALT + F11. w w w. t u t o r i a i s w o r d. c o m Página 18
2- No ambiente de desenvolvimento clique duas vezes em frmcadastropara exibir o formulário. w w w. t u t o r i a i s w o r d. c o m Página 19
3- Clique duas vezes sobre o formulário e no evento Initialize do formulário adicione o código abaixo: Private Sub UserForm_Initialize() 'Coloca o foco no botão Novo cmdnovo.setfocus 'Seleciona a tabela e se ela possuir apenas uma linha, 'automaticamente é adicionado uma segunda linha ActiveDocument.Tables(1).Select If ActiveDocument.Tables(1).Rows.Count = 1 Then Selection.MoveUp Extend:=wdExtend Selection.InsertRowsBelow 1 End If 'Desabilita as Caixas de Textos (Nome, RG e CPF) txtnome.enabled = False txtrg.enabled = False txtcpf.enabled = False TextBox8.Visible = False TextBox9.Visible = False 'Desabilita o botão Adicionar cmdadicionar.enabled = False 'Desabilita o botão Excluir cmdexcluir.enabled = False 'Desabilita o botão imprimir cmdimprimir.enabled = False 'Especifica a largura das colunas da ListBox (Caixa de Listagem) ListBox1.ColumnWidths = "30;190;90;70" 'Especifica o valor mínimo e o valor máximo do SpinButton SpinButton1.Min = 0 SpinButton1.Max = 32766 'valor máximo de linhas em uma tabela do Word 'Executa a macro que conta o número de registros ContaLinhas 'Executa a macro que atualiza a ListBox atualizalistbox 'Exibe sempre os últimos registro na Listbox (Caixa de Listagem) ListBox1.TopIndex = ListBox1.ListCount - 1 End Sub w w w. t u t o r i a i s w o r d. c o m Página 20
Deverá ficar como na imagem abaixo: 4- Ainda dentro do módulo do formulário criaremos algumas macros que deverão ser executadas junto ao evento clique de alguns botões como veremos a seguir: Macro ContaLinhas:Essa macro conta quantas linhas a tabela possui e o nº de linhas será exatamente igual ao nº de registros o qual será exibido na Caixa de Texto (txttotalreg) do formulário, portanto, adicione o seguinte código dentro do módulo do formulário: Sub ContaLinhas() Dim slin As String'Declara a variável slin 'Seleciona a tabela ActiveDocument.Tables(1).Select 'O valor da variável é igual a quantidade de linhas da tabela menos um slin = Selection.Tables(1).Rows.Count - 1 'O conteúdo da txtnome é igual ao valor da variável txttotalreg.text = slin End Sub w w w. t u t o r i a i s w o r d. c o m Página 21
Deverá ficar como na imagem abaixo: Macro DeletaLinhasVazias:Essa macro excluirá aquela linha vazia que é adicionado à tabela no momento em que o formulário é inicializado (executado). Sub DeletaLinhasVazias() 'Declaração de variáveis Dim stabastable Dim slinas Range Dim scel As Cell Dim scontador As Long Dim snumlinhas As Long Dim stextlin As Boolean ' Seleciona a tabela Set stab = Application.Selection.Tables(1) ' Define uma variável para o primeiro intervalo de linha Set slin = stab.rows(1).range snumlinhas = stab.rows.count Application.ScreenUpdating = False For scontador = 1 To snumlinhas StatusBar = "Row "&scontador stextlin = False For Each scel In slin.rows(1).cells If Len(sCel.Range.Text) > 2 Then stextlin = True Exit For End If Next scel If stextlinthen Set slin = slin.next(wdrow) Else slin.rows(1).delete End If Next scontador Application.ScreenUpdating = True End Sub w w w. t u t o r i a i s w o r d. c o m Página 22
Deverá ficar como na imagem abaixo: Macro autonumeracao:essa macro será responsável por fazer na primeira coluna da tabela a numeração sequencial dos registros cadastrados a partir da segunda linha da tabela. Sub autonumeracao() 'Define a variável ntabl como a 1ª tabela do documento ativo Set mtabl = ActiveDocument.Tables(1) 'Define a variável acol como a 1ª coluna da tabela do documento ativo Set acol = ActiveDocument.Tables(1).Columns(1) 'Apaga o conteúdo da 1ª coluna da tabela 'Insere a numeração sequencial a partir da segunda linha For Each acell In acol.cells acell.range.delete acell.range.insertafter Num Num = Num + 1 Next acell End Sub w w w. t u t o r i a i s w o r d. c o m Página 23