Você está na página 1de 131

VBA (Visual Basic for Applica ons) consiste em uma linguagem de

programação aplicada a diversos so wares, dentre eles o Excel, onde é


possível automa zar processos, criar ro nas de verificação, desenvolver
ferramentas, formulários e as mais diversas soluções que são
proporcionadas com a u lização da programação. Por se tratar de uma
linguagem orientada a objeto de fácil aprendizado, a curva de aprendizado
se torna acentuada, possibilitando extrair uma alta produ vidade do
so ware através de aplicações simples de conhecimentos básicos.
Primeiro serão apresentados aspectos necessários para dominar as
funcionalidades dentro do Excel através dos códigos, possibilitando fazer
seleções, realizar cópias/recortar e colar, aplicar formatação, fórmulas e
demais aspectos que envolvem apenas uma relação direta entre comandos
para realizar funções já conhecidas por usuários intermediários. Neste
ponto, já será possível fazer uma série de automações, apenas u lizando
comandos básicos e diretos.
Na etapa seguinte, será abordado um foco maior na lógica de
programação, onde será possível compreender a u lização de variáveis,
verificações lógicas, ciclos, funções e etc. Para facilitar e melhorar o
aprendizado, nesta seção será u lizado diversos exemplos de macros com
o obje vo de automa zar processos variados, exemplificando de forma
clara e obje va.
Sumário
SUGESTÃO DE LEITURA
CAPITULO 1 – INTRODUÇÃO AO VISUAL BASIC
P M
H W
D
V I
V I

CAPITULO 2 – INTERAÇÕES VBA/EXCEL


P
M
M S
S A :
M C ,R ,C I
F VBA
M F O
M
CAPÍTULO 3 – PROGRAMAÇÃO

D V
O
V A
A V (U - )
A M (B - )
I B M B
I B
M B
F E VBA
G M
E C
I –T -E
F –N
D –W –L /D –U –L
S
F –E –N
S C S
G S
W S
CAPÍTULO 4 – TRATAMENTO DE ERROS
E
E
E

CAPÍTULO 5 – CONTROLES ACTIVEX

B (B )
C C (C B )
C S (C B )
B O (O B )
C L (L B )
CAPÍTULO 6 – FUNÇÕES

I
D B R B V

CAPÍTULO 7– FORMULÁRIOS

CAPÍTULO 8 – INTERAÇÃO COM OUTRAS APLICAÇÕES


I
I O
I P P
I W
CAPÍTULO 9 – ESTUDOS DE CASO
1º P -T
2º P -S E
3º P -S PDF
4º P -A
5º P –S L
6º P –C A P
7º P –F C
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 obje vo de a ngir todos os pos de
usuários, desde os mais iniciantes que nunca veram 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 obje vo a ngir 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 veram 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á veram 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 u lizadas em VBA são chamadas de Sub
(“Subrou ne”) e Func on, ambas processam o algoritmo, o que diferencia
a Funci on é que ela retorna um valor no final das instruções. Basicamente
se aplica uma Func on, 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í mo>
End Sub

A estrutura básica de uma função consiste em:


Func on <nome_da_função> (<parametro1>,< parametro 2>,....<
parametro_n)
<algorí mo>
End Func on

Para os estudos inicias é recomendado explorar apenas a estrutura Sub,


para entender a interação direta das macros com o Excel, para facilitar o
aprendizado, é recomendado criar uma Sub da seguinte maneira, apenas
para pra car:
Sub Aprendizado ( )
[Algoritmo]
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:

Com a janela aberta, será possível visualizar a seguinte tela abaixo:

A estrutura básica da Janela, está apresentada na imagem a seguir, caso o


verificador imediato e o “Project Explorer” não estejam abertos, basta
acessar no menu superior, o botão “Exibir” e posteriormente clicar em
Project Explorer (Ctrl + R) e repe r o mesmo processo e clicar em ‘Janela
Verificação Imediata’ (Ctrl + G).
Sinais de operação e de comparação em VBA serão u lizados nos capítulos
seguintes:
Primeira Macro
Para iniciar a primeira macro, é preciso escolher um local para escrevê-la,
existem basicamente dois locais para escrever as macros, podem ser
escritas dentro do objeto atrelado a Planilha ou em um módulo separado.
Por questões organizacionais, é recomendado escrever macros dentro de
planilhas apenas nos casos onde ela tem seu funcionamento diretamente
ligado com a planilha em questão, para as demais é recomendado criar
módulos para organiza-las, da seguinte maneira, botão direito no espaço
vazio dentro do explorador de arquivos na esquerda > inserir > Módulo,
por padrão o módulo é criado com o nome “Módulo1”, da seguinte
maneira:

É possível alterar o nome do módulo acessando a propriedade do mesmo,


através da tecla F4.
Uma vez criado, é possível escrever suas instruções na área do Editor,
conforme será mostrado a seguir no “Hello World”, o primeiro exemplo
que será criado neste livro.
Hello World
Famoso primeiro código aprendido em linguagens de programação, ele
permite entender a estrutura mais básica possível de comunicação com o
usuário, em VBA pode ser escrito da seguinte maneira:
Sub Aprendizado ( )
Msgbox (“Hello World”)
End Sub
Para executar, basta posicionar o curso de edição de texto dentro da Sub e
clicar no botão verde “Play”, na barra superior ou basta pressionar F5, a
macro será executada e as instruções dadas ao Excel serão executadas,
apresentando o resultado a seguir:

Um segundo exemplo inicial de macro, agora com interação com o Excel:


Sub Aprendizado ( )
Range(“A1”) = “Esta é a primeira macro”
Range(“A2”) = “Criada através”
Range(“A3”) = “Deste Livro”
End Sub
Depurador
Uma ferramenta extremamente importante disponibilizada pelo editor é a
depuração, onde é possível observar a execução do código passo a passo,
para tanto pode-se u lizar o menu superior, em “Depurar”, ou u lizar os
atalhos, onde a depuração total é realizada com o atalho F8, marcando em
amarelo a linha atual que está sendo lida pelo depurador.

É Importante notar que o depurador está parado na quinta linha, uma vez
que F8 seja pressionado novamente, a quinta linha será lida e a célula A3
será preenchida de acordo com as instruções dadas.
É possível também marcar um ponto de interrupção, através da tecla F9,
ou u lizando o menu superior em Depurar>A var/Desa var pontos de
interrupção, e ao dar “Play” na macro ela irá ler todas as linhas até chegar
na linha de interrupção, a qual é graficamente marcada pela bola vermelha
e o texto vermelho, conforme exemplo abaixo:

Posteriormente, pode-se con nuar a macro através de F9 (passo a passo


com a depuração total) ou com a u lização do F5, para dar prosseguimento
normal da execução da macro.
Verificação Imediata
A verificação imediata tem uma importante função dentro do editor, visto
que ela permite a depuração imediata de linhas de código, para tanto,
basta digitar uma linha desejada na caixa do verificador e pressionar a
teclada “Enter”, desta forma apenas a linha desejada será executada.

Outra maneira de u lizar a verificação imediata é para perguntar ao


depurador, qual é o objeto, ou variável desejada, para isso, basta u lizar
“?” antes do objeto ou variável desejada, o Editor, mostrará na linha abaixo
o resultado, como por exemplo:

Desta forma se pergunta ao depurador qual é o valor do objeto


Range(“A2”), este exemplo é extremamente simples, porém em projetos
mais complexos, pode ser muito ú l para consultar valor de variáveis,
propriedades de objetos em determinado momento do código e etc. Esta
função tem uma grande funcionalidade principalmente para encontrar
erros e estudar o comportamento do código no decorrer de sua leitura,
com auxílio da depuração.
Verificação Imediata
Comentar o código é uma prá ca extremamente comum na programação,
através dos comentários, é possível facilitar a leitura do código e indicar
pontos chaves ou inserir qualquer outro po de comentário explica vo.
Para inserir um comentário em VBA, basta inserir o símbolo de apóstrofo ( ‘
) e posteriormente o texto desejado, da seguinte maneira:

Observa-se que pela formatação padrão de cores do Excel, os comentários


aparecem em verde, todo texto inserido desta maneira, é interpretado
pela linguagem apenas como um comentário, este recurso pode ser
u lizado para “desa var” algumas linhas de código, tornando elas
comentários, desta maneira elas não serão lidas ao se executar a macro.
Capitulo 2 – Interações VBA/Excel
As automações mais simples de ro nas no Excel envolvem a aplicação de
códigos simples e obje vos que permitem a navegação dentro das células,
linhas, colunas, abas, planilhas e demais elementos que pertencem ao
Excel. Para dominar esses elementos é necessário o conhecimento de
apenas alguns poucos códigos em Visual Basic, os quais serão
apresentados a seguir, com os códigos mais u lizados e a descrição de
u lização. Posteriormente, no fim do capitulo serão apresentados
exemplos prá cos com a combinação dos códigos apresentados.
Inicialmente serão apresentadas as funções de seleção, para depois
apresentar as funções de edição.
A principal forma de interação com o Excel consiste na manipulação dos
objetos pertencentes a ele. Objetos são unidades de dados alocados na
memória que podem receber instruções para controlar seus valores e
métodos. Exemplos de objetos: Célula individual, Conjunto de Células,
Linhas, Colunas, Gráficos, Abas, Janelas e etc. Basicamente todos os
elementos que compõem a interface visual que pode ser manipulada no
Excel. O Excel trabalha também com um interessante conceito de conjunto
de objetos, desta forma existem objetos que abrangem um conjunto como,
por exemplo, Worksheets(Conjunto de planilhas) e o objeto
Worksheet(objeto individual que representa uma única planilha).
Lista dos principais objetos:

Cada objeto possui peculiaridades de instruções que podem ser dadas,


desta maneira, a seguir serão apresentados os conceitos de propriedades e
métodos, com exemplos dos principais comandos que podem ser u lizados
para manipulação dos objetos citados.
Propriedades
Quando se fala em objetos para linguagem de programação, é
extremamente semelhante a objetos reais, por exemplo, ao se descrever
um objeto para uma pessoa, pode-se dizer copo, o qual é um objeto, mas
não se especificou cor, formato, conteúdo. Uma vez que se descreva: copo,
vermelho, cilíndrico e vazio é possível passar as informações do objeto
acompanhado de suas propriedades.
Para programação VBA os objetos possuem propriedades que podem ter
suas caracterís cas alteradas, como por exemplo, o objeto Range é
responsável por representar uma célula (ou conjunto de células), a
propriedade “Value” é responsável pelo valor da célula, por exemplo:
Range(“A1”).Value = “Ok”

Desta forma, se dá a instrução para o objeto Range, receber o valor “Ok”, o


qual está entre aspas por se tratar de um texto.
Obs: o VBA assume por padrão a propriedade “Value”, caso nenhuma
propriedade subordinada ao objeto seja declarada, desta forma o exemplo
a seguir irá ter o mesmo funcionamento do anterior:
Range(“A1”) = “Ok”

Exemplo de outras propriedades subordinadas ao objeto Range:


Range(“A1”).Font.Name = “Arial”
Range(“A1”).Font.Size = 14

As propriedades serão abordadas com maior detalhamento na seção de


formatação.
Métodos
Ainda seguindo a lógica da exemplificação das propriedades, métodos
também podem facilmente ser associados a realidade, métodos são como
ações, ao se falar de um copo, pode se dar a instruções para uma pessoa
pegar o copo, o ato de pegar é uma ação, na programação em VBA essas
ações são chamadas de métodos. Os métodos permitem manipular os
objetos, onde cada um tem suas limitações e disponibilidade de u lização,
por exemplo, o método select é responsável por selecionar, ele funciona
para Range, Rows, Collumns e Worksheets, mas não funciona para
Workbooks, o método Save por sua vez, funciona para salvar uma planilha
com sua u lização no objeto Workbooks, mas não tem u lidade e nem
funcionamento para os objetos de range, essa dinâmica será explorada nos
tópicos a seguir, iniciando pelos principais métodos, aprofundando o seu
funcionamento e posteriormente citando demais métodos importantes e
suas u lidades.
Método Select
Select é sem dúvida um dos métodos mais importantes para automação de
processos no Excel, com ele é possível selecionar uma célula ou um
conjunto de células das mais diferentes formas, uma planilha ou conjunto
de planilhas, é possível também selecionar colunas e linhas, por ser um dos
métodos mais versáteis ele será abordado detalhadamente.
Para selecionar uma célula:
Range(“A1”).Select

Ou

Obs: U lizar os métodos através da instrução Cells() será especialmente


ú l quando u lizado em conjunto com as estruturas de controle, abordado
nas próximas seções.
Selecionar mais de uma célula:
Range("A1:B2").Select

Ou
Range(Cells(1,1),Cells(2,2)).Select

Selecionar uma linha por completo:


Rows(1).select

Selecionar uma coluna por completo:


Columns(1).select

A par r de uma célula já selecionada é possível selecionar toda a sua linha


ou coluna, sem necessariamente saber qual é a sua posição com o código a
seguir:
Ac veCell.En reColumn.Select
Ac veCell.En reColRow.Select

Através do conjunto de objetos de planilhas, pode-se acessar o objeto


individual para u lizar o método desejado, a instrução abaixo seleciona
abas:
Worksheets(“Plan1”).select

