Excel VBA e Macros - Passo A Pas - Luiz Felipe Araujo
Excel VBA e Macros - Passo A Pas - Luiz Felipe Araujo
Excel VBA e Macros - Passo A Pas - Luiz Felipe Araujo
CAPÍTULO 7– FORMULÁRIOS
CAPÍTULO 8 – INTERAÇÃO COM OUTRAS APLICAÇÕES
INTRODUÇÃO
INTERAÇÃO COM OUTLOOK
INTERAÇÃO COM O POWERPOINT
INTERAÇÃO COM O WORD
CAPÍTULO 9 – ESTUDOS DE CASO
1º PROJETO - TROCAR O NOME DE TODAS AS ABAS
2º PROJETO - SALVAR CADA ABA COMO ARQUIVO EXCEL
3º PROJETO - SALVAR CADA ABA COMO PDF
4º PROJETO - ATUALIZAR TODOS OS VÍNCULOS
5º PROJETO – SISTEMA DE LOGIN E SENHA SEM FORMULÁRIO
6º PROJETO – CONTROLE DE ACESSO A PLANILHA
7º PROJETO – FORMULÁRIO DE CADASTRO DE CLIENTE
Sugestão de Leitura
O Aprendizado do VBA vai variar muito de acordo com o Perfil do
usuário, este livro foi concebido com o objetivo de atingir todos os
tipos de usuários, desde os mais iniciantes que nunca tiveram
contato com uma linguagem de programação, até usuários mais
experientes em computação de uma forma geral.
A estrutura de capítulos proposta tem por objetivo atingir os usuários
mais leigos, para tanto, desta forma, o primeiro capitulo introduz de
forma muito breve o conceito estrutural do VBA e o segundo faz uma
abordagem das instruções diretas ao Excel, de forma a ensinar o
leitor como realizar tarefas simples de copiar e colar, abrir e fechar
arquivos, formatar e filtrar dados. Estes comandos por si próprios,
não configuram o que realmente é a linguagem de programação, se
tornando desta maneira, instruções de rápida absorção para usuários
que nunca tiveram contato com lógica de programação.
O terceiro capítulo deste livro, já inicia a programação propriamente
dita, apresentando conceitos de laços, condicionais e etc. Desta
forma, é altamente recomendado que usuários leigos sigam a
estrutura proposta pelo livro, porém usuários que já tiveram contato
com programação podem iniciar no capítulo 1, pular para o capítulo 3
e posteriormente retornar ao segundo.
Capitulo 1 – Introdução ao Visual Basic
As duas estruturas básicas utilizadas em VBA são chamadas de Sub
(“Subroutine”) e Function, ambas processam o algoritmo, o que
diferencia a Funcition é que ela retorna um valor no final das
instruções. Basicamente se aplica uma Function, quando se deseja
criar um algoritmo que retorne um valor ao final de sua execução,
posteriormente os exemplos tornarão mais simples o entendimento
de aplicação de cada estrutura.
A estrutura básica de uma Sub, como citado anteriormente consiste
em:
Sub <nome_da_macro> ( )
<algorítimo>
End Sub
Todo o código que será ensinado nos capítulos a seguir deverá ser
inserido dentro da Sub Aprendizado, para efeitos de teste e
aprendizado, desta forma a palavra [algoritmo] será apagada, para
dar lugar aos códigos desejados.
Ao pressionar ALT + F11 é possível acessar o editor de VBA do
Excel, outra maneira é acessar a guia desenvolvedor e clicar em no
botão Visual Basic. Caso a guia desenvolvedor não esteja disponível,
é possível adiciona-la da seguinte maneira:
C lique na guia Arquivo.
Clique em Opções.
Clique em Personalizar Faixa de Opções.
Em Personalizar a Faixa de Opções e em Guias Principais,
marque a caixa de seleção Desenvolvedor.
Com a guia desenvolvedor disponível, basta acessa-la pelo menu
superior, da seguinte maneira:
Sheets (“NomeDoArquivo”).Activate
Ou
Sheets (1).Activate
Select x Activate:
A diferença básica entre Select e Activate, se dá pelo fato de que no
Excel se pode ter vários objetos selecionados, porém em ordem de
hierarquia, apenas um pode estar ativo. Por exemplo, dentro da
hieraquia das células, mesmo que várias estejam selecionadas,
apenas uma estará ativa, conforme exemplo abaixo:
Range(“B1”,”B3”).Copy Destination:=Range("C3")
Explicação:
xlEdgeLeft – Borda externa esquerda
xlEdgeRight – Borda externa direita
xlEdgeBottom – Borda externa inferior
xlEdgeTop – Borda externa superior
xlInsideHorizontal – Borda interna horizontal
xlInsideVertical – Borda interna Vertical
Exemplo 2:
Sub Aprendizado()
Dim Selecao_1 As Range
Selecao_1 = Range(“A1”)
Selecao_1 = 10
End sub
No exemplo anterior, a partir do momento que Selecao_1 recebe
Range(“A1”), é possível se referir a célula A1 através da variável
Selecao_1, então utilizar Selecao_1 = 10, é o mesmo que utilizar
Range(“A1”) = 10.
Obs: Neste exemplo não foi declarado a Worksheet que está sendo
referida, desta forma o Excel entende a planilha utilizada como a que
está selecionada. Poderia também ser utilizado no lugar de
Range(“A1”), a forma mais complete:
Worksheets(“Plan1”).Range(“A1”).
É importante citar que para as Sub’s, caso a variável não seja
declarada, no momento da depuração, o compilador consegue
atribuir um tipo de variável de acordo a utilização no código, porém
para um funcionamento correto e desempenho satisfatório, é
altamente recomendado a declaração de acordo com a necessidade
de aplicação no algoritmo.
É possível atribuir um valor a uma variável dentro do próprio código,
ou trazer seus valores das planilhas do Excel, combinado com os
códigos dos capítulos anteriores, como no exemplo a seguir:
Explicação:
Variável Nomes declarada como vetor de 3 posições.
Variável Nomes com índice 0 recebe o nome Clara
Variável Nomes com índice 1 recebe o nome João
Variável Nomes com índice 2 recebe o nome Maria
Mensagem com os nomes armazenados, Chr(13) é um código utilizado
para pular linha.
As variáveis são alocadas da seguinte forma no vetor:
Exemplo prático:
Sub Aprendizado ()
Dim ArrayMatriz(2, 2) As String
ArrayMatriz(0, 0) = "A "
ArrayMatriz(0, 1) = "B "
ArrayMatriz(1, 0) = "C "
ArrayMatriz(1, 1) = "D "
MsgBox "Letras Armazenadas:" & Chr(13) & ArrayMatriz(0, 0) & ArrayMatriz(0,
1) & Chr(13) & ArrayMatriz(1, 0) & ArrayMatriz(1, 1)
End Sub
Explicação:
Variável ArrayMatriz declarada como matriz de 2,2 posições
Variável ArrayMatriz com índice 0,0 recebe a letra A
Variável ArrayMatriz com índice 0,1 recebe a letra B
Variável ArrayMatriz com índice 1,0 recebe a letra C
Variável ArrayMatriz com índice 1,1 recebe a letra D
Mensagem com as Letras armazenadas.
InputBox e MsgBox
Ambos os recursos são responsáveis por realizar uma interação com
o usuário através de interface gráfica, InputBox, será responsável por
enviar uma mensagem de texto ao usuário através de uma janela,
solicitando uma entrada de informação, o MsgBox por sua vez, tem o
objetivo de enviar uma mensagem ao usuário, solicitando a sua
confirmação através de botões.
InputBox
Sintaxe
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
Dos parâmetros solicitados, apenas o prompt é obrigatório, nele é
necessário escrever o texto que será informado ao usuário, é
importante também utilizar uma variável que receberá o valor que o
usuário digitar, conforme exemplo a seguir:
Valor = InputBox("Digite o valor desejado")
Exemplo de utilização 2:
Sub Aprendizado()
Dim Total As Integer
Total = Application.WorksheetFunction.SumIf(Range("A:A"), ">5",
Range("A:A"))
MsgBox Total
End Sub
Funcionamento:
A Macro tem as seguintes instruções:
Declara a variável “Planilha” como Worksheet
For-Each, para cada planilha dentro do conjunto de objetos de
planilhas, realizar as instruções.
Seleciona a Planilha
Nome da planilha = entrada de dados do usuário
Seleciona o próximo objeto do conjunto.
Sub Aprendizado()
Dim Var1 As Integer
Dim Var2 As Integer
Var1 = 3
Var2 = 4
Uma vez que o objeto esteja dentro da planilha, ele poderá apenas
ser manipulado, através da ativação do botão Modo Design no menu
superior:
Obs: Para grande maioria dos casos, apenas a declaração Click será
o suficiente.
Botão (Button)
Principais propriedades:
Exemplo Prático 2:
No segundo exemplo é demonstrada a criação de um botão que é
associado a um código que exibe e oculta a aba Plan2, desta forma,
ao clicar no botão, o mesmo faz uma verificação se a aba está oculta
ou não, reexibindo caso esteja e ocultando em caso contrario.
Obs:
Para poder clicar no botão corretamente é preciso desativar o botão
“Modo Design”
Caixa de Combinação (Combo Box)
Principais propriedades:
Código utilizado:
Caixa de Seleção (Check Box)
Explicação:
Em propriedades só o “caption” foi alterado, para os nomes: Plan1,
Plan2 e Plan3. O nome dos objetos permaneceu no padrão
CheckBox1, CheckBox2 e CheckBox3.
Principais Métodos:
For i = 0 To Lista2.ListCount - 1
Fruta = Lista2.List(i)
SubTotal = Application.WorksheetFunction.VLookup(Fruta,
Plan1.Range("A3:B14"), 2, False) + Range("H16")
Range("H16") = SubTotal
Next
End Sub
Explicação:
Sub Aprendizado()
Dim x As Integer
x = 10
Call Calc (x)
MsgBox x
End Sub
Como a foi utilizado ByVal, o valor do X se manteve original, mesmo
que a function tenha multiplicado por 3, o valor na sub permaneceu
inalterado. Por outro lado, caso se seja utilizado ByRef:
Function Calc(ByRef x As Integer) As Integer
x=x*3
Mult = x
End Function
Sub Aprendizado()
Dim x As Integer
x = 10
Call Calc (x)
MsgBox x
End Sub
Sub Aprendizado()
Dim a, b, c As Double
a = Range("B3")
b = Range("B4")
c = Range("B5")
Range("B7") = EqSegGrau(a, b, c, True)
Range("B8") = EqSegGrau(a, b, c, False)
End Sub
Capítulo 7– Formulários
Os formulários (UserForms) no Excel, tem por objetivo a criação de
interfaces de interação com o usuário, permitindo criar janelas
personalizadas, com a utilização de objetos, dos quais alguns já
foram apresentados na seção de ActiveX e outros novos elementos
que serão apresentados nesta seção, os quais terão maior utilidade
para os formulários propriamente ditos.
Esta ferramenta, tem uma grande utilidade para criação de
aplicações, uma vez que a interface personalizada, permite realizar
as mais diversas tarefas, como por exemplo: formulários de cadastro
de usuários, controle de estoque, fluxo de caixa e até mesmo
complementos para funcionalidades do Excel.
Para inserir um userform, basta acessar o menu superior na aba
inserir, posteriormente clicar em UserForm, ou no menu esquerdo,
botão direito na área vazia e Inserir > UserForm.
Modo Código:
Explicação:
SubRotina para o evento de click no botão “CommandButton1”
Se o índice da planilha selecionada (posição), for igual ao
numero total de planilhas, selecionar a planilha 1.
Caso contrario, selecionar a planilha(índice da atual + 1 )
Termina condicional
Exemplo:
Sub Send_Mail()
Dim OutApp As Object
Dim OutMail As Object
Dim bMessage As String
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
bMessage = "Digite a primeira linha" & vbNewLine & _
"Digite a segunda linha" & vbNewLine & _
"Digite a Terceira linha"
On Error Resume Next
With OutMail
.to = "[email protected]"
.CC = "[email protected]"
.BCC = "[email protected]"
.Subject = "Assunto do email"
.Body = bMessage
.Attachments.Add ("C:\exemplo.txt")
.Send
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
Sub Aprendizado()
Dim objWord As Object
Dim objDoc As Object
Dim strValue As String
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.documents.Add
Dim i As Integer
For i = 1 To 10
objDoc.Activate
strValue = Cells(i, 1)
objWord.Selection.TypeText Text:=strValue
objWord.Selection.TypeParagraph
Next i
End Sub
Formulário de pesquisa:
Formulários
FORM_CADASTRO
FORM_PESQUISAR
Botões
BT_INSERIR
BT_SALVAR
BT_EXCLUIR
BT_LIMPAR
Caixas de texto
TXT_COD
TXT_NOME
TXT_CIDADE
TXT_ENDERECO
TXT_RG
TXT_CPF
TXT_TELEFONE
TXT_CEL
Caixa de combinação
CB_UF
Caixa de listagem
LB_CLIENTES
Arquivo
WKB_CADASTRO
ARQ_CADASTRO
Private Sub Workbook_Open()
FORM_CADASTRO.Show
End Sub
1. WorkBook
Declaração para Open no “WorkBook”
Para abrir o formulário quando o arquivo do Excel for
aberto, basta utilizar o objeto WKB_CADASTRO com
declaração Open.
FORM_CADASTRO
Public cod, nome, uf, cidade, endereco, rg, cpf, telefone, celular As String
Public numlinhas As Long
Public ChangesOK As Boolean
1. Variáveis
Variáveis do tipo string que receberão as informações da
caixa de texto
Variável do tipo long que receberá o numero total de
linhas do banco de dados
Variável do tipo booleana que permitirá ou não a leitura
do código dentro da Sub “LB_CLIENTES_Change” que
será apresentada posteriormente
2. Formulário Cadastro
Sub relacionada a abertura do formulário [Declaração
UserForm.Initialize()]
A variável ChangesOK recebe inicialmente o valor
verdadeiro
A fonte de linhas é atualizada com o total de linhas
preenchidas na planilha do Excel que está armazenando
os dados, através da função CountA + 1
O algoritmo sugere um código para o cadastro do
próximo cliente, utilizando o número de linhas já
preenchidas +1
3. Botão Inserir
Declaração para click no botão Inserir
A variávei numlinhas recebe o numero total de linhas
através da função “CountA”, isso é necessário para inserir
a nova informação apenas na última linha +1
A caixa de texto do código recebe o código referente
ao numero de linhas +1, apenas um padrão para este
formulário
Posteriormente a Sub “UpdateText” é chamada para
associar os valores e textos inseridos para variáveis
do tipo String (Sub apresentada abaixo)
Caso CPF ou endereço estejam vazios, é enviada uma
mensagem de formulário incompleto, neste exemplo,
apenas os dois são exigências de cadastro
Caso CPF e endereço tenham sido adequadamente
preenchidos a Sub “Insert” é chamada para inserir os
valores preenchidos nas linhas correspondentes
A fonte de linhas que alimenta a Caixa de listagem
(listbox) é atualizada da célula A2, até a célula I &
numero te linhas totais (encontrada na função
CountA) + 1.
Apenas para fins de uma interface mais intuitiva, a
nova linha é selecionada.
6. Botão Salvar
Declaração para click no botão Limpar
O artifício de utilizar a variável booleana ChangesOK
funciona para inibir a Sub que será apresentada a seguir:
“LB_CLIENTES_Change()”, uma vez que ela é chamada em
qualquer modificação na seleção da caixa de listagem
Posição na planilha equivale a posição do item na lista +2
(Devido ao fato da lista contar a partir de zero e na
planilha ter o cabeçalho, logo é preciso somar 2)
As células na planilha recebem os valores preenchidos
na caixa de texto
TXT_COD.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 0)
TXT_NOME.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 1)
CB_UF.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 2)
TXT_CIDADE.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 3)
TXT_ENDERECO.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 4)
TXT_RG.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 5)
TXT_CPF.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 6)
TXT_TELEFONE.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 7)
TXT_CEL.Value = LB_CLIENTES.List(LB_CLIENTES.ListIndex, 8)
End Sub
7. Caixa de Listagem LB_CLIENTES_Change()
Declaração para alteração na caixa de listagem
Caso a variável ChangesOK seja falsa, significa que esta
sub está sendo chamada por causa da Sub
SALVAR_Click, desta forma, será lido o código Exit Sub,
para sair da mesma
Caso contrário, os valores das caixa de texto são
atualizados de acordo com a seleção do usuário na caixa
de listagem
8. Botão Excluir
Declaração para click no botão Excluir
Variável RemoverLinha recebe o valor
LB_CLIENTES.ListIndex, o qual equivale a quantidade de
linhas até a posição que será excluída
A linha na planilha que será deletada, equivale a
RemoverLinha +2, uma vez que é preciso considerar que
a ListIndex começa em Zero e na planilha tem o
cabeçalho, logo é preciso somar 2
Através do LB_CLIENTES.RowSource o quantitativo de
linhas é atualizado, para tanto, se utiliza a função CountA
Sempre que se excluir uma linha, a linha anterior a ela é
selecionada, apenas para fins de melhoramento de
interface, “On Error Resume Next” é utilizado para
impedir erro caso se esteja na primeira linha
9. Botão Limpar
Declaração para click no botão Limpar
Atribui o valor vazio para todas as Caixas de Texto
FORM_PESQUISAR
Private Sub BT_Pesquisar_Click()
Dim Coluna As String
Dim Linha As String
Dim TextoProcura As String
TextoProcura = TXT_PESQUISA
On Error GoTo erro001
If IsNumeric(TextoProcura) Then
Linha = Application.WorksheetFunction.Match(CLng(TextoProcura),
Range(Coluna & ":" & Coluna), 0)
Else
Linha = Application.WorksheetFunction.Match(CStr(TextoProcura),
Range(Coluna & ":" & Coluna), 0)
End If
FORM_CADASTRO.LB_CLIENTES.Selected(Linha - 2) = True
Exit Sub
erro001:
MsgBox "Não Encontrado"
End Sub
1. Botão Pesquisar
FORM_CADASTRO
Public cod, nome, uf, cidade, endereco, rg, cpf, telefone, celular As String
Public numlinhas As Long
Public ChangesOK As Boolean
FORM_PESQUISAR
Private Sub BT_Pesquisar_Click()
Dim Coluna As String
Dim Linha As String
Dim TextoProcura As String
If OB_COD.Value = True Then
Coluna = "A"
ElseIf OB_NOME.Value = True Then
Coluna = "B"
ElseIf OB_CPF.Value = True Then
Coluna = "G"
ElseIf OB_RG.Value = True Then
Coluna = "F"
End If
TextoProcura = TXT_PESQUISA
On Error GoTo erro001
If IsNumeric(TextoProcura) Then
Linha = Application.WorksheetFunction.Match(CLng(TextoProcura),
Range(Coluna & ":" & Coluna), 0)
Else
Linha = Application.WorksheetFunction.Match(CStr(TextoProcura),
Range(Coluna & ":" & Coluna), 0)
End If
FORM_CADASTRO.LB_CLIENTES.Selected(Linha - 2) = True
Exit Sub
erro001:
MsgBox "Não Encontrado"
End Sub