Excel VBA e Macros - Passo A Pas - Luiz Felipe Araujo

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 145

VBA (Visual Basic for Applications) consiste em uma linguagem de

programação aplicada a diversos softwares, dentre eles o Excel,


onde é possível automatizar processos, criar rotinas de verificação,
desenvolver ferramentas, formulários e as mais diversas soluções
que são proporcionadas com a utilizaçã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 produtividade do software 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 utilizando 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 utilização de
variáveis, verificações lógicas, ciclos, funções e etc. Para facilitar e
melhorar o aprendizado, nesta seção será utilizado diversos
exemplos de macros com o objetivo de automatizar processos
variados, exemplificando de forma clara e objetiva.
Sumário
SUGESTÃO DE LEITURA
CAPITULO 1 – INTRODUÇÃO AO VISUAL BASIC
PRIMEIRA MACRO
HELLO WORLD
DEPURADOR
VERIFICAÇÃO IMEDIATA
VERIFICAÇÃO IMEDIATA
CAPITULO 2 – INTERAÇÕES VBA/EXCEL
PROPRIEDADES
MÉTODOS
MÉTODO SELECT
SELECT X ACTIVATE:
MÉTODOS COPIAR, RECORTAR, COLAR E INSERIR
FORMATAÇÃO EM VBA
MÉTODOS DE FILTROS E ORDENAÇÃO
MÉTODOS PARA ATUALIZAR E ALTERAR VÍNCULO
CAPÍTULO 3 – PROGRAMAÇÃO
DECLARAÇÃO DE VARIÁVEIS
OBJETO COMO VARIÁVEL
VARIÁVEIS EM ARRAY
ARRAY VETORIAL (UNI-DIRECIONAIS)
ARRAY MATRICIAL (BI-DIRECIONAIS)
INPUTBOX E MSGBOX
INPUTBOX
MSGBOX
FORMULAS DO EXCEL NO VBA
GRAVAR MACROS
ESTRUTURAS DE CONTROLE
IF – THEN - ELSE
FOR – NEXT
DO – WHILE – LOOP / DO – UNTIL – LOOP
SINTAXE
FOR – EACH – NEXT
SELECT CASE STATEMENT
GOTO STATEMENT
WITH STATEMENT
CAPÍTULO 4 – TRATAMENTO DE ERROS
ERRO LÓGICO
ERRO DE COMPILAÇÃO
ERRO DE EXECUÇÃO
CAPÍTULO 5 – CONTROLES ACTIVEX
BOTÃO (BUTTON)
CAIXA DE COMBINAÇÃO (COMBO BOX)
CAIXA DE SELEÇÃO (CHECK BOX)
BOTÃO DE OPÇÃO (OPTION BUTTON)
CAIXA DE LISTAGEM (LISTBOX)
CAPÍTULO 6 – FUNÇÕES
INTRODUÇÃO
DIFERENÇA DE BYREF E BYVAL

CAPÍTULO 7– FORMULÁRIOS
CAPÍTULO 8 – INTERAÇÃO COM OUTRAS APLICAÇÕES
INTRODUÇÃO
INTERAÇÃO COM OUTLOOK
INTERAÇÃO COM O POWERPOINT
INTERAÇÃO COM O WORD
CAPÍTULO 9 – ESTUDOS DE CASO
1º PROJETO - TROCAR O NOME DE TODAS AS ABAS
2º PROJETO - SALVAR CADA ABA COMO ARQUIVO EXCEL
3º PROJETO - SALVAR CADA ABA COMO PDF
4º PROJETO - ATUALIZAR TODOS OS VÍNCULOS
5º PROJETO – SISTEMA DE LOGIN E SENHA SEM FORMULÁRIO
6º PROJETO – CONTROLE DE ACESSO A PLANILHA
7º PROJETO – FORMULÁRIO DE CADASTRO DE CLIENTE
Sugestão de Leitura
O Aprendizado do VBA vai variar muito de acordo com o Perfil do
usuário, este livro foi concebido com o objetivo de atingir todos os
tipos de usuários, desde os mais iniciantes que nunca tiveram
contato com uma linguagem de programação, até usuários mais
experientes em computação de uma forma geral.
A estrutura de capítulos proposta tem por objetivo atingir os usuários
mais leigos, para tanto, desta forma, o primeiro capitulo introduz de
forma muito breve o conceito estrutural do VBA e o segundo faz uma
abordagem das instruções diretas ao Excel, de forma a ensinar o
leitor como realizar tarefas simples de copiar e colar, abrir e fechar
arquivos, formatar e filtrar dados. Estes comandos por si próprios,
não configuram o que realmente é a linguagem de programação, se
tornando desta maneira, instruções de rápida absorção para usuários
que nunca tiveram contato com lógica de programação.
O terceiro capítulo deste livro, já inicia a programação propriamente
dita, apresentando conceitos de laços, condicionais e etc. Desta
forma, é altamente recomendado que usuários leigos sigam a
estrutura proposta pelo livro, porém usuários que já tiveram contato
com programação podem iniciar no capítulo 1, pular para o capítulo 3
e posteriormente retornar ao segundo.
Capitulo 1 – Introdução ao Visual Basic
As duas estruturas básicas utilizadas em VBA são chamadas de Sub
(“Subroutine”) e Function, ambas processam o algoritmo, o que
diferencia a Funcition é que ela retorna um valor no final das
instruções. Basicamente se aplica uma Function, quando se deseja
criar um algoritmo que retorne um valor ao final de sua execução,
posteriormente os exemplos tornarão mais simples o entendimento
de aplicação de cada estrutura.
A estrutura básica de uma Sub, como citado anteriormente consiste
em:
Sub <nome_da_macro> ( )
<algorítimo>
End Sub

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