Ou
Sheets(“Plan1”).select

Outra maneira de selecionar abas se dá através da u lização do número da


aba em ordem da esquerda para direita (conhecido como índice), desta
forma para selecionar a primeira aba do arquivo aberto, basta u lizar o
objeto de conjunto Sheets ou Worksheets com o índice 1:
Worksheets(1).select

Ou
Sheets(1).select

Para selecionar mais de uma planilha, deve-se u lizar Array, da seguinte


maneira:
Sheets(Array(1,2,3)).select
Ou
Sheets(Array(“Plan1”, “Plan2”, “Plan3”)).select

Através do conjunto de objetos de arquivos, pode-se acessar o objeto


individual para u lizar o método desejado, a instrução abaixo maximiza o
arquivo Excel desejado:
Workbooks(“NomeDoArquivo”).Ac vate

Ou
Workbooks(1).Ac vate

Sheets (“NomeDoArquivo”).Ac vate


Ou
Sheets (1).Ac vate
Select x Ac vate:
A diferença básica entre Select e Ac vate, 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 a vo. Por exemplo, dentro da hieraquia das células,
mesmo que várias estejam selecionadas, apenas uma estará a va,
conforme exemplo abaixo:

Existem 5 células selecionadas, A1 até A5, porém apenas a célula A1 está


a va, Imagem 1.
Se o método .Ac vate for u lizado, A3 é a vada, Imagem 2:
Range("A3").Ac vate
Obs: mudar a célula a vada pode ser especialmente ú l para métodos
subsequentes que dependam da posição atualmente a vada de um objeto.

Um método de muita u lidade é o End, ele equivale a u lização dos


atalhos de teclado Ctrl + Seta direcional. Esse método é u lizado junto com
o objeto Range, da seguinte maneira:
Range(“A1”). End(xlDown).Select

É importante observar que o trecho Range(“A1”). End(xlDown) determina que


quem receberá o método select será a úl ma célula disponível de maneira
sequencial a par r de A1, na direção para baixo.
Ao invés de Range, também é possível u lizar Selec on, desta maneira a
par r da célula selecionada, a úl ma será considerada para direção
desejada, da seguinte maneira:
Selec on.End(xlDown).select
Selec on.End(xlUp).select
Selec on.End(xltoLe ).select
Selec on.End(xltoRight).select

Os códigos apresentados anteriormente são essenciais para navegação


dentro do Excel através das macros e podem ser combinados com o Range,
da seguinte forma:
Range(Selec on, Selec on.End(xlDown)).select

Desta maneira, a par r da célula(s), atualmente selecionada(s), até a


úl ma disponível em sequência serão selecionadas como na imagem a
seguir:

Combinando dois Ranges com Selecion.End, é possível fazer uma seleção


para direita, e depois para baixo da seguinte maneira apresentada abaixo:
Range(Selec on, Selec on.End(xltoRight)).select
Range(Selec on, Selec on.End(xlDown)).select

Ou poderia ser escrito apenas com:


Range(Selec on.End(xltoRight), Selec on.End(xlDown)).select
O código apresentado anteriormente sempre irá selecionar a úl ma célula
disponível em uma sequência, seja para direita, esquerda, baixo ou para
cima. Existe, porém uma forma de selecionar apenas uma quan dade
desejada. Para isso deve-se u lizar o seguinte código abaixo:
Ac veCell.Offset(X,Y).Select
Ou
Range(“A1”).Offset(X,Y).Select

Onde em X deve-se colocar a quan dade de células que serão navegadas


no eixo horizontal e em Y deve-se colocar a quan dade de células que
serão navegadas no eixo ver cal a par r da célula selecionada ou a par r
de uma célula desejada, no exemplo citado, célula “A1”
Ac veCell.Offset(2,1).Select
Ou
Range(“A1”).Offset(2,1).Select

Onde o código apresentado, da às instruções para navegar 2 células para


baixo e 1 célula para direita. Caso a par r da célula B3 se queira voltar para
a célula A1, basta u lizar 2 células para cima e 1 para esquerda, para isso,
basta u lizar os valores nega vos, como no exemplo a seguir:
Ac veCell.Offset(-2,-1).Select
Ou
Range(“A1”).Offset(-2,-1).Select

Desta forma, o código offset determina através de coordenadas a posição


rela va à posição atual que se deseja selecionar. O código Offset, pode
também ser escrito dentro de um Range, criando uma área de seleção,
como no exemplo a seguir:
Range(Ac veCell.Offset(0,1), Ac veCell.Offset(2,2)).select
Ou
Range(Range(“A1”).Offset(0,1), Range(“A1”).Offset(2,2)).select
Ou também pode ser cominado com Selecion.End, como no exemplo a
seguir:
Range(Selec on.end(xldown),Ac veCell.Offset(0,1)).select
Ou
Range(Range("A1"). End(xlDown),Range("A1").Offset(0,1)).select

Foram apresentados os principais métodos de seleção que permitem a


navegação pelas planilhas, abas, células, linhas e colunas. É importante
treinar esses métodos de seleção para entender as possibilidades que eles
permitem para a automação de um processo, tudo que se faz com o mouse
na u lização do Excel, é possível executar através das linhas de comando
apresentadas. No capítulo seguinte, serão apresentados os métodos que
u lizam a seleção.
Métodos Copiar, Recortar, Colar e Inserir
Após a seleção de uma célula desejada, é possível copiar ou recortar a
seleção para colar em outro local, para isso é necessário primeiramente
u lizar os métodos para selecionar o Range desejado, conforme
apresentado na seção anterior. Posteriormente, deve-se aplicar o método
de copiar ou recortar, conforme apresentado abaixo, deve-se então
selecionar o des no para colar, e u lizar o método para colar, conforme
exemplo a seguir:

Segue abaixo uma ro na simples de copiar e colar uma seleção de células:


Range(“B1”,”B3”).Copy
Range(“C1”).Select
Ac veSheet.Paste

Ou, de uma maneira mais simples:

Range(“B1”,”B3”).Copy Des na on:=Range("C3")

É importante ressaltar que o método de Copy pode ser u lizado sem a


declaração da aba desejada, mas a mesma também pode ser especificada,
fazendo uma cópia sem necessariamente trocar de aba. Por exemplo:
Sheets(“Plan2”).Range(“B1”,”B3”).Copy Des na on:= Sheets(“Plan1”).Range("C3")

É possível copiar uma coluna ou uma linha por inteiro, com os códigos a
seguir:
Copiar a primeira linha e colar na segunda:
Rows(1).Copy Des na on:= Rows(2)
Copiar a primeira coluna e colar na segunda:
Columns (1).Copy Des na on:= Columns (2)

O método apresentado anteriormente tem o obje vo de colar de maneira


simples, porém é possível também colar especial, considerando apenas
valores, formulas, formatos, u lizar operações e etc, de acordo com os
principais códigos a seguir:

Para colar com operação basta u lizar o termo “Opera on”, após virgula,
da seguinte maneira:

Exemplo u lizando copiar com colar especial de valores e operação de


mul plicação, onde as células A1 até A6 serão copiadas e coladas em cima
de B1 até B6 com operação de mul plicação:
Range("A1","A6").Copy
Range("B1").Select
Selec on.PasteSpecial Paste:=xlPasteValues, Opera on:=xlMul ply

Para a var a opção de transpor ao colar especial, basta adicionar virgula e


colocar Transpose:=True, conforme exemplo a seguir:
Selec on.PasteSpecial Paste:=xlPasteValues, Opera on:=xlMul ply, Transpose:=True
É possível também inserir uma linha ou coluna entre duas outras já
existentes, como no exemplo a seguir:
Columns(2).Copy
Columns(4).Select
Selec on.Insert

*Por padrão o excel desloca a coluna selecionada (no exemplo a coluna 4, equivalente a “D”, para
direita)

O mesmo também é válido para linhas com o código :


Rows(2).Copy
Rows (4).Select
Selec on.Insert

O mesmo código também poderia ser u lizado com o código Cut ao invés
de copy, desta forma a coluna trocaria de posição conforme com a imagem
a seguir:
Columns(2).Cut
Columns(4).Select
Selec on.Insert
Formatação em VBA
Para formatar células em VBA basta aplicar os métodos aos objetos do po
célula, seja através do Range(), Cells(), Selec on, Rows() ou Columns(),
todos esses vão aceitar o método das formatações que serão aplicadas a
seguir. Esse processo é extremamente importante para o tratamento de
dados brutos extraídos de banco de dados, para organização das planilhas
e demais obje vos ligados à formatação de células. Basicamente todos as
formas de formatação que são permi das pela interface do Excel, também
são possíveis de serem acessadas através das instruções em VBA.
A tabela abaixo apresenta os principais métodos para formatação das
células em VBA:

Para formatar as bordas de uma seleção, é preciso usar o comando With,


da seguinte maneira:
With Selec on
.Borders(xlEdgeLe ).LineStyle = xlCon nuous
.Borders(xlEdgeRight).LineStyle = xlCon nuous
.Borders(xlEdgeBo om).LineStyle = xlCon nuous
.Borders(xlEdgeTop).LineStyle = xlCon nuous
.Borders(xlInsideHorizontal).LineStyle = xlCon nuous
.Borders(xlInsideVer cal).LineStyle = xlCon nuous
End With

Explicação:
xlEdgeLe – Borda externa esquerda
xlEdgeRight – Borda externa direita
xlEdgeBo om – Borda externa inferior
xlEdgeTop – Borda externa superior
xlInsideHorizontal – Borda interna horizontal
xlInsideVer cal – Borda interna Ver cal

O trecho xlCon nuous determina que é uma linha con nua, pode ser
subs tuído por:
xlDash para linha tracejada
ou
xlDot para linha pon lhada

Para escolher a cor das abas:


With Ac veWorkbook.Sheets("Plan1").Tab
.ThemeColor = xlThemeColorAccent1
End With

Segue exemplos de cores para abas:


Métodos de Filtros e Ordenação
Os filtros e ordenações aplicados pelo Excel também podem ser
manipulados através de VBA através das macros, combinado com os
códigos de seleção, é um importante recurso para automa zar os
processos.
No exemplo a seguir serão filtrados apenas os números maiores que 0,
inicialmente é preciso selecionar as células do cabeçalho da tabela, através
dos códigos já aprendidos, posteriormente o filtro é aplicado:
Range("A1","B1").Select
Selec on.AutoFilter Field:=2, Criteria1:=">=0"
Ou:
Range("A1","B1").AutoFilter Field:=2, Criteria1:=">=0"

O trecho Field:=2 especifica que para seleção realizada o filtro será


aplicado na segunda posição, ou seja, na coluna B. Criteria1 significa o
critério u lizado o qual está especificado dentro das aspas. Para adicionar
um segundo critério basta escrever Criteria2 após inserir uma virgula e
assim sucessivamente para a quan dade de critérios desejados. Exemplo
com dois critérios:
Range("A1","B1").Select
Selec on.AutoFilter Field:=2, Criteria1:=">=0", Criteria2:="<40"
Ou
Range("A1","B1").AutoFilter Field:=2, Criteria1:=">=0", Criteria2:="<40"

Após a aplicação do filtro, para re rar o mesmo, basta aplicar o código a


seguir:
Ac veSheet.ShowAllData
Para classificar de acordo com os números da coluna B, é preciso u lizar o
código a seguir:
Range("A1", "C1").AutoFilter
Ac veWorkbook.Worksheets("Plan1").AutoFilter.Sort.SortFields.Add Key:=Range("B1"),
SortOn:=xlSortOnValues, Order:=xlAscending, DataOp on:=xlSortTextAsNumbers
With Ac veWorkbook.Worksheets("Plan1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orienta on = xlTopToBo om
.Apply
End With

Inicialmente é aplicada a instrução de autofilter, o que permite a posterior


aplicação do código de filtro. Para ordenar em ordem decrescente basta
subs tuir xlAscending por xlDescending. É importante notar que o código
responsável pela ordenação leva em consideração a worksheet desejada,
no caso deste exemplo “Plan1”, u liza também o cabeçalho de referência
que foi ordenado, neste exemplo B1. A DataOp on:=xlSortTextAsNumbers garante
que mesmo que a coluna possua textos, eles serão tratados e ordenados
como números.
Obs: Para classificar datas o processo é exatamente o mesmo.

Para re rar a classificação aplicada, é necessário aplicar o seguinte código


após a realização da classificação:
Ac veWorkbook.Worksheets("Plan1").AutoFilter.Sort.SortFields.Clear

Para limpar o filtro aplicado anteriormente, basta aplicar novamente o


código:
Range("A1", "C1").AutoFilter

Abrir, Salvar e Fechar e VBA


Para abrir um arquivo através do VBA basta u lizar o código a seguir:
Workbooks.Open("C: \Aula.xlsx ")
Onde dentro das aspas é preciso especificar o caminho desejado do
arquivo. Neste exemplo está sendo demonstrado um arquivo de nome
“Aula” salvo no caminho “C:/” Uma vez aberto, por padrão do Excel o
arquivo será maximizado, no capítulo seguinte, serão apresentados códigos
para alternar entre janelas de diferentes planilhas.

Para salvar um arquivo basta u lizar o código a seguir:


Workbooks("Aula ").Save

Para salvar como:


Ac veWorkbook.SaveAs Filename:=" C:\Aula.xlsx ",FileFormat:=xlOpenXMLWorkbookMacroEnabled

Neste exemplo será salvo em extensão xlsx, habilitado para u lização de


macro.

Outros exemplos com outros formatos muito u lizados:


Ac veWorkbook.SaveAs Filename:=" C:\Aula.xlsx", FileFormat:=xlOpenXMLWorkbook

Ac veWorkbook.SaveAs Filename:=" C:\Aula.xlsb", FileFormat:= xlExcel12


Ac veWorkbook.SaveAs Filename:=" C:\Aula.xls", FileFormat:= xlExcel8

Para fechar uma planilha aberta, basta u lizer o código:


Workbooks("Aula").Close savechanges:=False
Métodos para atualizar e alterar vínculo
A u lização de vínculos é uma importante caracterís ca no Excel, eles
determinam a interação entre diferentes arquivos. Desta forma, se torna
extremamente interessante automa zar a alteração ou atualização de
vínculos através de VBA, dos modos que serão apresentados a seguir:
Alterar Link:
Ac veWorkbook.ChangeLink Name:="Arquivo1", NewName:="Arquivo2",
Type:=xlLinkTypeExcelLinks
Arquivo 1 - Caminho completo do arquivo vinculado de origem para alterar
o vínculo
Arquivo 2 - Caminho completo do arquivo des no para alteração de
vínculo
É importante notar que dependendo da quan dade de dados vinculados, o
processo pode ser extremamente lento, desta forma, é recomendado abrir
o arquivo des no antes de realizar a alteração de vínculo.

Outra ro na considerada de grande importância é a de quebrar vínculos,


uma vez que seja necessário realizar o compar lhamento de planilhas que
possuam vínculos, pode ser preciso quebrar os vínculos antes de o arquivo
ser enviado. Para tanto é preciso u lizar o código abaixo:

Ac veWorkbook.UpdateLink Name:= " Arquivo", Type:=xlExcelLinks


Arquivo - Caminho completo do arquivo vinculado que se deseja atualizar
Apesar das ro nas relacionadas aos assuntos abaixo serem citadas apenas
nos capítulos posteriores, é importante ressaltar essa simples ro na, a qual
tem por obje vo de quebrar todos os links de uma planilha, sem definir
quais são os links desejados.
Dim linksarray As Variant
linksarray = Ac veWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)
Do Un l IsEmpty(linksarray)
Ac veWorkbook.BreakLink Name:=linksarray(1),
Type:=xlLinkTypeExcelLinks
linksarray = Ac veWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)
Loop
Capítulo 3 – Programação
Ainda seguindo o que foi proposto nos capítulos iniciais, este capítulo vai
abortar a lógica de programação para criar algoritmos lógicos dentro das
Sub’s, posteriormente serão aplicados os mesmo conceitos para criar
func ons, analisando inclusive as diferenças da u lização de ambas as
estruturas. O Obje vo deste livro não é o aprofundamento nos conceitos
de programação, por diversos momentos será introduzida apenas uma
visão superficial dos conceitos por trás da criação de um algoritmo em
VBA, a ênfase será sempre voltada para a produ vidade e obje vidade do
conteúdo. Desta forma, será possível abordar rapidamente diversas
possibilidades de criar funções para alto rendimento em processos e
métodos aplicados às mais diversas áreas de conhecimento.
Declaração de Variáveis
O primeiro passo são os pos de variáveis que podem ser declarados na
linguagens, através delas serão alocadas as informações para realizar o
processamento dos dados na memória, as variáveis em VBA podem ser dos
seguintes pos:

O po da variável escolhida, influência também na quan dade de memória


alocada para a mesma, desta maneira, escolher a variável correta, é
importante para o refinamento de desempenho da macro. Por exemplo,
pode-se optar por alocar como “Double” para um número inteiro, de valor
baixo, porém a memória alocada para esta variável será maior do que a
necessária caso ela fosse alocada corretamente como “Integer”.
Para declarar uma variável em VBA, é importante notar apenas algumas
limitações na escrita da mesma, como não u lizar número na frente, não
u lizar caracteres especiais e etc.
Exemplos incorretos:
Dim Var? As Integer
Dim 1Var As Integer
Dim Var-1 As Integer

Exemplos Corretos de declaração:


Dim Valor1 As Integer
Dim Nome As String
Dim ValorRecebido As Double
Dim DataRecebimento As Date
É possível também declarar diversas variáveis em uma única linha, da
seguinte forma:
Dim Valor1, Valor2, Valor3, Valor4, Valor5, Valor6 As Integer
ou
Dim Valor1 As Integer, Nome As String, ValorRecebido As Double,
DataRecebimento As Date
Objeto como variável
O VBA permite também a declaração de objetos como sendo variáveis,
desta maneira, é possível atribuir uma variável para qualquer po de
objeto dentro das planilhas.
Entende-se por objetos:
Range (Seleção)
Workbook (Arquivo)
Worksheet (Planilha)
Desta maneira é possível atribuir uma variável com o po do objeto
u lizado, por exemplo:
Dim Selecao_1 As Range
Dim Planilha_1 As Workbook
Dim Arquivo_1 As Workbook

Exemplo 2:
Sub Aprendizado()
Dim Selecao_1 As Range
Selecao_1 = Range(“A1”)
Selecao_1 = 10
End sub
No exemplo anterior, a par r 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 u lizar Selecao_1 = 10, é o mesmo que u lizar Range(“A1”) = 10.
Obs: Neste exemplo não foi declarado a Worksheet que está sendo
referida, desta forma o Excel entende a planilha u lizada como a que está
selecionada. Poderia também ser u lizado 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 po de
variável de acordo a u lização no código, porém para um funcionamento
correto e desempenho sa sfató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:

Valor1 e Valor2 são declarados como números inteiros.


A variável Valor1 recebe o valor da célula A1, através do Range(“A1”)
A variável Valor2 recebe o valor da célula A2, através do Range(“A2”)
Processando os dados, Resultado recebe o valor da soma, posteriormente
Range(“A4”) recebe Resultado:

Outra forma de declarar variáveis em VBA é através de vetores e matrizes


ou mais conhecido como Array, da seguinte forma:
Vetorial:
Dim Valor (1 To 5) As Integer
Matricial:
Dim Valor (1 To 5, 1 To 3) As Integer
*Vetores e matrizes serão explorados mais a fundo em um capítulo próprio
para Array’s.
Outro exemplo de alocação de variáveis e interação com o Excel:

O VBA interage com o Excel tanto para receber as variáveis, quanto para
colocar as variáveis na planilha, essa interação é extremamente importante
para a mecânica de funcionamento das macros e para os exemplos que
serão apresentados nos capítulos seguintes.
Variáveis em Array
Variáveis podem ser declaradas de forma vetorial e matricial, portanto,
uma mesma variável pode alocar diversos dados diferentes.
Array Vetorial (Uni-direcionais)
Uma variável pode receber informações da maneira vetorial, desta forma,
é possível alocar e retornar os dados através de índices que são indexados
numericamente em uma lista.
É possível fazer analogia com um armário de diversas gavetas, onde em
cada gaveta uma única informação pode ser alocada, supondo que a
variável ArrayVetor seja declarada para possuir 7 elementos, a declaração
se dá da seguinte maneira:
Exemplo:
Dim ArrayVetor(6) As integer
O VBA entende a estrutura da seguinte forma:

Na coluna da direita é o índice correspondente a informação que será


colocada para cada espaço vazio na esquerda.
Exemplo prá co:
Sub Aprendizado()
Dim Nomes(3) As String
Nomes(0) = "Clara"
Nomes(1) = "João"
Nomes(2) = "Maria"
MsgBox "Nomes Armazenados:" & Chr(13) & Nomes(0) & Chr(13) & Nomes(1) & Chr(13) &
Nomes(2)
End Sub

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 u lizado para pular
linha.

As variáveis são alocadas da seguinte forma no vetor:

Array Matricial (Bi-direcionais)


A forma matricial segue a mesma analogia de uma armário, porém ao
invés de ser um armário com gavetas apenas na ver cal, este agora possui
colunas, podendo armazenar os dados através de 2 coordenadas, da
seguinte declaração:
Exemplo:
Dim ArrayMatriz(7,3) As integer