Function <nome_da_função> (<parametro1>,< parametro 2>,....<
parametro_n)
<algorítimo>
End Function

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 praticar:
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 repetir o
mesmo processo e clicar em ‘Janela Verificação Imediata’ (Ctrl + G).
Sinais de operação e de comparação em VBA serão utilizados 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 utilizar o menu superior, em
“Depurar”, ou utilizar 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 utilizando o menu superior em Depurar>Ativar/Desativar
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 continuar a macro através de F9 (passo a


passo com a depuração total) ou com a utilizaçã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 utilizar a verificação imediata é para perguntar ao


depurador, qual é o objeto, ou variável desejada, para isso, basta
utilizar “?” 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 útil 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ática 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 tipo de
comentário explicativo. 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 utilizado para “desativar” 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 rotinas no Excel envolvem a
aplicação de códigos simples e objetivos 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 utilizados e a descrição de utilização. Posteriormente, no fim do
capitulo serão apresentados exemplos práticos 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 utilizados 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ísticas 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 utilizaçã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 utilização no objeto Workbooks, mas não tem
utilidade 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
utilidades.
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: Utilizar os métodos através da instrução Cells() será


especialmente útil quando utilizado 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 partir 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:
ActiveCell.EntireColumn.Select
ActiveCell.EntireColRow.Select

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


objeto individual para utilizar 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 utilizaçã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 utilizar 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 utilizar 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 utilizar o método desejado, a instrução abaixo
maximiza o arquivo Excel desejado:
Workbooks(“NomeDoArquivo”).Activate
Ou
Workbooks(1).Activate

Sheets (“NomeDoArquivo”).Activate
Ou
Sheets (1).Activate
Select x Activate:
A diferença básica entre Select e Activate, se dá pelo fato de que no
Excel se pode ter vários objetos selecionados, porém em ordem de
hierarquia, apenas um pode estar ativo. Por exemplo, dentro da
hieraquia das células, mesmo que várias estejam selecionadas,
apenas uma estará ativa, conforme exemplo abaixo:

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


A1 está ativa, Imagem 1.
Se o método .Activate for utilizado, A3 é ativada, Imagem 2:
Range("A3").Activate
Obs: mudar a célula ativada pode ser especialmente útil para
métodos subsequentes que dependam da posição atualmente
ativada de um objeto.

Um método de muita utilidade é o End, ele equivale a utilização dos