Exemplo prá co:


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 obje vo de
enviar uma mensagem ao usuário, solicitando a sua confirmação através
de botões.
InputBox
Sintaxe
InputBox(prompt[, tle] [, 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 u lizar uma variável que receberá o valor que o usuário digitar,
conforme exemplo a seguir:
Valor = InputBox("Digite o valor desejado")

O dado que for digitado no campo de texto e posteriormente confirmado


no botão “OK”, será atribuído a variável Valor, u lizada para receber o valor
da InputBox.
Os demais parâmetros são opcionais, e possuem a seguinte função:

Exemplo com os parâmetros Title e Default:


Valor = InputBox("Digite o valor desejado", "Aprendizado", "99")
O mesmo exemplo u lizando os parâmetros adicionais retorna um valor
padrão já digitado no campo de texto e um tulo para janela.
MsgBox
Sintaxe
MsgBox(prompt[, bu ons] [, tle] [, helpfile, context])
Assim como no InputBox, o único parâmetro obrigatório é o Prompt, o qual
informa a mensagem para o usuário.
Os demais parâmetros são opcionais, em especial o parâmetro Bu ons,
pede o código do modelo de botão que será aplicado na janela, caso nada
seja digitado o padrão é receber apenas o botão “Ok’, conforme exemplo
abaixo:
MsgBox ("Mensagem informada ao usuário")

Os parâmetros têm as seguintes funções:

Para o parâmetro bu ons, existem diversas possibilidades, o VBA possui


estrutura com botão de OK (Opção padrão), botões de sim e não (Yes, No),
sim não e cancelar (Yes, No, Cancel) e diversos outros, a tabela a seguir,
lista as opções para preenchimento do parâmetro bu on:
Quando o usuário responde pressionando um botão o VBA interpreta esse
botão através de um número, os números correspondentes aos botões que
podem ser pressionados estão apresentados na tabela abaixo:

O Exemplo a seguir, demonstra a u lização de uma msgbox que u liza o


botão VbYesNo, se Yes for pressionado, a macro da uma resposta para o
usuário, caso No seja selecionado a resposta é diferente. É u lizada
também uma variável chamada de “resposta” a qual tem a função de
receber o valor do botão, conforme o quadro acima demonstra, se o
usuário pressionar Yes, a variável receberá o valor 6, caso contrário
receberá o valor 7.
Sub Aprendizado()
Dim resposta As Integer
resposta = MsgBox("Mensagem ao usuário", vbYesNo)
If resposta = 6 Then
MsgBox ("Usuário Respondeu Sim")
End if
If resposta = 7 Then
MsgBox ("Usuário Respondeu Não")
End If
End Sub
Formulas do Excel no VBA
As funções u lizadas no Excel, também são aplicáveis para o VBA. É
possível se referir ao objeto Applica on como método WorkSheetFunc on.
[Nome da função desejada].(argumentos)
É Importante ressaltar, que as funções devem ser u lizadas em inglês
(idioma padrão do VBA) outra diferença é que os argumentos são
separados com vírgulas ao invés de ponto e vírgula. De maneira prá ca,
muitas funções não precisam ser u lizadas, uma vez que podem ser
subs tuídas de maneira muito prá ca pelo próprio algoritmo.
Por exemplo: é extremamente mais simples somar duas variáveis, através
do algoritmo do que u lizando uma função própria do Excel, por outro
lado, é mais fácil u lizar uma função própria do Excel para realizar um
“ProcV”, “Cont.Se” e outros, uma vez que para realizar essas funções
através do algoritmo seria mais complexo.
Seguem abaixo alguns exemplos de “fórmulas” que são u lizadas no Excel
e como podem ser aplicadas em VBA.

Exemplo de u lização 1 (Cont.Se):


Sub Aprendizado()
Dim Contador As Integer
Contador = Applica on.WorksheetFunc on.CountA(Range("A:A"))
MsgBox Contador
End Sub

Exemplo de u lização 2:
Sub Aprendizado()
Dim Total As Integer
Total = Applica on.WorksheetFunc on.SumIf(Range("A:A"), ">5",
Range("A:A"))
MsgBox Total
End Sub

Obs: Para se referir a uma seleção de células, u liza-se o Range.


Dica: Como as funções precisam ser aplicadas em inglês dentro do VBA,
existe uma maneira de “traduzi-las, para isso basta colocar a função
desejada em uma célula e depois, através da verificação imediata do VBA,
“perguntar” qual a fórmula está dentro da célula, conforme imagem
abaixo:
Gravar Macros
O Excel possui uma ferramenta que permite ao usuário gravar suas macros
de maneira automá ca. Uma vez que a função seja a vada, toda ação,
clique e formatação aplicadas em determinada região, serão gravador em
um módulo no editor. Entretanto, esta função deve ser u lizada com
cautela, uma vez que ela traduz de forma extremamente literal todas as
ações, de forma análoga, o gravador de macro está para o Excel da mesma
forma como o “Google Tradutor” está para o inglês, à tradução se da de
forma mecânica e não interpreta va.
Para acessar o gravador de macros, existem duas maneiras:
Através da Guia Desenvolvedor, e posteriormente o botão
Gravar Macro
Botão inferior da tela, Gravar Macros

Posteriormente um formulário Solicita o nome da macro desejada, e a


descrição de sua função. É possível também atribuir um atalho de a vação
e o local onde a ro na será salva.
Uma vez iniciada, todas as ações serão gravadas, até o usuário determinar
o fim da macro clicando em parar gravação, nos mesmo locais onde se
opta por iniciar a gravação.
Uma vez finalizada, o módulo será gravado no local escolhido, por padrão é
inserido em um módulo separado, onde o código poderá ser visualizado e
editado pelo usuário.
Estruturas de Controle

Estruturas de controle são recursos fundamentais para a criação de


algoritmos, macros, automação de processos e etc. Através delas, é
possível aplicar condições (if – then – else), estruturas de repe ção (do –
loop) e demais estruturas que serão abordadas a seguir.
If – Then - Else
A esturua if – then – else é extremamente conhecida, principalmente pela
sua u lização dentro do próprio Excel, onde a funcionalidade é a mesma.
Da seguinte maneira:
If [Condição] Then
[se condição verdadeira]
Else
[se condição falsa]
End If
É preciso dar uma condição que será verificada, caso verdadeira ela vai
executar um código, caso seja falsa executará outro código após o Else. A
segunda estrutura não é obrigatória, podendo u lizar apenas, desta
maneira:
If [Condição] Then
[se condição verdadeira]
End If
Outra sintaxe que pode ser u lizada dentro do if é o Elseif, da seguinte
maneira:
If [Condição] Then
[se condição verdadeira]
Elseif <Condição 2]
[se condição 2 verdadeira]
Elseif [Condição 3]
[se condição 3 verdadeira]
Else
[se todas as condições forem falsas]
End If
Onde se pode atribuir um código para cada condição que seja sa sfeita,
podendo u lizar quantas condições forem necessárias, neste exemplo
foram apresentadas 3 condições.
Exemplo Prá co 1:
Ou também pode ser escrito com ElseIf
Exemplo Prá co 2:

O código tem o mesmo resultado, porém fica com uma melhor aparência e
organização, é uma prá ca altamente recomendada em programação, não
apenas para um melhor desempenho do algoritmo, mas também para
permi r futuras modificações e facilitar o entendimento para outros
usuários.
Exemplo Prá co 3:
Neste exemplo 3, é demonstrado que a estrutura If – Else – End if pode ser
u lizada com total integração com as planilhas, aplicando verificações com
variáveis, ou dentro da própria planilha.
For – Next
A estrutura For Next é uma das mais importantes dentro do VBA, ela
permite executar ciclos de estruturas de acordo com contadores pré-
definidos, onde a estrutura se comporta da seguinte maneira:
For [Inicialização do Contador] To [Valor ] Step [Valor a Incrementar]
[Instruções a realizar em cada iteração]
Next
As letras i, j, k são muito u lizadas em variáveis de contadores por
convenção e boa prá ca em programação, mas pode ser u lizada qualquer
variável, desta forma um modelo padrão de u lizar o contador do For –
Next pode ser:
For i = 1 To 10
[Instruções a realizar em cada iteração]
Next i
É importante observar que uma vez que o Step não seja escrito, o VBA
adota o valor padrão de Step 1, desta forma ele realizará ciclos somando 1
a variável i em cada ciclo. Neste exemplo, o ciclo será executado 10 vezes,
no primeiro ciclo a variável i tem o valor 1, no segundo ciclo obtém o valor
2 e assim sucessivamente.
Em exemplo semelhante:
For i = 0 To 10 Step 5
[Instruções a realizar em cada iteração]
Next i
Como neste exemplo o Step é declarado e vale 5, o ciclo é executado
incrementando 5 unidades em cada rotação, a primeira rotação, inicia com
o valor atribuído no contador de 0, o segundo ciclo soma 5, ficando i = 5,
no terceiro e úl mo ciclo é incrementado 5 ficando i = 10.
Exemplo Prá co 1:
É importante notar no exemplo anterior, que a variável i foi u lizada dentro
do range, para tanto, é necessário fechar às aspas no primeiro termo que
representa a coluna e usar & para concatenar com a variável, no caso a
variável i.
Para quando i = 1
O código vai ler da seguinte maneira:
Range(“A1”) = 1
Para quando i = 2
Range(“A2”) = 2
E assim sucessivamente, ao rodar o código por completo, ele repe rá este
processo 10 vezes, desta maneira as 10 células da coluna A são
preenchidas.
Outra forma interessante de u lizar os ciclos é u lizar a outra forma de se
referir a células, u lizando Cells(1,1) por exemplo para se referir a
Range(“A1”). Uma vez que se u liza Cells, pode se u lizar variáveis
numéricas para se referir a colunas. No exemplo a seguir, serão
preenchidos valores em linhas e colunas u lizando Cells:
Exemplo Prá co 2:
Como pode ser observado o comando Cells, permite uma flexibilidade
maior, uma vez que é possível u lizar variáveis numéricas tanto para as
linhas quanto para colunas, diferente do exemplo anterior, o valor
atribuído para cada célula é a soma de i + j, com isso o valor de cada célula
que vai da linha 1 até a 10, coluna 1 até a 3, tem o valor atribuído a soma
de i + j.
Este exemplo demonstra claramente como os ciclos de contadores com For
Next podem interagir com o Excel.
Do – While – Loop / Do – Un l – Loop
De forma semelhante ao For Next, a estrutura Do While, vai realizar ciclo
de instruções, porém a diferença é que ao invés de u lizar um contador,
será u lizada uma condição para qual enquanto for sa sfeita, o looping
será executado. Com Un l o processo é semelhante, porém o looping é
executado até a condição ser sa sfeita.
Sintaxe
Do While [Condição]
[Instruções a realizar em cada iteração]
Loop
Do Un l [Condição]
[Instruções a realizar em cada iteração]
Loop

Essa estrutra também permite a inversão, colocando o While junto ao


Loop, mudando apenas o posicionamento da condição no código, inicio ou
final, da seguinte maneira:
Do
[Instruções a realizar em cada iteração]
Loop While [Condição]
Do
[Instruções a realizar em cada iteração]
Loop Un l [Condição]

O exemplo prá co a seguir, demonstra a u lização do Do While:

A macro inicialmente seleciona a célula B2, a instrução do ciclo de


repe ção determina que enquanto a célula selecionada possuir um valor 0,
a instrução será deletar a célula, posteriormente a próxima célula é
selecionada através do offset.
O Resultado:

No próximo exemplo, é desejado fazer uma verificação dos estoques que


estão acima de 70 unidades, os que atenderem essas condições, receberão
a cor de célula vermelha, receberão um “ok” na célula ao lado, e serão
somados 20 unidades. Combinando a u lização do Do While com o If Then,
é possível apresentar o exemplo prá co a seguir:

A macro tem as seguintes instruções:

Selecionar a célula “C2”


Enquanto a célula selecionada for diferente de vazio, as
instruções serão executadas.
Se a célula selecionada for maior que 70:
Célula selecionada recebe fundo vermelho
Célula selecionada recebe o valor dela mesma
somando 20
Célula da coluna ao lado “Offset(0,1)” recebe o texto
“Ok”
Encerra o condicional IF
Seleciona a célula da linha abaixo “Offset(1,0)”
Realiza o Loop

Após executar a macro o seguinte resultado é ob do:

É importante notar que o ciclo só funciona pela combinação do Do While


Ac veCell <> “”, com o Ac veCell.Offset(1,0).Select. Desta forma caso a
célula selecionada não seja uma célula vazia, a instruções são executadas e
ao fim, a célula seguinte é selecionada para seguir novamente as
verificações e posterior ciclo. Caso o comando de
Ac veCell.Offset(1,0).Select não fosse dado, o Excel entraria em um ciclo
infinito ocasionando o seu travamento.
O comando,
Do While Ac ve <> “”
Poderia ser subs tuído por:
Do Un l Ac ve = “”

Na prá ca tem exatamente o mesmo efeito.


For – Each – Next
Esta é sem dúvida uma das estruturas mais poderosas dentro do VBA,
principalmente devido a sua interação com os objetos dentro do Excel,
assim como as estruturas anteriores, ela funciona de forma a executar um
ciclo de instruções, a diferença é que a instruções são executadas para
cada variável dentro de um grupo de variáveis.
Sintaxe:
For Each [Variável] in [Grupo]
[Instruções]
Next
A única limitação é a u lização do For Each dentro de uma estrutura de
Array’s, uma vez que ela não permite a alterar os valores do mesmo.
Porém a sua u lização mais interessante é para os conjuntos de objetos do
próprio Excel, podendo criar macros interessantes de extrema u lidade,
conforme os exemplos que serão apresentados a seguir,
No primeiro exemplo, a estrutura será u lizada para criar uma forma de
renomear as planilhas de acordo com a entrada de dados do usuário, para
isso a estrutura For-Each é u lizada para selecionar cada planilha
disponível dentro do arquivo aberto do Excel.

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.

É importante notar que como o conjunto de objetos que se deseja


selecionar é o grupo das planilhas (Worksheets) que está dentro do grupo
dos arquivos (Workbooks), ele é chamado através do comando
Ac veWorkbook.Worksheets.

No próximo exemplo a variável desejada para seleção será uma célula e a


coleção de objetos será um range, desta maneira ao u lizar a estrutura
For-Each, o algoritmo executara um looping em todas as células que
pertencem ao Range declarado.

Declara a variável “Celula” como Range


Declara a variável “Area” como Range (Este será o conjunto de
objetos)
É definido um Range para a variável “Area” (Ele se torna um
conjunto de objetos de células)

For-Each, para cada “Celula” no conjunto de objetos “Area”


Celula recebe “Texto”
Celula recebe cor de fonte branca
Celula recebe fundo vermelho
Seleciona o próximo objeto do conjunto.
Select Case Statement
Essa estrutura subs tui a u lização de if’s sequenciais (if’s, dentro de if’s),
facilitando a leitura do código e aumentando a sua simplicidade em casos
de diversas verificações para escolher um caminho a ser seguido pelo
algoritmo.
Sintaxe:
Select Case [Condição a ser sa sfeita]
Case [Expressão 1 a ser verificada]
[Instruções]
Case [Expressão 2 a ser verificada]
[Instruções]
.
.
.
Case [Expressão “n” a ser verificada]
[Instruções]
Case Else [Caso nenhuma seja atendida previamente]
[Instruções]

End Select [Condição]

Pode-se u lizar quantas “Case’s” forem necessárias, atribuindo uma


expressão a ser verificada diferente para cada uma, é possível também no
final u lizar p “Case Else”, onde caso nenhuma condição tenha sido
atendida, ela será aplicada.
O exemplo prá co a seguir, faz uma interação com o Inputbox, desta
forma, a macro solicita para digitar uma nota a ser avaliada, u lizando o
Case para verificar as condições e enviar uma mensagem para o usuário
com a resposta de uma avaliação da nota desejada. Segue abaixo o
exemplo prá co:
A macro tem as seguintes instruções:
Solicita para o usuário digitar um valor.
Instrução da estrutura Case, seleciona o Case com a condição
Nota
Verifica se a nota é menor que 5
Mensagem “Estude Mais”
Verifica se a nota é menor que 7
Mensagem “Nota Razoável”
Verifica se a nota é menor, igual 5
Mensagem “Ó ma Nota”
Caso nenhuma condição anterior seja atendida
Mensagem “Excelente Nota”
Encerra a seleção de Case
Goto Statement
A função do Goto, basicamente consiste em seu significado direito, “Ir
para”, desta maneira é possível definir desvios incondicionais no código,
onde ao chegar em determinada linha, o compilador irá pular a “leitura”
do código para a linha especificada através de uma “label”, onde no
exemplo abaixo será chamada de rotulo:
GoTo Rotulo:
<código>
.
.
.
Rotulo:
Onde “GoTo Rotulo:” consiste no ponto de par da e a label “Rotulo:”
determina o ponto de chegada do atalho, desta forma todo código no meio
do caminho é desconsiderado.
O Goto pode ser combinado com a condicional IF then, desta forma, a
par r de uma condição atendida, o Goto é realizado, de acordo com o
exemplo a seguir:

Sub Aprendizado()
Dim Var1 As Integer
Dim Var2 As Integer
Var1 = 3
Var2 = 4

MsgBox (Var2 & " maior do que " & Var1)


End Sub
Conforme a seta indica, uma vez que a condicional If - Then seja atendida,
o código pula para a linha do Rotulo indicado abaixo, ignorando a linha que
contém MsgBox ("Mensagem teste"), a qual não será exibida.
Outra forma interessante de u lizar o Goto, é através da sua combinação
com a função “On Error”, uma vez que código possua algum erro, por
padrão o depurador é a vado mostrando a linha que está com problema
no código, por muitas vezes uma solução simples para contornar erros
esperados, é a u lização do "On Error", combinado com Goto, desta forma,
é criada uma condicional para quando o código apresentar erro, pulando
assim para a label desejada, conforme exemplo abaixo:
Sub Aprendizado()
Dim Var1 As Integer
Dim Var2 As Integer
Dim Var3 As Integer
Var1 = 3
Var2 = 0
On Error GoTo Rotulo:
Var3 = Var1 / Var2
MsgBox ("Resultado: " & Var3)
Exit Sub
Rotulo:
MsgBox ("Ocorreu um erro no cálculo solicitado")
End Sub

No exemplo apresentado, a variável Var3 recebe a divisão de Var1 por


Var2, uma vez que Var2 seja zero, o resultado apresentará um erro no
código, desta forma, o “On Error Goto”, estabelece uma condicional para o
acontecimento do erro, pulando o código para o Rotulo, onde é
apresentada uma mensagem. Caso o erro não vesse ocorrido, a conta
seria executada e uma mensagem informaria o resultado.
Obs: Uma outra maneira de lidar diretamente com os possíveis erros no
código, é a u lização do “On Error Resume Next”, desta maneira, uma vez
que um erro seja encontrado na linha abaixo, esta será ignorada seguindo
para a linha posterior.
With Statement
O With é mais uma opção do VBA para facilitar a leitura, entendimento e
edição do código. Através dele, é possível simplificar a aplicação de
métodos a um único objeto, evitando a repe ção do objeto para cada
método aplicado.
Estrutura:
Objeto
With
.Método
End With

Para aplicar a formatação abaixo como demonstrado nas seções de


formatação, se daria pela aplicação do método direto ao objeto de
Range("C5", "I24").
Sub Aprendizado()
Range("C5", "I24").Interior.Color = vbWhite
Range("C5", "I24").Font.Bold = True
Range("C5", "I24").Font.Name = "Arial"
Range("C5", "I24").Font.ColorIndex = 5
End Sub

O With por sua vez separa o objeto da aplicação do método, desta forma o
objeto é citado apenas uma vez da seguinte maneira:
Sub Aprendizado()
With Range("C5", "I24")
.Interior.Color = vbWhite
.Font.Bold = True
.Font.Name = "Arial"
.Font.ColorIndex = 5
End With
End Sub
Capítulo 4 – Tratamento de erros
Durante o processo de programação, é muito comum se deparar com uma
série de erros, os quais podem possuir diferentes caracterís cas e origens.
Alguns são extremamente fáceis de serem encontrados, visto que o
próprio editor VBA indica a origem do erro, indicando inclusive em
determinados casos a linha onde o erro está efe vamente ocorrendo.
No VBA existem 3 pos principais de erros:
a) Erros lógicos
b) Erro de compilação
c) Erro de execução
Erro lógico
Este é o erro mais di cil de se localizar, visto que neste po de erro, toda
execução do código será realizada normalmente, porém o resultado final
não será aquele esperado. Desta forma é preciso realizar uma leitura
detalhada do código para encontrar o erro procurado, o famoso “Bug” do
código. O VBA facilita está procura através das ferramentas de depuração,
como citado nas primeiras seções deste livro, é possível realizar uma
leitura “passo a passo” do código através da depuração, para tanto, basta
u lizar o atalho F8, para que o código seja lido em etapas e desta forma
possa se verificar o resultado ob do pelas variáveis de maneira gradual ou
o resultado que está sendo apresentado na planilha em cada linha de
código.
Erro de compilação
Este é o erro mais simples de ser iden ficado, uma vez que o código não
será nem mesmo compilado enquanto o erro não for solucionado. O VBA
exige que as sintaxes estejam adequadas para poder efetuar a compilação,
desta maneira, qualquer código escrito de maneira errada será apontado
pelo editor assim que o usuário trocar para próxima linha, o código errado
será marcado de vermelho e só será possível compilar após a resolução do
mesmo.
No exemplo a seguir, o editor encontra um erro pela falta de um parêntese
que fecha a região do Range, a linha é destacada e é informado também a
falta do parêntese “)”.
Erro de execução
Este po de erro, permite a execução do código, porém durante a
execução, um erro será encontrado e o editor oferecerá ao usuário a opção
de parar a execução ou de depurar o código para corrigir o problema.
Existem diversas origens para o erro de execução, alguns exemplos que
causam o erro de execução com seu respec vo código:

Exemplo de erro de execução de um código que está escrito de maneira


adequada, porém a execução encontra um erro de divisão por zero:

Ao optar pela opção depurar, a linha onde o erro ocorreu é localizada e


destacada para o usuário, é preciso reparar porém que a origem do erro
não é necessariamente nesta linha. Este exemplo demonstra isso de
maneira clara, a origem do erro se dá na atribuição do valor zero a variável
b, desta maneira, é preciso interpretar o erro para encontrar a sua origem,
este exemplo por ser algo extremamente simplório, esta iden ficação é
imediata, porém em algoritmos mais complexos pode ser necessária uma
leitura completa do código com auxílio da depuração desde o início para
poder iden ficar a origem do erro.
Capítulo 5 – Controles Ac veX
Os controles Ac veX, são essenciais para simplificar a comunicação com o
usuário, desta maneira é possível inserir: botões, caixas de seleção,
combinação e listagem, barra de rolagem e etc. Diferente dos controles de
formulários, os controles Ac veX, tem a necessidade de programar a sua
funcionalidade através do VBA, o que garante também uma maior
flexibilidade na sua u lização.

Os elementos serão abordados separadamente, demonstrando sua


u lização através de exemplos prá cos, lembrando que neste capítulo os
elementos serão abordados dentro de planilhas do Excel, ainda não serão
apresentados dentro de formulários próprios.
Para inserir um elemento Ac veX, basta selecionar:
Guia desenvolvedor > Inserir > (Elemento desejado)

Uma vez que o objeto esteja dentro da planilha, ele poderá apenas ser
manipulado, através da a vação do botão Modo Design no menu superior:

Com o modo design a vo, além de poder redimensionar e reposicionar os


objetos Ac veX, com o objeto selecionado é possível acessar as suas
propriedades no botão ao lado direito do “Modo Design”, desta maneira, é
exibida uma janela que mostra todas as propriedades do objeto
selecionado.
As propriedades englobam diversos aspectos, que vão desde a aparência
do objeto, até a sua forma de apresentar os dados. É possível alterar cada
um desses elementos na caixa de propriedade. Algumas propriedades são
comuns entre todos os objetos, outros porém são par culares de
determinados objetos. Desta forma, durante a apresentação de cada um
deles nas seções a seguir, serão apresentadas as principais propriedades de
cada um deles.
As propriedades são divididas em:
Aparência
Comportamento
Dados
Diversos
Fonte
Posição
É possível ver essa classificação através da aba “categorizado”, no quadro
de propriedade dos objetos.
Exemplo das propriedades na subdivisão de categorias no VBA para uma
caixa de combinação (Combo Box).
Até o presente momento, foram apresentadas ro nas que não levam em
consideração qual objeto está vinculado com código. Porém para u lização
de Controles Ac veX, será necessário declarar a qual objeto o código se
refere. Desta forma, basta acessar o ambiente de desenvolvimento,
posteriormente, é necessário selecionar a qual planilha o objeto pertence,
posteriormente selecionar o objeto e depois declarar qual ação a vará o
código desejado.
Exemplo:

Conforme destacado em vermelho, o objeto pertence a Plan1, logo ela é


selecionada para inserir os códigos, posteriormente o ComandBu on1
(nome padrão dado pelo Excel aos botões, o que pode ser alterado nas
propriedades) é selecionado, por padrão a função click já vem a vada na
declaração. Desta forma é possível alterar a declaração para selecionar
uma nova opção desejada, automa camente uma nova Sub é criada já
com a declaração desejada.
As principais declarações são:

Obs: Para grande maioria dos casos, apenas a declaração Click será o
suficiente.
Botão (Bu on)
Principais propriedades:

Botão é o objeto de mais simples compreensão e u lização, ele


basicamente funciona como um ga lho direto para o código que será
u lizado, desta forma, a declaração mais comum é a click, ao clicar no
botão as instruções serão realizadas, conforme demonstrado nos exemplos
a seguir:
Private Sub CommandBu on1_Click()
MsgBox ("Botão Pressionado")
End Sub

Exemplo Prá co 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 desa var o botão
“Modo Design”
Caixa de Combinação (Combo Box)
Principais propriedades:

A Lista de combinação é muito u lizada para apresentar opções prontas,


rápidas e restritas ao usuário, facilitando a interação com o Excel e
a vando ro nas de maneira simples e fácil. Para tanto a sua principal
caracterís ca é a u lização da propriedade “ListFillRange” a qual atribui
uma lista de células para a caixa de combinação, basta atribuir uma coluna
da seguinte forma:

O ListFillRange foi preenchido com as células: G1:G5, logo a lista irá exibir
essas opções para o usuário. Supondo que os dados es vessem na Plan2,
bastaria colocar dentro de ListFillRange Plan2!G1:G5, ar cio que é muito
u lizado para esconder os dados que alimentam a caixa de seleção.

A propriedade LinkedCell também é comumente u lizada, com ela toda


seleção será vinculada com uma célula escolhida, desta maneira, ao
escolher uma opção, a célula vinculada receberá o mesmo valor, essa
opção não é essencial para o funcionamento, mas pode ser aplicada em
diversas situações.
Caso nenhum nome seja escolhido nas propriedades, o padrão do Excel é
ComboBox, ao abrir o ambiente de desenvolvimento, deve-se selecionar o
objeto ComboBox1, a declaração padrão é a “Change”, a qual chama a
ro na sempre que o usuário alterar a opção da caixa de seleção.
Para o próximo exemplo, deseja-se criar uma caixa de combinação que
apresente as opções de estado, uma vez que o estado seja selecionado, a
macro irá apresentar a soma da coluna correspondente na célula I4.
Obs: quando deseja-se obter o valor da caixa de combinação, deve-se usar
o nome do objeto acompanhado de Value. Desta forma ComboBox.Value
vai retornar sempre o conteúdo escolhido na caixa de seleção para o
exemplo a seguir.
Obs2: Foi necessário u lizar uma coluna K auxiliar para colocar os estados
na ver cal, pois a propriedade ListFillRange aceita apenas valores dispostos
de maneira ver cal.

Código u lizado:
Caixa de Seleção (Check Box)

A caixa de seleção é uma função de simples entendimento, são itens que


basicamente funcionam com valores de verdadeiro ou falso (True False),
caso a caixa esteja selecionada ou não. Desta maneira a ação de marcar e
desmarcar a caixa pode refle r em uma ação da macro ou pode ser
u lizado em conjunto com outro objeto que faça a verificação se as caixas
estão marcadas ou não (U lização mais comum da ferramenta).

No primeiro exemplo, serão criadas 3 Caixas de seleção, referentes a plan1,


plan2 e plan3, quando as caixas forem selecionadas, ocultarão a respec va
planilha.

Explicação:
Em propriedades só o “cap on” foi alterado, para os nomes: Plan1, Plan2 e
Plan3. O nome dos objetos permaneceu no padrão CheckBox1, CheckBox2
e CheckBox3.

Private Sub CheckBox1_Click()


If CheckBox1.Value = True Then
Worksheets("Plan1").Visible = False
Else
Worksheets("Plan1").Visible = True
End If
End Sub

Sub relacionada a primeira caixa de seleção para declaração de


click
Se o valor da caixa for verdadeiro (se es ver marcada)
Planilha plan1 não estará visível
Caso contrario
Planilha plan1 estará visível
Termina condicional

Esta mesma estrutura se repete por mais duas vezes, apenas trocando para
as demais planilhas.

Como citado anteriormente, este do de ferramenta é mais u lizado com a


combinação de outros objetos, como por exemplo o botão. O próximo
exemplo é semelhante ao anterior, porém u liza o botão para fazer a
verificação das caixas de seleção para realizar a ação das instruções.
A explicação do código é a mesma do exemplo anterior, a única diferença
fica por conta das Sub’s u lizadas, onde desta vez foi u lizado apenas uma
Sub, referente ao botão de nome padrão “CommandBu on1”, com uma
declaração de click, desta forma, quando o usuário clica no botão, ele
verifica as caixas de seleção, aquelas que es verem marcadas, terão as
respec vas planilhas ocultas.
Botão de Opção (Op on Bu on)

O botão de opção é um mecanismo para escolha entre opções disponíveis,


permi ndo para o usuário selecionar apenas uma opção dentro de um
grupo, para tanto este objeto possui a declaração específica chamada
GroupName, por padrão ela vem com o nome da planilha que está sendo
u lizada, porém este valor pode ser alterado para criar diversos grupos de
Botões de Opção. Este objeto é amplamente u lizado para formulários,
ques onários, testes e etc, conforme os exemplos a seguir:

Nome dos elementos declarados nas propriedades:

Todos os objetos receberam na propriedade o GroupName com nome de


“Pergunta1”, uma vez que seja desejado criar uma outra pergunta, esta
deverá ter um GroupName diferente para as respostas.

Explicação:
Private Sub Resp1_Click()
If Resp1.Value = True Then
Range("C16") = "Errado"
Range("C16").Font.ColorIndex = 3
End If
End Sub

Sub relacionada ao primeiro botão de opção para declaração de


click
Se o valor da caixa for verdadeiro (se es ver marcada)
Célula “C16” recebe o texto “Errado”
Termina condicional

Esta mesma estrutura se repete por mais três vezes, apenas trocando para
as demais planilhas e alterando de errado para certo no objeto Resp2.
Caixa de Listagem (ListBox)
Principais propriedades:

O funcionamento da caixa de listagem é rela vamente simples, ela pode


ser u lizada com o mesmo propósito da Caixa de Combinação, porém sem
muita eficiência, uma vez que a lista fica totalmente exibida ocupando um
espaço maior na tela. A caixa de listagem é muito u lizada com o propósito
de adicionar ou remover itens de uma lista. Desta maneira, a forma mais
clara de mostrar o seu funcionamento é através de exemplo, onde ela é
combinada com botões para realizar a função de adicionar e remover itens
em uma caixa secundária.

Principais Métodos:

A Montagem consiste basicamente em uma caixa de listagem 1 (caixa


esquerda) que contém todos os elementos, na caixa de listagem 2 (caixa
direita), terão apenas os elementos que serão manipulados pela macro
(neste exemplo, somados seu valores de preço), desta maneira, deseja-se
adicionar um botão para adicionar itens na lista direita e um outro botão
para remover os itens que forem selecionados, respec vamente através
dos botões (“Add >>” e “<< Remover”).
Explicação:
Nome dos elementos declarados nas propriedades:

Private Sub BT_Add_Click()


Lista2.AddItem Lista1.Value
Lista2.Selected(Lista2.ListCount - 1) = True
End Sub

Sub relacionada ao objeto BT_Add para declaração de click


Para o objeto Lista2 u liza-se o método AddItem cujo valor está
selecionado na Lista1
Lista2.ListCount Retorna o número total de elementos na lista, é
u lizado -1 pois a contagem começa no 0. Combinando o
listcount com o Selected = True, seleciona o úl mo da lista.
Private Sub BT_Remover_Click()
If Lista2.ListIndex >= 0 Then
Lista2.RemoveItem Lista2.ListIndex
End If
End Sub

Sub relacionada ao objeto BT_Remover para declaração de click


U liza uma condicional para verificar se a contagem de itens
através do método ListIndex é maior ou igual a zero, caso seja
ele procede para próxima linha
RemoveItem Remove
o item, para isso deve-se informar o
número do item que se deseja remover, ListIndex
retorna o número equivalente ao item selecionado,
desta forma combinando os dois métodos o item
selecionado é removido.
Finaliza a condicional

Private Sub Lista2_Change()


Dim SubTotal As Double
Dim Fruta As String
Range("H16").ClearContents

For i = 0 To Lista2.ListCount - 1
Fruta = Lista2.List(i)
SubTotal = Applica on.WorksheetFunc on.VLookup(Fruta, Plan1.Range("A3:B14"), 2, False) +
Range("H16")
Range("H16") = SubTotal
Next

End Sub

Sub relacionada ao objeto Lista2 para declaração change


(alteração)
Variável SubTotal declarada como double
Variável Fruta declarada String
Sempre que a ro na começar a célula H16 tem seu valor limpo
For To u lizado para fazer o ciclo de zero até o
número total de itens -1 (porque a contagem começa
em zero)
Variável Fruta recebe o valor do item na Lista2 rela vo a
posição i do ciclo
SubTotal da venda equivalente a Fruta do ciclo i, somado
ao valor atual do Range("H16")
Range("H16") recebe o valor de SubTotal, atualizando desta forma o
seu valor
Próximo i do ciclo
Capítulo 6 – Funções
Como citado nas seções iniciais, a diferença básica entre as Subro nas e as
funções, se dá por conta do retorno de valor. Portanto uma Subro na,
pode dar uma série de instruções, u lizar uma série de métodos e
procedimentos, com o simples obje vo de processar os dados, sem
retornar necessariamente um valor, a função por outro lado, funciona de
maneira semelhante, porém tem a obrigatoriedade de retornar um valor
no final de sua execução.
Introdução
De maneira prá ca, entende-se função, uma série de instruções que
processam os dados e retornam um valor, são de grande u lidade para
aplicar formulas que serão repe das diversas vezes ao longo do código,
desta forma é possível manter uma maior organização e facilitar a leitura
do código por outros usuários.
É importante ressaltar que é necessário u lizar uma Subro na para dar a
entrada dos dados que serão processados na Func on, desta forma a
Func on gera uma informação final que é retornada para sub.

Explicação:

Inicia-se a sub “Aprendizado”


U liza-se uma msgbox que solicita a função Area com as
variáveis 3 e 5.

Inicia-se a func on Area que exige 2 valores do po long, X e Y,


os quais recebem os valores 3 e 5 da sub aprendizado.
Variável Area recebe o valor de X mul plicado por Y
Func on finalizada

Retornar o valor para sub, a qual apresenta o resultado através


da msgbox
Sub finalizada
Diferença de ByRef e ByVal
ByRef significa By Reference (Por referência), ByVal significa By Value (Por
valor), a diferença básica se dá no tratamento das variáveis. Caso não seja
declarado como no exemplo anterior, por padrão o Excel adota ByRef.
ByRef
A variável é referenciada, desta forma, tudo que a função fizer com a
variável que altere o seu valor original, ele permanecerá alterado na
memória ao sair da função.
ByVal
A variável tem uma cópia de seu valor u lizado na função, desta forma
toda alteração de valor na variável, será apenas para fins de execução da
função, este valor não permanecerá alterado ao sair da função, ele vai
manter o valor original antes de ter entrado na função.
No exemplo a seguir, fica simples visualizar a diferença entre ByRef e ByVal:
Func onCalc(ByVal x As Integer) As Integer
x=x*3
Mult = x
End Func on

Sub Aprendizado()
Dim x As Integer
x = 10
Call Calc (x)
MsgBox x
End Sub

Como a foi u lizado ByVal, o valor do X se manteve original, mesmo que a


func on tenha mul plicado por 3, o valor na sub permaneceu inalterado.
Por outro lado, caso se seja u lizado ByRef:
Func onCalc(ByRef x As Integer) As Integer
x=x*3
Mult = x
End Func on

Sub Aprendizado()
Dim x As Integer
x = 10
Call Calc (x)
MsgBox x
End Sub

Exemplo de função que processa os dados de uma equação do segundo


grau:

Func on EqSegGrau(ByVal a As Double, ByVal b As Double, ByVal c As Double, ByVal Sinal


As Boolean) As Double
Dim delta As Double
Dim resultado As Double
delta = b ^ 2 - 4 * a * c
If Sinal = True Then
On Error Resume Next
EqSegGrau = (-b + Sqr(delta)) / (2 * a)
Else
On Error Resume Next
EqSegGrau = (-b - Sqr(delta)) / (2 * a)
End If
End Func on
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 obje vo a criação de
interfaces de interação com o usuário, permi ndo criar janelas
personalizadas, com a u lização de objetos, dos quais alguns já foram
apresentados na seção de Ac veX e outros novos elementos que serão
apresentados nesta seção, os quais terão maior u lidade para os
formulários propriamente ditos.
Esta ferramenta, tem uma grande u lidade 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.

O formulário, consiste basicamente em uma janela que pode ser


totalmente customizada, através dos elementos presentes na caixa de
ferramenta (caso não esteja exibida, basta acessar o menu superior, na aba
Exibir > Caixa de ferramentas).

Diferente dos módulos comuns, que possuíam apenas a interface de


código para edição, dentro de uma UserForm, é preciso alternar entre duas
interfaces de trabalho, uma é a interface objeto, a janela conforme
apresentada na imagem anterior, e a outra é a já conhecida interface de
código, a qual pode ser acessada clicando com o botão direito no
UserForm e selecionando exibir código. Todo objeto implementado na
interface objeto, pode ser programado de forma bem semelhante ao
Ac veX, basta selecionar o objeto e a declaração para criar uma SubRo na
específica para a ação desejada. Para facilitar a compreensão o exemplo a
seguir, demonstra de forma simples a implementação de um UserForm que
alterna entre as abas do Excel.
Para criar esta ferramenta, foram adicionados dois botões dentro do
UserForm e posteriormente foram codificados métodos para a ação de
clicar no botão, para isto, basta acessar Exibir Código, ou dentro do próprio
modo de Objeto, clicar duas vezes no objeto que se deseja implementar o
algoritmo. Uma vez acessada a tela de código, basta implementar os
métodos responsáveis pela seleção de planilhas, para ambos os botões:
Modo Objeto:

Modo Código:

Explicação:
SubRo na para o evento de click no botão “CommandBu on1”
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

SubRo na para o evento de click no botão “CommandBu on2”


Se o índice da planilha selecionada for 1 então seleciona a
úl ma planilha
Caso contrario, selecionar a planilha (índice da atual - 1 )
Termina condicional

Obs: Os nomes apresentados no exemplo, são os padrões do VBA, da


mesma forma como nos objetos Ac veX, é possível também alterar as
propriedades conforme mostrado nas seções anteriores, para acessa-las,
basta clicar no menu superior em Exibir > ‘Janela Propriedades’. Ou através
do atalho F4.
Capítulo 8 – Interação com outras
aplicações
Esta é uma caracterís ca extremamente poderosa do VBA, a qual
possibilita a interação com outras aplicações do pacote office. Neste
capítulo, será abordada a interação com o Word, PowerPoint, Outlook.
É preciso citar que embora esta seção aborde o procedimento de interação
com as outras aplicações, para manipular as mesmas é necessário explorar
o VBA para cada uma delas. Como a ênfase deste livro é o VBA para Excel,
os métodos e objetos das outras aplicações serão demonstrados apenas
em suas formas mais elementares.
Adicionar a biblioteca
O primeiro passo é adicionar as bibliotecas de cada so ware desejado,
para tanto basta acessar o editor VBA, através do atalho Alt + F11, clicar
em Ferramentas > Referencias, conforme a imagem abaixo:

Posteriormente, basta a var as bibliotecas dos so wares desejados,


conforme a imagem abaixo:
Introdução
Para poder interagir com uma aplicação externa é necessário criar uma
variável do po objeto para u lizar como referência para o so ware
desejado. Posteriormente a variável receberá o objeto através do método
CreateObject, para facilitar a explicação, o exemplo abaixo demonstrara a
simples ação de declarar uma variável como objeto e atribuir a mesma à
aplicação do Word.
Sub Aprendizado()
Dim wrdapp as object
Set wrdapp = CreateObject(“Word.Applica on”)
wrdapp.Documents.Add
wrdapp.Visible = True
Wrdapp.Quit
End Sub

Declara a variável wrdapp como objeto


Wrdapp recebe o método CreateObject com declaração
Word.Applica on
U liza-se o método Documents.Add para criar um novo arquivo
Torna este arquivo visível
Por fim a aplicação é encerrada
Este código exemplifica de forma clara o processo de abrir o Word, criar
um novo documento em branco e por fim fechar a aplicação.
Conforme citado previamente, cada aplicação possui seus próprios
métodos e objetos. No exemplo u lizado previamente, para criar um novo
documento foi u lizado o método Documents.Add, o mesmo por sua vez
não funcionaria no PowerPoint, o qual necessita de um método específico
para adicionar uma apresentação, no caso seria a Presenta ons.Add, para
abordar de forma individual os principais métodos de cada plataforma, as
seções a seguir vão destacar os principais comandos.
Interação com Outlook
Como apresentado previamente, o primeiro passo é criar uma variável do
po objeto para receber a aplicação. Com a interação do Outlook, é
par cularmente recomendado criar um novo objeto que representará o e-
mail que será enviado. A tabela a seguir apresenta os principais métodos e
objetos do Outlook.

Exemplo:
Sub Send_Mail()
Dim OutApp As Object
Dim OutMail As Object
Dim bMessage As String
Set OutApp = CreateObject("Outlook.Applica on")
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 = "exemplo@email.com"
.CC = "copia@email.com"
.BCC = "copiaoculta@email.com"
.Subject = "Assunto do email"
.Body = bMessage
.A achments.Add ("C:\exemplo.txt")
.Send
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
End Sub

Esta macro demonstra a u lização de código em VBA para enviar um e-mail


completo, com des natário, cópia, cópia oculta, assunto e mensagem. É
importante observar que foi u lizada uma variável para o corpo da
mensagem apenas para organizar o código, u lizando o comando
vbNewLine concatenado para poder pular de linha.
É importante também observar que o método .Send foi u lizado, desta
forma o e-mail é diretamente enviado aos des natários, caso fosse
necessário o usuário realizar uma verificação final da mensagem antes de
enviá-la, seria possível u lizar o método .Display, desta forma a mensagem
seria exibida antes de ser enviada aos des natários. O processo de envio
seria realizado apenas após a confirmação manual do usuário.
Interação com o PowerPoint
Ao contrário do Outlook, o VBA aplicado ao PowerPoint, possui uma
variedade muito maior de objetos e métodos. Conforme citado na
introdução, o foco deste livro é na programação VBA Excel, desta forma
serão apresentados e exemplificados apenas os principais comandos do
so ware pare realizar uma interação com o Excel.

O exemplo abaixo realiza uma cópia de uma seleção de células no Excel e


copia para uma nova apresentação no PowerPoint.
Exemplo:
Sub Aprendizado()
Dim iRange As Range
Dim PptObj As Object
Dim iPresent As Object
Dim iSlide As Object
Dim iShape As Object
Set iRange = Selec on
Set PptObj = CreateObject(class:="PowerPoint.Applica on")
Set iPresent = PptObj.Presenta ons.Add
Set iSlide = iPresent.Slides.Add(1, 11)
iRange.Copy
iSlide.Shapes.PasteSpecial DataType:=2
Set iShape = iSlide.Shapes(iSlide.Shapes.Count)
iShape.Le = 100
iShape.Top = 160
PptObj.Visible = True
PptObj.Ac vate
End Sub

Declara a variável iRange como Range


Declara as variáveis PptObj, iPresent, iSlide, iShape e iRange como
objetos
Atribui a variável iRange com a seleção dos dados no Excel
Atribui a variável PptObj a criação de um novo objeto, a aplicação
do PowerPoint.
A variável iPresent recebe a nova apresentação que será
adicionada com o método Presenta ons.Add
A variável iSlide o novo slide que será adicionado com o método
.Slides.Add o argumento 1 indica que o slide é adicionado na
posição 1, e o argumento de número 11 representa o layout deste
slide.
A seleção de dados do Excel, representados pela variável iRange é
copiada
A variável iSlide que representa o slide criado, é u lizada com o
método .Shapes.PasteSpecial para colar as informações dentro do
slide.
A variável iShape recebe esta nova forma criada.
A posição da forma é definida a 100 px de distância da esquerda
A posição da forma é definida a 160 px do topo
O objeto PowerPoint recebe o método visível para aparecer para o
usuário
O objeto PowerPoint recebe o método Ac vate para maximizar a
aplicação

Através das interações com o PowerPoint, o mais importante é saber como


manipular os slides, copiar e colar objetos do Excel para o local desejado.
Neste exemplo foi fundamental a criação de diversas variáveis que
representaram cada elemento ao qual se desejava manipular, o primeiro
passo sendo sempre a criação e associação do objeto que representará a
aplicação. Os demais objetos representaram a nova apresentação, a
seleção copiada do Excel, a forma (shape) que receberia as informações no
PowerPoint e etc, conforme previamente destacado acima.
É importante citar que o colar especial u lizado no PowerPoint ui lizou um
DataTyper:=2, o que basicamente cria uma nova forma (shape) no
PowerPoint, onde as informações serão coladas de maneira gráfica.
Posteriormente a forma foi manipulada para ser posicionada em um local
desejado, no exemplo a 100 px da esquerda e a 160 px do topo.
Interação com o Word
A interação com o Word é bem simples, é apenas necessário u lizar
métodos e propriedades para criar um novo documento e então exportar
os dados necessários. É possível exportar cada célula de maneira individual
como um texto, ou até mesmo exportar uma seleção em forma de tabela.

O exemplo a seguir, cola cada célula de maneira individual em diferentes


linhas do Word, conforma ilustrado na imagem abaixo:

Sub Aprendizado()
Dim objWord As Object
Dim objDoc As Object
Dim strValue As String
Set objWord = CreateObject("Word.Applica on")
objWord.Visible = True
Set objDoc = objWord.documents.Add
Dim i As Integer
For i = 1 To 10
objDoc.Ac vate
strValue = Cells(i, 1)
objWord.Selec on.TypeText Text:=strValue
objWord.Selec on.TypeParagraph
Next i
End Sub

Declara a variável objWord e objDoc como objeto


strValue é declarado como String
Atribui a variável objWord como a aplicação Word
Torna o Word visível
Atribui a variável objDoc como um novo documento adicionado
Declara a variável i como integer
Realiza um laço por 10 vezes com For To
Atribui a variável strValue a célula na linha
equivalente a i e coluna 1
U liza o método TypeText para digitar no documento
Word o valor da célula
O documento representado por objWord recebe o
método para pular de linha
Finaliza o laço

Assim como todas as demais aplicações o primeiro passo é criar uma


variável do po objeto que receberá a aplicação do Word. Posteriormente
foi u lizado a variável objDoc para receber o novo documento que foi
criado, através desta variável, os métodos para manipular o texto e realizar
as interações com o Excel foram realizados de forma simples.
Capítulo 9 – Estudos de caso
Esta seção tem por obje vo apresentar projetos com um maior nível de
complexidade, projetos que englobam diversos conceitos apresentados e
explorados nos capítulos anteriores. Os projetos terão diferentes obje vos
prá cos, permi ndo aprender a conexão dos conceitos, a u lização deles
com o obje vo de gerar um projeto, criar uma solução, ou até mesmo,
desenvolver aplicações comerciais. Diferente dos exemplos já u lizados, os
quais em sua maioria foram demonstrados em sua totalidade de código e
posteriormente explicados, nesta seção alguns projetos serão
apresentados de forma gradual, para facilitar o entendimento do fluxo de
raciocínio e criação das soluções.
1º Projeto - Trocar o nome de todas as abas
Esta Macro tem por obje vo, facilitar a troca do nome de todas as abas de
maneira sucessiva, u lizando laços de repe ção para cada aba dentro do
conjunto de abas.
Sub TrocarNomeAba()
Dim NovoNome As String
For Each Sheet In Worksheets
RotuloRetorno:
Sheet.Select
NovoNome = InputBox("Qual o novo nome para esta Aba ?")
If NovoNome = "" Then
Exit Sub
End If
On Error GoTo RotuloRetorno:
Ac veSheet.Name = NovoNome
Next
End Sub

Declara a variável NovoNome como String


Para cada aba dentro do conjunto de abas
Atalho para retorno
Seleciona a aba correspondente ao laço
NovoNome recebe o valor digitado na InputBox
Caso o nome seja vazio, finaliza a macro para
evitar erros
Finaliza a condicional
Estabelece que caso apresente erro, retorne para o rotulo.
O obje vo aba com a propriedade nome, recebe o valor de
NovoNome
Próximo laço
2º Projeto - Salvar cada aba como arquivo Excel
Esta macro tem por obje vo salvar cada aba de um arquivo como
diferentes arquivos, desta forma será u lizado um laço de repe ção para o
intervalo de i = 1 até o número total de abas do arquivo
(Worksheets.Count).
Obs: O valor em negrito representa o diretório onde o arquivo será salvado
Sub SalvarAbas()
Dim wkb, NomeArquivo, Diretorio As String
wkb = Ac veWorkbook.Name
Diretorio = "C:\Users\usuarioteste\Documents"
For i = 1 To Worksheets.Count
Worksheets(i).Select
NomeArquivo = Ac veSheet.Name
Ac veSheet.Copy
Ac veWorkbook.SaveAs Filename:=Diretorio + "\" + NomeArquivo + "." &
"xlsx"
Ac veWorkbook.Close
Workbooks(wkb).Ac vate
Next
MsgBox ("Arquivos salvados com sucesso")
End Sub

Declara as variáveis wkb, NomeArquivo e Diretorio como string


Atribui para variável Diretorio o valor desejado (A pasta onde os
arquivos serão salvados)
Inicia o laço com o valor 1 (primeira aba) até Worksheet.Count
(úl ma aba)
Seleciona a aba de valor i (valor i do laço de repe ção)
A variável NomeArquivo recebe o nome da aba
Copia a aba a va
Salva o arquivo no diretório especificado, com o nome
da aba como nome do arquivo, com extensão xlsx.
Fecha o arquivo que foi copiado salvado
A va o arquivo principal
Avança para o próximo laço
Após todos os laços, mensagem para o usuário de que os
arquivos foram salvados com sucesso.
3º Projeto - Salvar cada aba como PDF
Esta é uma variação da macro anterior, porém nesta ro na os arquivos são
exportados como PDF.
Obs: O valor em negrito representa o diretório onde o arquivo será salvado
Sub SaveWorkshetAsPDF()
Dim ws As Worksheet
Dim Diretorio As String
Diretorio = "C:\Users\usuarioteste\Documents"
For Each ws In Worksheets
On Error Resume Next
ws.ExportAsFixedFormat xlTypePDF, Diretorio & "\" & ws.Name & ".pdf"
Next ws
End Sub

Declara a variável ws como Worksheet e a variável Diretorio


como String
A variável Diretorio recebe o valor da pasta desejada
Para cada ws (aba) no conjunto de worksheets(conjunto das
abas)
Caso apresente erro, resumir para a próxima instrução
Próxima aba

Obs: O mo vo da u lização da instrução “On Error Resume Next” se da


pelo fato de que erros podem ser esperados para esta macro, por exemplo,
caso uma aba não tenha nenhum valor preenchido, uma vez que a macro
tentasse exportar como PDF, apresentaria um erro do Excel informando
que não se pode exportar para PDF uma aba sem nenhuma informação,
desta forma, pode-se ignorar este po de erro e avançar para a próxima
aba.
4º Projeto - Atualizar todos os vínculos
Esta macro tem por obje vo atualizar todos os vínculos de um arquivo
Exel, de maneira simples e rápida os conceitos de laço de repe ção são
aplicados em conjunto com o conceito de conjunto de objetos.
Sub AutalizarLinks()
Dim linksarray As Variant
linksarray = Ac veWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)
For i = 1 To UBound(linksarray)
Ac veWorkbook.UpdateLink Name:=linksarray(i),
Type:=xlLinkTypeExcelLinks
Next i
End Sub

Variável linksarray declarada como Variant