atalhos de teclado Ctrl + Seta direcional. Esse método é utilizado
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 última célula
disponível de maneira sequencial a partir de A1, na direção para
baixo.
Ao invés de Range, também é possível utilizar Selection, desta
maneira a partir da célula selecionada, a última será considerada
para direção desejada, da seguinte maneira:
Selection.End(xlDown).select
Selection.End(xlUp).select
Selection.End(xltoLeft).select
Selection.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(Selection, Selection.End(xlDown)).select
Desta maneira, a partir da célula(s), atualmente selecionada(s), até a
última 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(Selection, Selection.End(xltoRight)).select
Range(Selection, Selection.End(xlDown)).select
Ou poderia ser escrito apenas com:
Range(Selection.End(xltoRight), Selection.End(xlDown)).select
O código apresentado anteriormente sempre irá selecionar a última
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 quantidade desejada. Para isso deve-se utilizar o seguinte
código abaixo:
ActiveCell.Offset(X,Y).Select
Ou
Range(“A1”).Offset(X,Y).Select
Onde em X deve-se colocar a quantidade de células que serão
navegadas no eixo horizontal e em Y deve-se colocar a quantidade
de células que serão navegadas no eixo vertical a partir da célula
selecionada ou a partir de uma célula desejada, no exemplo citado,
célula “A1”
ActiveCell.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 partir da célula B3 se
queira voltar para a célula A1, basta utilizar 2 células para cima e 1
para esquerda, para isso, basta utilizar os valores negativos, como
no exemplo a seguir:
ActiveCell.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 relativa à 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(ActiveCell.Offset(0,1), ActiveCell.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(Selection.end(xldown),ActiveCell.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 utilização do Excel, é possível
executar através das linhas de comando apresentadas. No capítulo
seguinte, serão apresentados os métodos que utilizam 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 utilizar 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 destino para colar, e utilizar o
método para colar, conforme exemplo a seguir:

Segue abaixo uma rotina simples de copiar e colar uma seleção de


células:
Range(“B1”,”B3”).Copy
Range(“C1”).Select
ActiveSheet.Paste

Ou, de uma maneira mais simples:

Range(“B1”,”B3”).Copy Destination:=Range("C3")

É importante ressaltar que o método de Copy pode ser utilizado 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 Destination:=
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 Destination:= Rows(2)

Copiar a primeira coluna e colar na segunda:


Columns (1).Copy Destination:= Columns (2)

O método apresentado anteriormente tem o objetivo de colar de


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

Para colar com operação basta utilizar o termo “Operation”, após


virgula, da seguinte maneira:

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


de multiplicação, onde as células A1 até A6 serão copiadas e
coladas em cima de B1 até B6 com operação de multiplicação:
Range("A1","A6").Copy
Range("B1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply
Para ativar a opção de transpor ao colar especial, basta adicionar
virgula e colocar Transpose:=True, conforme exemplo a seguir:
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply,
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
Selection.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
Selection.Insert
O mesmo código também poderia ser utilizado 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
Selection.Insert
Formatação em VBA
Para formatar células em VBA basta aplicar os métodos aos objetos
do tipo célula, seja através do Range(), Cells(), Selection, 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 objetivos ligados à
formatação de células. Basicamente todos as formas de formatação
que são permitidas 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 Selection
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
.Borders(xlInsideVertical).LineStyle = xlContinuous
End With

Explicação:
xlEdgeLeft – Borda externa esquerda
xlEdgeRight – Borda externa direita
xlEdgeBottom – Borda externa inferior
xlEdgeTop – Borda externa superior
xlInsideHorizontal – Borda interna horizontal
xlInsideVertical – Borda interna Vertical

O trecho xlContinuous determina que é uma linha continua, pode ser


substituído por:
xlDash para linha tracejada
ou
xlDot para linha pontilhada

Para escolher a cor das abas:


With ActiveWorkbook.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 automatizar 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
Selection.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 utilizado 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 quantidade de critérios
desejados. Exemplo com dois critérios:
Range("A1","B1").Select
Selection.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 retirar o mesmo, basta aplicar o
código a seguir:
ActiveSheet.ShowAllData
Para classificar de acordo com os números da coluna B, é preciso
utilizar o código a seguir:
Range("A1", "C1").AutoFilter
ActiveWorkbook.Worksheets("Plan1").AutoFilter.Sort.SortFields.Add
Key:=Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Plan1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.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 substituir 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”,
utiliza também o cabeçalho de referência que foi ordenado, neste
exemplo B1. A DataOption:=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 retirar a classificação aplicada, é necessário aplicar o seguinte
código após a realização da classificação:
ActiveWorkbook.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 utilizar 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 utilizar o código a seguir:


Workbooks("Aula ").Save

Para salvar como:


ActiveWorkbook.SaveAs Filename:=" C:\Aula.xlsx
",FileFormat:=xlOpenXMLWorkbookMacroEnabled
Neste exemplo será salvo em extensão xlsx, habilitado para
utilização de macro.

Outros exemplos com outros formatos muito utilizados:


ActiveWorkbook.SaveAs Filename:=" C:\Aula.xlsx",
FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.SaveAs Filename:=" C:\Aula.xlsb", FileFormat:= xlExcel12
ActiveWorkbook.SaveAs Filename:=" C:\Aula.xls", FileFormat:= xlExcel8

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


Workbooks("Aula").Close savechanges:=False
Métodos para atualizar e alterar vínculo
A utilização de vínculos é uma importante característica no Excel,
eles determinam a interação entre diferentes arquivos. Desta forma,
se torna extremamente interessante automatizar a alteração ou
atualização de vínculos através de VBA, dos modos que serão
apresentados a seguir:
Alterar Link:
ActiveWorkbook.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 destino para alteração de
vínculo
É importante notar que dependendo da quantidade de dados
vinculados, o processo pode ser extremamente lento, desta forma, é
recomendado abrir o arquivo destino antes de realizar a alteração de
vínculo.

Outra rotina considerada de grande importância é a de quebrar


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

ActiveWorkbook.UpdateLink Name:= " Arquivo", Type:=xlExcelLinks


Arquivo - Caminho completo do arquivo vinculado que se deseja
atualizar
Apesar das rotinas relacionadas aos assuntos abaixo serem citadas
apenas nos capítulos posteriores, é importante ressaltar essa
simples rotina, a qual tem por objetivo de quebrar todos os links de
uma planilha, sem definir quais são os links desejados.
Dim linksarray As Variant
linksarray =
ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)
Do Until IsEmpty(linksarray)
ActiveWorkbook.BreakLink Name:=linksarray(1),
Type:=xlLinkTypeExcelLinks
linksarray =
ActiveWorkbook.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 functions, analisando inclusive as diferenças da
utilização de ambas as estruturas. O Objetivo 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 produtividade e objetividade 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 tipos 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 tipos:

O tipo da variável escolhida, influência também na quantidade 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 utilizar número
na frente, não utilizar 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 tipo 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 tipo do objeto
utilizado, 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 partir do momento que Selecao_1 recebe
Range(“A1”), é possível se referir a célula A1 através da variável
Selecao_1, então utilizar Selecao_1 = 10, é o mesmo que utilizar
Range(“A1”) = 10.
Obs: Neste exemplo não foi declarado a Worksheet que está sendo
referida, desta forma o Excel entende a planilha utilizada como a que
está selecionada. Poderia também ser utilizado no lugar de
Range(“A1”), a forma mais complete:
Worksheets(“Plan1”).Range(“A1”).
É importante citar que para as Sub’s, caso a variável não seja
declarada, no momento da depuração, o compilador consegue
atribuir um tipo de variável de acordo a utilização no código, porém
para um funcionamento correto e desempenho satisfatório, é
altamente recomendado a declaração de acordo com a necessidade
de aplicação no algoritmo.
É possível atribuir um valor a uma variável dentro do próprio código,
ou trazer seus valores das planilhas do Excel, combinado com os
códigos dos capítulos anteriores, como no exemplo a seguir:

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ático:
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 utilizado
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 vertical, 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ático:
Sub Aprendizado ()
Dim ArrayMatriz(2, 2) As String
ArrayMatriz(0, 0) = "A "
ArrayMatriz(0, 1) = "B "
ArrayMatriz(1, 0) = "C "
ArrayMatriz(1, 1) = "D "
MsgBox "Letras Armazenadas:" & Chr(13) & ArrayMatriz(0, 0) & ArrayMatriz(0,
1) & Chr(13) & ArrayMatriz(1, 0) & ArrayMatriz(1, 1)
End Sub

Explicação:
Variável ArrayMatriz declarada como matriz de 2,2 posições
Variável ArrayMatriz com índice 0,0 recebe a letra A
Variável ArrayMatriz com índice 0,1 recebe a letra B
Variável ArrayMatriz com índice 1,0 recebe a letra C
Variável ArrayMatriz com índice 1,1 recebe a letra D
Mensagem com as Letras armazenadas.
InputBox e MsgBox
Ambos os recursos são responsáveis por realizar uma interação com
o usuário através de interface gráfica, InputBox, será responsável por
enviar uma mensagem de texto ao usuário através de uma janela,
solicitando uma entrada de informação, o MsgBox por sua vez, tem o
objetivo de enviar uma mensagem ao usuário, solicitando a sua
confirmação através de botões.
InputBox
Sintaxe
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
Dos parâmetros solicitados, apenas o prompt é obrigatório, nele é
necessário escrever o texto que será informado ao usuário, é
importante também utilizar uma variável que receberá o valor que o
usuário digitar, conforme exemplo a seguir:
Valor = InputBox("Digite o valor desejado")

O dado que for digitado no campo de texto e posteriormente


confirmado no botão “OK”, será atribuído a variável Valor, utilizada
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 utilizando os parâmetros adicionais retorna um
valor padrão já digitado no campo de texto e um título para janela.
MsgBox
Sintaxe
MsgBox(prompt[, buttons] [, title] [, 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
Buttons, 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 buttons, 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 button:
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 utilização de uma msgbox que


utiliza o botão VbYesNo, se Yes for pressionado, a macro da uma
resposta para o usuário, caso No seja selecionado a resposta é
diferente. É utilizada 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 utilizadas no Excel, também são aplicáveis para o VBA. É
possível se referir ao objeto Application como método
WorkSheetFunction.[Nome da função desejada].(argumentos)
É Importante ressaltar, que as funções devem ser utilizadas 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ática, muitas funções não precisam ser utilizadas, uma vez que
podem ser substituídas de maneira muito prática pelo próprio
algoritmo.
Por exemplo: é extremamente mais simples somar duas variáveis,
através do algoritmo do que utilizando uma função própria do Excel,
por outro lado, é mais fácil utilizar 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 utilizadas no
Excel e como podem ser aplicadas em VBA.

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


Sub Aprendizado()
Dim Contador As Integer
Contador = Application.WorksheetFunction.CountA(Range("A:A"))
MsgBox Contador
End Sub

Exemplo de utilização 2:
Sub Aprendizado()
Dim Total As Integer
Total = Application.WorksheetFunction.SumIf(Range("A:A"), ">5",
Range("A:A"))
MsgBox Total
End Sub

Obs: Para se referir a uma seleção de células, utiliza-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ática. Uma vez que a função seja ativada,
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 utilizada 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 interpretativa.
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
ativação e o local onde a rotina 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 repetiçã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 utilizaçã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 utilizar
apenas, desta maneira:
If [Condição] Then
[se condição verdadeira]
End If
Outra sintaxe que pode ser utilizada 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
satisfeita, podendo utilizar quantas condições forem necessárias,
neste exemplo foram apresentadas 3 condições.
Exemplo Prático 1:
Ou também pode ser escrito com ElseIf
Exemplo Prático 2:

O código tem o mesmo resultado, porém fica com uma melhor


aparência e organização, é uma prática altamente recomendada em
programação, não apenas para um melhor desempenho do
algoritmo, mas também para permitir futuras modificações e facilitar
o entendimento para outros usuários.
Exemplo Prático 3:
Neste exemplo 3, é demonstrado que a estrutura If – Else – End if
pode ser utilizada 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 utilizadas em variáveis de contadores por
convenção e boa prática em programação, mas pode ser utilizada
qualquer variável, desta forma um modelo padrão de utilizar 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 último ciclo é incrementado 5
ficando i = 10.
Exemplo Prático 1:
É importante notar no exemplo anterior, que a variável i foi utilizada
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
repetirá este processo 10 vezes, desta maneira as 10 células da
coluna A são preenchidas.
Outra forma interessante de utilizar os ciclos é utilizar a outra forma
de se referir a células, utilizando Cells(1,1) por exemplo para se
referir a Range(“A1”). Uma vez que se utiliza Cells, pode se utilizar
variáveis numéricas para se referir a colunas. No exemplo a seguir,
serão preenchidos valores em linhas e colunas utilizando Cells:
Exemplo Prático 2:
Como pode ser observado o comando Cells, permite uma
flexibilidade maior, uma vez que é possível utilizar 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 – Until – 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 utilizar um
contador, será utilizada uma condição para qual enquanto for
satisfeita, o looping será executado. Com Until o processo é
semelhante, porém o looping é executado até a condição ser
satisfeita.
Sintaxe
Do While [Condição]
[Instruções a realizar em cada iteração]
Loop
Do Until [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 Until [Condição]

O exemplo prático a seguir, demonstra a utilização do Do While:


A macro inicialmente seleciona a célula B2, a instrução do ciclo de
repetiçã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
utilização do Do While com o If Then, é possível apresentar o
exemplo prático 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 é obtido:

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


While ActiveCell <> “”, com o ActiveCell.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 ActiveCell.Offset(1,0).Select não fosse dado, o Excel
entraria em um ciclo infinito ocasionando o seu travamento.
O comando,
Do While Active <> “”
Poderia ser substituído por:
Do Until Active = “”

Na prática 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 utilizaçã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 utilização mais interessante é para os
conjuntos de objetos do próprio Excel, podendo criar macros
interessantes de extrema utilidade, conforme os exemplos que serão
apresentados a seguir,
No primeiro exemplo, a estrutura será utilizada para criar uma forma
de renomear as planilhas de acordo com a entrada de dados do
usuário, para isso a estrutura For-Each é utilizada 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 ActiveWorkbook.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
utilizar 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 substitui a utilizaçã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 satisfeita]
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 utilizar quantas “Case’s” forem necessárias, atribuindo uma


expressão a ser verificada diferente para cada uma, é possível
também no final utilizar p “Case Else”, onde caso nenhuma condição
tenha sido atendida, ela será aplicada.
O exemplo prático a seguir, faz uma interação com o Inputbox, desta
forma, a macro solicita para digitar uma nota a ser avaliada,
utilizando 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ático:
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 “Ótima 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 partida 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 partir 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 utilizar 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 é ativado mostrando a linha que
está com problema no código, por muitas vezes uma solução simples
para contornar erros esperados, é a utilizaçã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
tivesse 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 utilizaçã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 repetição do
objeto para cada método aplicado.
Estrutura:
With Objeto
.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ísticas 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á
efetivamente ocorrendo.
No VBA existem 3 tipos principais de erros:
a) Erros lógicos
b) Erro de compilação
c) Erro de execução
Erro lógico
Este é o erro mais difícil de se localizar, visto que neste tipo 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 utilizar o atalho F8,
para que o código seja lido em etapas e desta forma possa se
verificar o resultado obtido 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 identificado, 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 tipo 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 respectivo
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 identificaçã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 identificar a origem
do erro.
Capítulo 5 – Controles ActiveX
Os controles ActiveX, 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 ActiveX, tem a
necessidade de programar a sua funcionalidade através do VBA, o
que garante também uma maior flexibilidade na sua utilização.

Os elementos serão abordados separadamente, demonstrando sua


utilização através de exemplos práticos, 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 ActiveX, basta selecionar:
Guia desenvolvedor > Inserir > (Elemento desejado)

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

Com o modo design ativo, além de poder redimensionar e


reposicionar os objetos ActiveX, 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 particulares 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 rotinas que não levam
em consideração qual objeto está vinculado com código. Porém para
utilização de Controles ActiveX, 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 ativará o código desejado.
Exemplo:

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


ela é selecionada para inserir os códigos, posteriormente o
ComandButton1 (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 ativada na declaração. Desta forma é possível
alterar a declaração para selecionar uma nova opção desejada,
automaticamente 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 (Button)
Principais propriedades:

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


basicamente funciona como um gatilho direto para o código que será
utilizado, 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 CommandButton1_Click()
MsgBox ("Botão Pressionado")
End Sub

Exemplo Prático 2:
No segundo exemplo é demonstrada a criação de um botão que é
associado a um código que exibe e oculta a aba Plan2, desta forma,
ao clicar no botão, o mesmo faz uma verificação se a aba está oculta
ou não, reexibindo caso esteja e ocultando em caso contrario.
Obs:
Para poder clicar no botão corretamente é preciso desativar o botão
“Modo Design”
Caixa de Combinação (Combo Box)
Principais propriedades:

A Lista de combinação é muito utilizada para apresentar opções


prontas, rápidas e restritas ao usuário, facilitando a interação com o
Excel e ativando rotinas de maneira simples e fácil. Para tanto a sua
principal característica é a utilizaçã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
estivessem na Plan2, bastaria colocar dentro de ListFillRange
Plan2!G1:G5, artifício que é muito utilizado para esconder os dados
que alimentam a caixa de seleção.

A propriedade LinkedCell também é comumente utilizada, 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 rotina 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 utilizar uma coluna K auxiliar para colocar os
estados na vertical, pois a propriedade ListFillRange aceita apenas
valores dispostos de maneira vertical.

Código utilizado:
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 refletir em uma ação da
macro ou pode ser utilizado em conjunto com outro objeto que faça a
verificação se as caixas estão marcadas ou não (Utilizaçã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 respectiva planilha.

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

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 estiver 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 tido de ferramenta é mais utilizado


com a combinação de outros objetos, como por exemplo o botão. O
próximo exemplo é semelhante ao anterior, porém utiliza 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 utilizadas, onde desta vez foi
utilizado apenas uma Sub, referente ao botão de nome padrão
“CommandButton1”, 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 estiverem marcadas, terão as respectivas planilhas
ocultas.
Botão de Opção (Option Button)

O botão de opção é um mecanismo para escolha entre opções


disponíveis, permitindo 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 utilizada, porém este valor pode ser
alterado para criar diversos grupos de Botões de Opção. Este objeto
é amplamente utilizado para formulários, questioná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 estiver 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 é relativamente simples, ela


pode ser utilizada 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 utilizada 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, respectivamente 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 utiliza-se o método AddItem cujo valor
está selecionado na Lista1
Lista2.ListCount Retorna o número total de elementos na lista, é
utilizado -1 pois a contagem começa no 0. Combinando o
listcount com o Selected = True, seleciona o último 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
Utiliza 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 = Application.WorksheetFunction.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 rotina começar a célula H16 tem seu valor limpo
For To utilizado 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 relativo 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
Subrotinas e as funções, se dá por conta do retorno de valor.
Portanto uma Subrotina, pode dar uma série de instruções, utilizar
uma série de métodos e procedimentos, com o simples objetivo 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ática, entende-se função, uma série de instruções que
processam os dados e retornam um valor, são de grande utilidade
para aplicar formulas que serão repetidas 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 utilizar uma Subrotina para
dar a entrada dos dados que serão processados na Function, desta
forma a Function gera uma informação final que é retornada para
sub.

Explicação:

Inicia-se a sub “Aprendizado”


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

Inicia-se a function Area que exige 2 valores do tipo long, X e Y,


os quais recebem os valores 3 e 5 da sub aprendizado.
Variável Area recebe o valor de X multiplicado por Y
Function 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 utilizado 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:
Function Calc(ByVal x As Integer) As Integer
x=x*3
Mult = x
End Function

Sub Aprendizado()
Dim x As Integer
x = 10
Call Calc (x)
MsgBox x
End Sub
Como a foi utilizado ByVal, o valor do X se manteve original, mesmo
que a function tenha multiplicado por 3, o valor na sub permaneceu
inalterado. Por outro lado, caso se seja utilizado ByRef:
Function Calc(ByRef x As Integer) As Integer
x=x*3
Mult = x
End Function

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

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


segundo grau:

Function 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 Function

Sub Aprendizado()
Dim a, b, c As Double
a = Range("B3")
b = Range("B4")
c = Range("B5")
Range("B7") = EqSegGrau(a, b, c, True)
Range("B8") = EqSegGrau(a, b, c, False)
End Sub
Capítulo 7– Formulários
Os formulários (UserForms) no Excel, tem por objetivo a criação de
interfaces de interação com o usuário, permitindo criar janelas
personalizadas, com a utilização de objetos, dos quais alguns já
foram apresentados na seção de ActiveX e outros novos elementos
que serão apresentados nesta seção, os quais terão maior utilidade
para os formulários propriamente ditos.
Esta ferramenta, tem uma grande utilidade para criação de
aplicações, uma vez que a interface personalizada, permite realizar
as mais diversas tarefas, como por exemplo: formulários de cadastro
de usuários, controle de estoque, fluxo de caixa e até mesmo
complementos para funcionalidades do Excel.
Para inserir um userform, basta acessar o menu superior na aba
inserir, posteriormente clicar em UserForm, ou no menu esquerdo,
botão direito na área vazia e Inserir > UserForm.

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 ActiveX, basta selecionar o objeto e a
declaração para criar uma SubRotina 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:
SubRotina para o evento de click no botão “CommandButton1”
Se o índice da planilha selecionada (posição), for igual ao
numero total de planilhas, selecionar a planilha 1.
Caso contrario, selecionar a planilha(índice da atual + 1 )
Termina condicional

SubRotina para o evento de click no botão “CommandButton2”


Se o índice da planilha selecionada for 1 então seleciona a
última 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 ActiveX, é 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ística 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 software
desejado, para tanto basta acessar o editor VBA, através do atalho
Alt + F11, clicar em Ferramentas > Referencias, conforme a imagem
abaixo:

Posteriormente, basta ativar as bibliotecas dos softwares desejados,


conforme a imagem abaixo:
Introdução
Para poder interagir com uma aplicação externa é necessário criar
uma variável do tipo objeto para utilizar como referência para o
software 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.Application”)
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.Application
Utiliza-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 utilizado previamente, para criar um
novo documento foi utilizado 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
Presentations.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 tipo objeto para receber a aplicação. Com a interação do
Outlook, é particularmente 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.Application")
Set OutMail = OutApp.CreateItem(0)
bMessage = "Digite a primeira linha" & vbNewLine & _
"Digite a segunda linha" & vbNewLine & _
"Digite a Terceira linha"
On Error Resume Next
With OutMail
.to = "[email protected]"
.CC = "[email protected]"
.BCC = "[email protected]"
.Subject = "Assunto do email"
.Body = bMessage
.Attachments.Add ("C:\exemplo.txt")
.Send
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
End Sub

Esta macro demonstra a utilização de código em VBA para enviar um


e-mail completo, com destinatário, cópia, cópia oculta, assunto e
mensagem. É importante observar que foi utilizada uma variável para
o corpo da mensagem apenas para organizar o código, utilizando o
comando vbNewLine concatenado para poder pular de linha.
É importante também observar que o método .Send foi utilizado,
desta forma o e-mail é diretamente enviado aos destinatários, caso
fosse necessário o usuário realizar uma verificação final da
mensagem antes de enviá-la, seria possível utilizar o método
.Display, desta forma a mensagem seria exibida antes de ser enviada
aos destinatá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 software 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 = Selection
Set PptObj = CreateObject(class:="PowerPoint.Application")
Set iPresent = PptObj.Presentations.Add
Set iSlide = iPresent.Slides.Add(1, 11)
iRange.Copy
iSlide.Shapes.PasteSpecial DataType:=2
Set iShape = iSlide.Shapes(iSlide.Shapes.Count)
iShape.Left = 100
iShape.Top = 160
PptObj.Visible = True
PptObj.Activate
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 Presentations.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, é utilizada 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 Activate 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 utilizado no PowerPoint
uitilizou 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 utilizar
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.Application")
objWord.Visible = True
Set objDoc = objWord.documents.Add
Dim i As Integer
For i = 1 To 10
objDoc.Activate
strValue = Cells(i, 1)
objWord.Selection.TypeText Text:=strValue
objWord.Selection.TypeParagraph
Next i
End Sub

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
Utiliza 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 tipo objeto que receberá a aplicação do Word.
Posteriormente foi utilizado 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 objetivo 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 objetivos práticos, permitindo aprender a conexão
dos conceitos, a utilização deles com o objetivo de gerar um projeto,
criar uma solução, ou até mesmo, desenvolver aplicações
comerciais. Diferente dos exemplos já utilizados, 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 objetivo, facilitar a troca do nome de todas as
abas de maneira sucessiva, utilizando laços de repetiçã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:
ActiveSheet.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 objetivo 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 objetivo salvar cada aba de um arquivo como
diferentes arquivos, desta forma será utilizado um laço de repetiçã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 = ActiveWorkbook.Name
Diretorio = "C:\Users\usuarioteste\Documents"
For i = 1 To Worksheets.Count
Worksheets(i).Select
NomeArquivo = ActiveSheet.Name
ActiveSheet.Copy
ActiveWorkbook.SaveAs Filename:=Diretorio + "\" + NomeArquivo +
"." & "xlsx"
ActiveWorkbook.Close
Workbooks(wkb).Activate
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
(última aba)
Seleciona a aba de valor i (valor i do laço de repetição)
A variável NomeArquivo recebe o nome da aba
Copia a aba ativa
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
Ativa 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 rotina 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 motivo da utilizaçã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 tipo de
erro e avançar para a próxima aba.
4º Projeto - Atualizar todos os vínculos
Esta macro tem por objetivo atualizar todos os vínculos de um
arquivo Exel, de maneira simples e rápida os conceitos de laço de
repetição são aplicados em conjunto com o conceito de conjunto de
objetos.
Sub AutalizarLinks()
Dim linksarray As Variant
linksarray =
ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)
For i = 1 To UBound(linksarray)
ActiveWorkbook.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 repetição de i = 1 até a quantidade de
informações contidas 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"
ActiveWorkbook.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"
ActiveWorkbook.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
Utiliza 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 estiver, UsuOK recebe o valor verdadeiro
Finaliza a codicional
Se UsuOK for verdadeiro
Utiliza 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, utiliza 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 objetivo 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
Application.UserName que tem por objetivo 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 = Application.WorksheetFunction.CountA(Worksheets("Controle
de Acesso").Range("A1", "A1048576")) + 1
Worksheets("Controle de Acesso").Range("A" & linha) =
Application.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 utilização, o mesmo tem diversas aplicações
nos mais variados setores. O objetivo desta solução, é a utilização
da mesma por usuários leigos, desta forma busca-se evitar erros,
criar uma interface intuitiva de rápido aprendizado com o mínimo de
procedimentos necessários para atingir o objetivo 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 objetivo de:
Inserir – Adicionar um novo cliente
Salvar – Atualizar um cliente já existente
Excluir – Remover cadastro de cliente
Pesquisar – Buscar cadastro do cliente
Existirá 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 partir 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 tiveram métodos declarados diretamente


para sua utilizaçã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 utilizar o objeto WKB_CADASTRO com
declaração Open.
FORM_CADASTRO
Public cod, nome, uf, cidade, endereco, rg, cpf, telefone, celular As String
Public numlinhas As Long
Public ChangesOK As Boolean

1. Variáveis
Variáveis do tipo string que receberão as informações da
caixa de texto
Variável do tipo long que receberá o numero total de
linhas do banco de dados
Variável do tipo booleana que permitirá ou não a leitura
do código dentro da Sub “LB_CLIENTES_Change” que
será apresentada posteriormente

Private Sub UserForm_Initialize()


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

2. Formulário Cadastro
Sub relacionada a abertura do formulário [Declaração
UserForm.Initialize()]
A variável ChangesOK recebe inicialmente o valor
verdadeiro
A fonte de linhas é atualizada com o total de linhas
preenchidas na planilha do Excel que está armazenando
os dados, através da função CountA + 1
O algoritmo sugere um código para o cadastro do
próximo cliente, utilizando o número de linhas já
preenchidas +1

Private Sub BT_INSERIR_Click()


numlinhas = Application.WorksheetFunction.CountA(Range("A:A")) + 1
TXT_COD = Application.WorksheetFunction.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" &
Application.WorksheetFunction.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 última linha +1
A caixa de texto do código recebe o código referente
ao numero de linhas +1, apenas um padrão para este
formulário
Posteriormente a Sub “UpdateText” é chamada para
associar os valores e textos inseridos para variáveis
do tipo String (Sub apresentada abaixo)
Caso CPF ou endereço estejam vazios, é enviada uma
mensagem de formulário incompleto, neste exemplo,
apenas os dois são exigências de cadastro
Caso CPF e endereço tenham sido adequadamente
preenchidos a Sub “Insert” é chamada para inserir os
valores preenchidos nas linhas correspondentes
A fonte de linhas que alimenta a Caixa de listagem
(listbox) é atualizada da célula A2, até a célula I &
numero te linhas totais (encontrada na função
CountA) + 1.
Apenas para fins de uma interface mais intuitiva, a
nova linha é selecionada.

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 Rotina UpdateText()


A subrotina UpdateText(), tem por objetivo 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 Rotina Insert()


A subrotina Insert(), tem por objetivo 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 artifício de utilizar a variável booleana ChangesOK
funciona para inibir a Sub que será apresentada a seguir:
“LB_CLIENTES_Change()”, uma vez que ela é chamada em
qualquer modificação na seleção da caixa de listagem
Posição na planilha equivale a posição do item na lista +2
(Devido ao fato da lista contar a partir de zero e na
planilha ter o cabeçalho, logo é preciso somar 2)
As células na planilha recebem os valores preenchidos
na caixa de texto

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" &
Application.WorksheetFunction.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 quantidade de
linhas até a posição que será excluída
A linha na planilha que será deletada, equivale a
RemoverLinha +2, uma vez que é preciso considerar que
a ListIndex começa em Zero e na planilha tem o
cabeçalho, logo é preciso somar 2
Através do LB_CLIENTES.RowSource o quantitativo de
linhas é atualizado, para tanto, se utiliza a função CountA
Sempre que se excluir uma linha, a linha anterior a ela é
selecionada, apenas para fins de melhoramento de
interface, “On Error Resume Next” é utilizado para
impedir erro caso se esteja na primeira linha

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 = Application.WorksheetFunction.Match(CLng(TextoProcura),
Range(Coluna & ":" & Coluna), 0)
Else
Linha = Application.WorksheetFunction.Match(CStr(TextoProcura),
Range(Coluna & ":" & Coluna), 0)
End If
FORM_CADASTRO.LB_CLIENTES.Selected(Linha - 2) = True
Exit Sub
erro001:
MsgBox "Não Encontrado"
End Sub

1. Botão Pesquisar

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 é utilizado 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 Shift 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
SubRotina 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" &
Application.WorksheetFunction.CountA(Range("A2", "A1048576")) + 1
On Error Resume Next
LB_CLIENTES.Selected(RemoverLinha - 1) = True
End Sub

Private Sub BT_INSERIR_Click()


numlinhas = Application.WorksheetFunction.CountA(Range("A:A")) + 1
TXT_COD = Application.WorksheetFunction.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" &
Application.WorksheetFunction.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_Initialize()


ChangesOK = True
LB_CLIENTES.RowSource = "Cadastro!A2:I" &
Application.WorksheetFunction.CountA(Range("A2", "A1048576")) + 1
TXT_COD = Application.WorksheetFunction.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 = Application.WorksheetFunction.Match(CLng(TextoProcura),
Range(Coluna & ":" & Coluna), 0)
Else
Linha = Application.WorksheetFunction.Match(CStr(TextoProcura),
Range(Coluna & ":" & Coluna), 0)
End If
FORM_CADASTRO.LB_CLIENTES.Selected(Linha - 2) = True
Exit Sub
erro001:
MsgBox "Não Encontrado"
End Sub

Private Sub TXT_PESQUISA_KeyDown(ByVal KeyCode As


MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Call BT_Pesquisar_Click
End If
End Sub

Você também pode gostar