linksarray recebe o objeto Workbook com método de fonte de
vínculo (LinkSources)
Realizar laço de repe ção de i = 1 até a quan dade de
informações con das em linksarray
Objeto Workbook com método de atualização de link
aplicado a variável linksarray(i)
Próximo valor do laço
Finaliza Sub
5º Projeto – Sistema de Login e senha sem formulário
Este é um sistema simples de Login para apenas usuários cadastrados
acessarem a planilha.
Obs1: É preciso alterar o nome do arquivo, a extensão e o diretório,
marcados em negrito.
Obs2: O código precisa da declaração Auto_Open() para funcionar.
Obs3: Para alterar e criar usuários com senha, basta alterar os trechos em
negrito, para adicionar, basta incluir uma nova linha, seguindo a
numeração, Usuario(4), Usuario(5) e assim sucessivamente. Para senha é a
mesma lógica, Senha(4), Senha(5) e assim sucessivamente.
Sub Auto_Open()
Dim Usuario(1 To 999) As String
Dim Senha(1 To 999) As String
Dim UsuOK As Boolean
Dim SenhaOK As Boolean
'Cadastro de Usuários
'-------------------
Usuario(1) = "Luiz"
Usuario(2) = "Maria"
Usuario(3) = "Clara"
'-------------------
Senha(1) = "1345"
Senha(2) = "1234"
Senha(3) = "5367"
'-------------------
UsuOK = False
SenhaOK = False
Retorno:
UsuarioEntrada = InputBox("Digite o seu nome de usuário: ")
For i = 1 To 999
If Usuario(i) = UsuarioEntrada And Usuario(i) <> "" Then
UsuOK = True
GoTo Rotulo1:
End If
Next
Rotulo1:
If UsuOK = True Then
SenhaEntrada = InputBox("Bem Vindo(a): " & UsuarioEntrada & ", digite
a sua senha:")
If Senha(i) = SenhaEntrada Then
Exit Sub
Else
pergunta = MsgBox("Senha incorreta, deseja tentar novamente ?",
vbYesNo)
If pergunta = 6 Then
GoTo Retorno:
Else
MsgBox "O Arquivo será fechado"
Ac veWorkbook.Close
End If
End If
Else
pergunta = MsgBox("Usuário não encontrado, deseja tentar novamente
?", vbYesNo)
If pergunta = 6 Then
GoTo Retorno:
Else
MsgBox "O Arquivo será fechado"
Ac veWorkbook.Close
End If
End If
End Sub

Declara as variáveis Usuario e Senha como String, UsuOK, SenhaOK


como boleanas
São informados os usuários cadastrados
São informadas as senhas correspondentes a cada usuário
De inicio UsuOK e SenhaOK são declarados como falsos
Retorno: é um atalho para retorno do código
U liza uma InputBox para perguntar o nome de usuário e atribui a
variável UsuarioEntrada
Laço realizado de 1 até 999 (número limite de usuários
estabelecido)
Verifica se o nome do usuário está cadastrado
Se es ver, UsuOK recebe o valor verdadeiro
Finaliza a codicional
Se UsuOK for verdadeiro
U liza uma inputbox para perguntar a senha e atribui a
variável SenhaEntrada
Verifica se a senha(i) cadastrada corresponde a senha
digitada
Caso corresponda segue Exit Sub para terminar
a macro
Caso contrário uma MsgBox com pergunta de
Sim e Não informa que a senha está incorreta e
pergunta se o usuário deseja tentar novamente
Caso sim, u liza o rótulo de retorno
para voltar
Caso não, informa que o arquivo será
fechado e fecha o arquivo
Finaliza condicional
Finaliza condicional
Caso contrário UsuOK for falso.
Informa que o usuário não foi encontrado e pergunta se
deseja tentar novamente.
Caso a resposta seja sim, segue o rótulo de
retorno
Caso não, informa que o arquivo será fechado e
finaliza o arquivo.
Finaliza condicional
Finaliza condicional
6º Projeto – Controle de Acesso a Planilha
Esta macro tem por obje vo computar os dados dos usuários que acessam
a planilha, registrando desta forma, a data, o horário e o nome do usuário.
É interessante notar a aplicação do objeto Applica on.UserName que tem
por obje vo capturar o nome do usuário cadastrado na rede ou no
computador pessoal.
Obs 1: Esta macro presume a criação de uma aba chamada “Controle de
Acesso”, onde os dados ficarão registrados no Excel.
Obs 2: A Sub recebe intencionalmente o nome Auto_Open para ser
executada quando a aplicação do Excel for aberta.
Sub Auto_Open()
Dim linhas As Integer
Dim Data, Hora As Date
Data = Date
Hora = Time
linha = Applica on.WorksheetFunc on.CountA(Worksheets("Controle de
Acesso").Range("A1", "A1048576")) + 1
Worksheets("Controle de Acesso").Range("A" & linha) =
Applica on.UserName
Worksheets("Controle de Acesso").Range("B" & linha) = Data
Worksheets("Controle de Acesso").Range("C" & linha) = Hora
Columns(1).AutoFit
Columns(2).AutoFit
Columns(3).AutoFit
End Sub

Declara as variáveis Linhas como Integer, Data e Hora como


Data.
Variável Data recebe Date
Variável Hora recebe Time
Variável linha recebe o número de registros encontrados nas
linhas da aba Controle de Acesso
Aba Controle de Acesso recebe na célula A e linha
correspondente a variável o nome Usuário
Célula B e linha correspondente a variável recebe a data
Célula C e linha correspondente a variável recebe a Hora
Coluna 1 recebe o método AutoFit
Coluna 2 recebe o método AutoFit
Coluna 3 recebe o método AutoFit
7º Projeto – Formulário de cadastro de Cliente
Este projeto é de ampla u lização, o mesmo tem diversas aplicações nos
mais variados setores. O obje vo desta solução, é a u lização da mesma
por usuários leigos, desta forma busca-se evitar erros, criar uma interface
intui va de rápido aprendizado com o mínimo de procedimentos
necessários para a ngir o obje vo da solução que é realizar o cadastro de
clientes.
A imagem abaixo apresenta a interface final do projeto, com quatro botões
principais, com o obje vo de:
Inserir – Adicionar um novo cliente
Salvar – Atualizar um cliente já existente
Excluir – Remover cadastro de cliente
Pesquisar – Buscar cadastro do cliente
Exis rá também um botão auxiliar, apenas para limpar todos os campos
para um novo preenchimento.

O primeiro passo do projeto é estabelecer os dados de cadastros


desejados, a par r deles é preciso criar uma planilha que receberá essas
informações, conforme a imagem a seguir:

A seguir, deve-se criar os formulários necessários associados aos dados de


cadastro, desta maneira, cada caixa de texto corresponderá a um dado que
será armazenado no Excel.
Obs 1: A caixa que mostra os clientes cadastrados, é uma caixa de listagem
com a opção ColumnHeads marcada como True, desta forma ela apresenta
a primeira linha como cabeçalho.
Formulário principal:

Formulário de pesquisa:

Uma vez que toda a interface de usuário já está pronta, pode-se começar a
programar as funções relacionadas a cada elemento do projeto.

Os objetos que foram programados e/ou referenciados, possuem as


seguintes nomenclaturas:
Arquivo
ARQ_CADASTRO

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

Obs: os objetos destacados veram métodos declarados diretamente para


sua u lização, os demais foram referenciados dentro dessas declarações.

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 u lizar 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 po string que receberão as informações da
caixa de texto
Variável do po long que receberá o numero total de
linhas do banco de dados
Variável do po booleana que permi rá ou não a leitura
do código dentro da Sub “LB_CLIENTES_Change” que será
apresentada posteriormente

Private Sub UserForm_Ini alize()


ChangesOK = True
LB_CLIENTES.RowSource = "Cadastro!A2:I" & Applica on.WorksheetFunc on.CountA(Range("A2",
"A1048576")) + 1
TXT_COD = Applica on.WorksheetFunc on.CountA(Range("A:A")) + 1
End Sub

2. Formulário Cadastro
Sub relacionada a abertura do formulário [Declaração
UserForm.Ini alize()]
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, u lizando o número de linhas já preenchidas +1
Private Sub BT_INSERIR_Click()
numlinhas = Applica on.WorksheetFunc on.CountA(Range("A:A")) + 1
TXT_COD = Applica on.WorksheetFunc on.Max(Range("A:A")) + 1
Call UpdateText
If nome = "" Or cpf = "" Or endereco = "" Then
MsgBox ("Formulário incompleto")
Else
Call Insert
LB_CLIENTES.RowSource = "Cadastro!A2:I" & Applica on.WorksheetFunc on.CountA(Range("A2",
"A1048576")) + 1
End If
LB_CLIENTES.Selected(LB_CLIENTES.ListCount - 1) = True
End Sub

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 úl ma 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 po 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 intui va, a
nova linha é selecionada.

Public Sub UpdateText()


cod = TXT_COD.Value
nome = TXT_NOME.Value
uf = CB_UF.Value
cidade = TXT_CIDADE.Value
endereco = TXT_ENDERECO.Value
rg = TXT_RG.Value
cpf = TXT_CPF.Value
telefone = TXT_TELEFONE.Value
celular = TXT_CEL.Value
End Sub

4. Sub Ro na UpdateText()
A subro na UpdateText(), tem por obje vo atribuir os textos/valores
inseridos nas caixas de texto às variáveis já declaradas previamente.
Public Sub Insert()
Range("A" & numlinhas) = numlinhas
Range("B" & numlinhas) = nome
Range("C" & numlinhas) = uf
Range("D" & numlinhas) = cidade
Range("E" & numlinhas) = endereco
Range("F" & numlinhas) = rg
Range("G" & numlinhas) = cpf
Range("H" & numlinhas) = telefone
Range("I" & numlinhas) = celular
End Sub

5. Sub Ro na Insert()
A subro na Insert(), tem por obje vo atribuir os textos/valores das
variáveis, nas linhas e colunas do Excel, que funcionará como um
banco de dados para armazenamento das informações.
Private Sub BT_SALVAR_Click()
ChangesOK = False
pos = LB_CLIENTES.ListIndex + 2
Range("A" & pos) = TXT_COD.Value
Range("B" & pos) = TXT_NOME.Value
Range("C" & pos) = CB_UF.Value
Range("D" & pos) = TXT_CIDADE.Value
Range("E" & pos) = TXT_ENDERECO.Value
Range("F" & pos) = TXT_RG.Value
Range("G" & pos) = TXT_CPF.Value
Range("H" & pos) = TXT_TELEFONE.Value
Range("I" & pos) = TXT_CEL.Value
ChangesOK = True
LB_CLIENTES.Selected(pos - 2) = True
End Sub

6. Botão Salvar
Declaração para click no botão Limpar
O ar cio de u lizar 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 par r 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
Private Sub LB_CLIENTES_Change()
If ChangesOK = False Then
Exit Sub
End If

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
Private Sub BT_EXCLUIR_Click()
RemoverLinha = LB_CLIENTES.ListIndex
Rows(RemoverLinha + 2).Delete
LB_CLIENTES.RowSource = "Cadastro!A2:I" & Applica on.WorksheetFunc on.CountA(Range("A2",
"A1048576")) + 1
On Error Resume Next
LB_CLIENTES.Selected(RemoverLinha - 1) = True
End Sub

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 quan dade 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 quan ta vo de
linhas é atualizado, para tanto, se u liza 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” é u lizado para
impedir erro caso se esteja na primeira linha

Private Sub BT_LIMPAR_Click()


TXT_COD.Value = ""
TXT_NOME.Value = ""
CB_UF.Value = ""
TXT_CIDADE.Value = ""
TXT_ENDERECO.Value = ""
TXT_RG.Value = ""
TXT_CPF.Value = ""
TXT_TELEFONE.Value = ""
TXT_CEL.Value = ""
End Sub

9. Botão Limpar
Declaração para click no botão Limpar
Atribui o valor vazio para todas as Caixas de Texto
Private Sub BT_Pesquisar_Click()
FORM_PESQUISAR.Show
End Sub

10. Botão Pesquisar


Declaração para click no botão Pesquisar
Chama o formulário FORM_PESQUISAR

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 = Applica on.WorksheetFunc on.Match(CLng(TextoProcura), Range(Coluna & ":" & Coluna), 0)
Else
Linha = Applica on.WorksheetFunc on.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

Declaração para click no botão Pesquisar


Declaração das Variáveis como String
Verificação dos botões de opções para verificar qual está
selecionado e consequentemente atribuir a coluna que
será buscada.
Variável TextoProcura recebe o valor da caixa de texto
TXT_PESQUISA
Caso se encontre um erro é u lizado um Goto para a
mensagem “Não Encontrado”
Se a variável for numérica a função Match buscará com
CLng, converte o texto para valor, caso contrario, a função
Match buscará com CStr, convertendo para texto.
Uma vez que o valor seja encontrado, a linha é
selecionada na Caixa de Listagem
Private Sub TXT_PESQUISA_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shi As
Integer)
If KeyCode = 13 Then
Call BT_Pesquisar_Click
End If
End Sub

2. Caixa de Texto Pesquisa


Declaração para tecla pressionada na caixa de texto TXT_PESQUISA
Se o código da tecla for 13 (tecla enter) então chama a SubRo na
BT_Pesquisar_Click

Código Fonte Completo


ARQ_CADASTRO
Private Sub Workbook_Open()
FORM_CADASTRO.Show
End Sub

FORM_CADASTRO
Public cod, nome, uf, cidade, endereco, rg, cpf, telefone, celular As String
Public numlinhas As Long
Public ChangesOK As Boolean

Public Sub UpdateText()


cod = TXT_COD.Value
nome = TXT_NOME.Value
uf = CB_UF.Value
cidade = TXT_CIDADE.Value
endereco = TXT_ENDERECO.Value
rg = TXT_RG.Value
cpf = TXT_CPF.Value
telefone = TXT_TELEFONE.Value
celular = TXT_CEL.Value
End Sub

Public Sub Insert()


Range("A" & numlinhas) = numlinhas
Range("B" & numlinhas) = nome
Range("C" & numlinhas) = uf
Range("D" & numlinhas) = cidade
Range("E" & numlinhas) = endereco
Range("F" & numlinhas) = rg
Range("G" & numlinhas) = cpf
Range("H" & numlinhas) = telefone
Range("I" & numlinhas) = celular
End Sub

Private Sub BT_EXCLUIR_Click()


RemoverLinha = LB_CLIENTES.ListIndex
Rows(RemoverLinha + 2).Delete
LB_CLIENTES.RowSource = "Cadastro!A2:I" & Applica on.WorksheetFunc on.CountA(Range("A2",
"A1048576")) + 1
On Error Resume Next
LB_CLIENTES.Selected(RemoverLinha - 1) = True
End Sub

Private Sub BT_INSERIR_Click()


numlinhas = Applica on.WorksheetFunc on.CountA(Range("A:A")) + 1
TXT_COD = Applica on.WorksheetFunc on.Max(Range("A:A")) + 1
Call UpdateText
If nome = "" Or cpf = "" Or endereco = "" Then
MsgBox ("Formulário incompleto")
Else
Call Insert
LB_CLIENTES.RowSource = "Cadastro!A2:I" & Applica on.WorksheetFunc on.CountA(Range("A2",
"A1048576")) + 1
End If
LB_CLIENTES.Selected(LB_CLIENTES.ListCount - 1) = True
End Sub

Private Sub BT_LIMPAR_Click()


TXT_COD.Value = ""
TXT_NOME.Value = ""
CB_UF.Value = ""
TXT_CIDADE.Value = ""
TXT_ENDERECO.Value = ""
TXT_RG.Value = ""
TXT_CPF.Value = ""
TXT_TELEFONE.Value = ""
TXT_CEL.Value = ""
End Sub

Private Sub BT_Pesquisar_Click()


FORM_PESQUISAR.Show
End Sub

Private Sub BT_SALVAR_Click()


ChangesOK = False
pos = LB_CLIENTES.ListIndex + 2
Range("A" & pos) = TXT_COD.Value
Range("B" & pos) = TXT_NOME.Value
Range("C" & pos) = CB_UF.Value
Range("D" & pos) = TXT_CIDADE.Value
Range("E" & pos) = TXT_ENDERECO.Value
Range("F" & pos) = TXT_RG.Value
Range("G" & pos) = TXT_CPF.Value
Range("H" & pos) = TXT_TELEFONE.Value
Range("I" & pos) = TXT_CEL.Value
ChangesOK = True
LB_CLIENTES.Selected(pos - 2) = True
End Sub

Private Sub LB_CLIENTES_Change()


If ChangesOK = False Then
Exit Sub
End If
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

Private Sub UserForm_Ini alize()


ChangesOK = True
LB_CLIENTES.RowSource = "Cadastro!A2:I" & Applica on.WorksheetFunc on.CountA(Range("A2",
"A1048576")) + 1
TXT_COD = Applica on.WorksheetFunc on.CountA(Range("A:A")) + 1
End Sub

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 = Applica on.WorksheetFunc on.Match(CLng(TextoProcura), Range(Coluna & ":" & Coluna), 0)
Else
Linha = Applica on.WorksheetFunc on.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

Private Sub TXT_PESQUISA_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shi As


Integer)
If KeyCode = 13 Then
Call BT_Pesquisar_Click
End If
End Sub

Você também pode gostar