Escolar Documentos
Profissional Documentos
Cultura Documentos
EXCEL 2016
Elaborada por: Claudio Fernando Scatolin
Revisão: 00
Fevereiro/2020
18/02/2020
• Assinar a lista de presença em todas as aulas em que estiver presente, conferindo a grafia do
nome, pois assim será impressa no certificado.
• Todo atraso e saída antecipada será anotada pelo instrutor na lista de presença.
• Desligar ou colocar em modo silencioso seu aparelho celular.
• Não comer ou beber em sala de aula.
• Haverá, em todas as aulas, um intervalo de 15 minutos para café.
• Para a certificação, o aluno deve ter frequência mínima de 80% e aproveitamento mínimo, na
avaliação do instrutor.
• Cancelamento de aula em cursos VIP: conforme contrato os alunos de curso VIP devem
desmarcar aulas com 12 horas de antecedência para as aulas diurnas e 6 horas de
antecedência para as aulas noturnas, caso contrário as horas agendadas serão consideradas
como ministradas.
• Garantia de aprendizado:
o Repita o curso quantas vezes forem necessárias durante o prazo de 01 ano após o
termino do curso.
o Escolha uma nova turma que possua vaga disponível e matricule-se um dia antes do
seu início;
o Pague uma pequena taxa correspondente a 5% do valor atual do curso para cada nova
turma;
o Não há quantidade estabelecido para as repetições, desde que o mesmo curso, com
a mesma versão do software, ainda esteja sendo oferecido pela escola;
o Caso o curso tenha sido descontinuado, modificado ou substituído, consulte novas
condições comerciais com o atendimento da escola e conheça nosso programa de
reciclagem profissional, mais uma vantagem para o aluno Digicad.
• Você terá suporte permanente mesmo após o curso podendo tirar suas dúvidas pertinentes
ao treinamento e obter outras informações pelo e-mail:
duvidas@digicad.com.br
Agradecemos sua confiança em nossos treinamentos.
Atenciosamente
Direção
VBA para Excel
SUMÁRIO
INTRODUÇÃO .......................................................................................................................................................13
O QUE É UMA MACRO? ................................................................................................................................................ 13
COMENTÁRIOS............................................................................................................................................................ 37
SIMPLIFICANDO........................................................................................................................................................... 49
VARIÁVEIS ............................................................................................................................................................50
TRABALHANDO COM VARIÁVEIS ..................................................................................................................................... 50
CONSTANTES ........................................................................................................................................................58
INSTRUÇÃO CONST ...................................................................................................................................................... 58
WORKSHEET............................................................................................................................................................... 73
CHARTS ..................................................................................................................................................................... 73
SHAPES ..................................................................................................................................................................... 74
CHARTGROUPS ........................................................................................................................................................... 74
EXEMPLOS ................................................................................................................................................................. 78
WORKBOOKS ..................................................................................................................................................... 78
WORKSHEETS ..................................................................................................................................................... 79
RANGE ............................................................................................................................................................... 80
PROGRAMANDO ..................................................................................................................................................81
ESCREVENDO CÓDIGOS ................................................................................................................................................. 82
ESTRUTURAS ........................................................................................................................................................85
O QUE SÃO ESTRUTURAS .............................................................................................................................................. 85
OPERADORES ............................................................................................................................................................. 85
DO .................................................................................................................................................................... 102
FUNÇÕES ............................................................................................................................................................115
FUNÇÕES MATEMÁTICAS ............................................................................................................................................. 115
Lista das funções de planilha disponíveis no VBA do Excel 2016: .................................................................... 139
REQUISITOS:............................................................................................................................................................. 207
Campos ..........................................................................................................................................................................215
APÊNDICE 2 ........................................................................................................................................................281
PRINCIPAIS PROPRIEDADES DO OBJETO APPLICATION. ...................................................................................................... 282
APÊNDICE 3 ........................................................................................................................................................294
PRINCIPAIS MÉTODOS DO OBJETO APPLICATION ............................................................................................................. 295
APÊNDICE 4 ........................................................................................................................................................307
PRINCIPAIS PROPRIEDADES DO OBJETO WORKBOOKS ....................................................................................................... 308
Pag.: 10 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
APÊNDICE 5 ........................................................................................................................................................311
PRINCIPAIS MÉTODOS DO OBJETO WORKBOOK ............................................................................................................... 312
APÊNDICE 6 ........................................................................................................................................................322
PRINCIPAIS MÉTODOS DO OBJETO WORKSHEET............................................................................................................... 323
APÊNDICE 7 .......................................................................................................................................................328
PRINCIPAIS PROPRIEDADES DO OBJETO WORKSHEET ........................................................................................................ 329
Pag.: 12 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Introdução
Este curso tem por finalidade, ensinar os principais comandos da linguagem VBA (Visual Basic for
Applications). Esta linguagem foi incorporada ao Office, a partir da versão 97 e, vem sendo atualizada a
cada nova versão do Office. Este material cobre a versão do Office 2016, porém ele lhe será muito útil
tanto em versões anteriores (com poucas readaptações) quanto em versões posteriores.
O VBA pode ser usado para automatizar ou personalizar qualquer aplicativo do Office (Word, Excel,
Access, Power Point, Outlook) e outros aplicativos tais como Autocad, CorelDraw etc. Porém, este curso,
será específico para o MS Excel.
O VBA é utilizado para solucionar problemas no Excel, os quais não são possíveis de serem solucionados
usando funções e comandos de planilha. Por exemplo, não existe uma função no Excel para a validação
de um CPF, CNPJ, PIS etc. Neste caso, somente usando programação, o usuário poderá criar uma função
personalizada para fazer as validações. Neste curso você aprenderá, dentre outras coisas, a criar funções
personalizadas, as quais atendem necessidades específicas.
O Visual Basic que vem com o Excel não é a única linguagem que poderá comunicar-se com a biblioteca
de objetos. Qualquer linguagem que ofereça suporte à automação poderá controlar o Excel.
Para um melhor aproveitamento do curso, é fundamental ter conhecimentos avançados em Excel e ter
noções sobre lógica de programação (desenvolvimento de algoritmos).
O Office permite automatizar não só os pressionamentos de teclas, mas também a maior parte das
ações executadas no Office. É possível automatizar, através de macros, quase todas as ações executadas
através das opções da faixa de opções.
O objetivo das macros é programar funções típicas do Excel de forma a facilitar a execução de tarefas
repetitivas.
A criação de uma Macro é semelhante à gravação de uma fita cassete, inicia-se a gravação e realiza-se a
tarefa pretendida que é convertida automaticamente em código de Visual Basic (VB). A tarefa pode ser,
por exemplo, abrir um determinado arquivo de resultados, escolher algumas colunas e criar um
determinado tipo de gráfico.
Com a utilização da macro podemos repetir este conjunto de tarefas o número de vezes que forem
necessário poupando bastante tempo no caso de estarmos analisando uma grande quantidade de
resultados.
Existem tarefas comuns que o usuário repete e volta a repetir várias vezes. Por exemplo, aplica
frequentemente a mesma combinação de formatos ou recebe dados todas as semanas ou meses que
organiza e analisa sempre do mesmo modo. É possível utilizar uma macro para combinar todos os
passos de uma tarefa num único comando.
A macro grava cliques do mouse e combinações de teclas à medida que o usuário trabalha e permite
reproduzi-las mais tarde. É possível utilizar uma macro para gravar a sequência de comandos utilizados
ao efetuar determinada tarefa. Quando uma macro é executada, reproduz os comandos exatos, na
mesma ordem em que foram gravados, o que faz com que o Excel se comporta como se o próprio
usuário tivesse digitado os comandos.
É fácil criar macros: o usuário dá instruções ao Excel para começar a gravar, efetuar as ações que realiza
normalmente e, em seguida, indica ao Excel que terminou. O Excel utiliza uma linguagem de
programação denominada Visual Basic for Applications (VBA) para gravar as instruções. Não é
necessário ter conhecimentos de programação ou de VBA para gravar e utilizar macros que irão poupar
tempo e facilitar o trabalho.
Este material mostra desde como criar e utilizar, usando o gravador de macros, uma simples macro de
formatação de células e como alterar esta macro para fazer ainda mais, até códigos avançados que não
são possíveis de serem criados através do gravador de macros. Também explica as opções de
armazenamento de macros, de modo a poder utilizá-las a partir de qualquer pasta de trabalho.
Aplicar formatos é um exemplo de macro bastante simples, mas é possível gravar macros para efetuar
tarefas mais complexas, tais como obter e filtrar dados externos, criar e personalizar gráficos, criar
funções para cálculos científicos e muito mais.
O gravador de macros é limitado, ou seja, não consegue criar códigos para todos os passos que você
desejar. Sendo assim, é necessário, ter conhecimento dos principais eventos, métodos, propriedades,
objetos e comandos de programação do MS Excel, que serão vistos no decorrer do curso. E, de posse
destes conhecimentos, poder criar códigos sem a utilização do gravador de macros.
Inconvenientes
A macro executa literalmente as tarefas que foram gravadas. Imagine, por exemplo, que você pretende
abrir um arquivo de resultados chamado resultados.xls com 3 colunas e 100 linhas que se encontra na
pasta C:\resultados e fazer um gráfico de pontos com a coluna 1 e 3. Para a macro ser bem sucedida
sempre que for chamada, estas condições têm que ser mantidas, ou seja, se o arquivo tiver outro nome
ou estiver armazenado em outra pasta a macro dará, imediatamente, indicação de erro. Pode ainda
acontecer de, o novo arquivo de resultados ter 200 linhas, neste caso só as primeiras 100 linhas vão ser
plotadas no gráfico, pois foi este o limite imposto durante a gravação da macro ou ainda a coluna 3 estar
vazia o que irá gerar obviamente um gráfico sem pontos.
No entanto todos estes inconveniente podem ser resolvidos por meio de programação simples da
macro em que parâmetros como o nome e o caminho para o arquivo, ou ainda os limites para a
realização de gráficos podem ser definidos pelo usuário através de uma interface programável. Para
acessar o ambiente de programação é necessário editar a macro como será demonstrado no decorrer
Pag.: 14 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
do curso. Em alguns casos, pode-se, durante a gravação da macro, usar referencias relativas. Assim o
código não ficará amarrado a um determinado intervalo.
Este botão também está presente na guia Desenvolvedor. Caso esta guia não esteja visível, siga o
procedimento abaixo para exibi-la.
1. Clique, com o botão direito do mouse, em qualquer lugar da Faixa de Opções. O Excel exibirá o
seguinte menu:
3. No dialogo Opções do Excel, que será exibido, ative, no painel à direita, a opção Desenvolvedor.
Após clicar no botão Gravar Macro, será aberta a caixa de diálogo Gravar macro.
Nome da macro: Digite um nome para a macro com até 64 caracteres (não utilize espaços).
Tecla de Atalho: Digite uma letra para ser usada como tecla de atalho. Para atalhos do tipo: Ctrl+Letra
use letra minúscula, para Ctrl+Shift+Letra use letra maiúscula. A definição de uma
tecla de atalho não é obrigatória.
Importante: caso seja definida uma tecla de atalho que execute comandos do Excel, como Ctrl+C
(Copiar), por exemplo. Ao pressionar o atalho, será executada a macro e não o comando do Excel.
Sendo assim, é preferível preservar os atalhos do Excel, defina sempre uma letra maiúscula como
atalho.
Armazenar macro em: Escolha aqui, o local onde a macro será armazenada.
Pag.: 16 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Armazena a macro em um arquivo com o nome Personal.xlsb, que fica localizado no caminho:
“D:\Users\NomeDoUsuário\AppData\Roaming\Microsoft\Excel\XLINÍCIO”.
As pastas de trabalho deste diretório são abertas na inicialização do Excel.
O arquivo Personal.xlsb fica oculto.
Para ver seu conteúdo clique na guia Reexibir / grupo Janela / botão Reexibir.
Mas não é necessária a sua exibição. Na verdade, o ideal é que fique oculta.
Nova pasta de trabalho – Cria um novo arquivo xlsm para armazenar a macro.
Após clicar no botão OK, o botão Gravar macro será alterado para Parar gravação .
Exemplo passo-a-passo 1
6. Não clique em nenhum lugar na planilha, apenas clique na guia Página Inicial
, escolha uma cor .
Analisando o código
Para visualizar o código gerado pelo gravador de macros, use o atalho ALT+F11 ou clique na guia
Desenvolvedor e depois no botão Visual Basic. Será exibido a seguinte tela:
De um duplo clique no item módulos e, em seguida, um duplo clique em Módulo1. Será exibido a
seguinte tela:
Outra forma para você visualizar o código é a seguinte: Clique na guia Desenvolvedor e em seguida no
botão Macros ou use o atalho Alt+F8 será aberta a caixa diálogo Macro, onde você poderá selecionar o
nome da macro desejada e clicar no botão Editar.
Pag.: 18 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Atenção:
Ao salvar pela primeira vez, um arquivo com macro, você receberá a seguinte mensagem:
Quando Salvamos apenas uma pasta de trabalho sem Macros, é criado um arquivo .xlsx, o projeto é um
arquivo .xlam, quando salvamos uma pasta de trabalho habilitada para Macros, serão encapsulados os 2
arquivos em um único criando o arquivo .xlsm.
Analisando a macro
Para executar a Macro, selecionamos um intervalo qualquer e pressione o atalho Ctrl+Shift+P e observe
que os intervalos serão pintados automaticamente.
Exemplo passo-a-passo 2
Vamos criar um processo simples, porém que gera grande quantidade de código. Isso mostra que
mesmo em projetos mais avançados utilizando o VBA, podemos utilizar uma Macro para aproveitar um
código.
Pag.: 20 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
6. Não clique em nenhum lugar na planilha, apenas clique na guia Página Inicial ,
selecione Todas as bordas.
Analisando o código
Assim como no exemplo anterior, vamos abrir o código em Visual Basic ou Editar Macro.
Como podemos analisar, foram gerados várias linhas de código, porém quando o código é gerado
automaticamente, gera alguns comandos que não são necessário para o que precisamos.
No código acima vamos fazer um refinamento, ou seja, vamos eliminar o código desnecessário.
Como realizamos esse processo de refinamento, deletamos linha a linha e testamos se o código
continua executando com o resultado que esperamos.
Pag.: 22 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Como podemos ver, removemos grande parte do código que seria desnecessário para nosso objetivo.
Nota:
É uma boa prática remover o código desnecessário na geração da Macro, dessa forma ganha-se em
performance no processo já que ele deixa de executar comandos que não interferem no objetivo final.
Planilha Formulário
Esta macro deverá pegar os dados digitados na planilha Formulário e movê-los para a primeira linha
vazia da planilha Base de dados.
Exemplo Passo-a-passo 3:
1. Clique na guia da planilha Formulário para ativá-la.
Tecla de atalho: G
3. Selecione a célula A2. A célula A2 deve ser selecionada após o inicio da gravação da Macro, mesmo
que ela já esteja seleciona, pois precisamos informar onde a Macro deve iniciar.
4. Precione as teclas Ctrl+Shift+SetaDireita. Esse processo poderia ser selecionado todo o intervalo
“A2:D2”, porém faremos dessa forma para analisar como o código reage com essa ação.
9. Na guia Desenvolvedor, clique no botão Usar Referências relativas . Podemos vericar queo botão
ficou marcado como selecionado.
10. Pressione a tecla Seta para baixo (seleciona a primeira linha em branco).
Pag.: 24 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
13. Na guia Desenvolvedor, clique novamente no botão Usar Referências relativas para deixa-lo
desmarcado.
Para acionar esta nova macro, vamos adicionar um botão de comando na planilha. Para isto, execute os
passos a seguir:
1. Na guia Desenvolvedor, clique no botão Iserir e insira o Controle de Formulário Botão de comando.
3. Será exibido a janela Atribuir macro, onde iremos selecionar a macro GravarRegistro e clicar no
botão OK.
4. Com o botão ainda selecionado, clique com o botão direito do Mouse e selecione a opção Editar
Texto.
5. Altere o texto do botão para Gravar e clique fora para remover a seleção.
Nota:
Para editar novamente o botão, ou mover para outro local, clique com o botão direito do Mouse sobre
ele para poder selecionar, depois pode editar ou movimentar conforme necessário.
Analisando o Código
Pag.: 26 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Assim como nos exemplos anteriores, vamos abrir o código em Visual Basic ou Editar Macro.
Podemos ver que o nome do Método é o nome que demos para a Macro “GravarRegistro()”.
Abaixo vemos, com o texto em verde e iniciando com apóstrofos, comentários do código. (Os
comentários são trechos que não são executados quando rodamos o método, são utilizados para
informações do método). Podemos que a primeira linha de comentário é o nome da macro, seguido pelo
texto que inserimos no campo Descrição, e finalizando com a tecla de atalho para chamar o método.
Pag.: 28 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
botões Finalidade
3. Objeto de desenho.
4. Caixa de macro.
6. Item de menu.
Já utilizamos nos exemplos acima, telha de atalho, Botão de Comando e com a Caixa Executar Macro,
agora vamos outras formas.
Formas ou Imagem
Você pode inserir um botão na Barra de ferramentas de acesso rápido e, depois, associar uma macro a
ele.
O uso de botões na Faixa de Opções, sem usar comandos XML, só devem ser usados para comandos
genéricos. Ou seja, comandos que podem ser usados em qualquer pasta de trabalho. E, neste caso, os
códigos devem estar na pasta pessoal de macros Personal.xlsb.
Pag.: 30 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Grupo Fonte da guia Página Inicial Grupo Classificar e Filtrar da guia Dados
Para adicionar um botão para acionar a macro AzulNegr16, clique com o botão direito do mouse sobre a
Faixa de Opções e selecione a opção Personalizar a Faixa de Opções.
No diálogo Opções do Excel, painel direito, selecione a guia desejada. No caso, Pagina Inicial.
Clique no símbolo de adição à esquerda de Página Inicial para exibir seu conteúdo.
Para adicionar um botão de comando no Ribbon, é necessário criar um novo grupo. Para isto, selecione
o item Fonte e depois no botão Novo grupo.
No painel da esquerda, clique em GravarRegistro e arraste para cima do item Formatação do painel da
direita. Apos soltar o mouse, clique no botão Renomear e, se necessário, altere o texto do botão. Para
alterar a imagem do botão personalizado, clique no botão Renomear e escolha uma imagem conforme
tela abaixo:
Para fazer testes, basta selecionar uma ou mais células e clicar no botão que você acabou de adicionar.
Se quiser, você poderá adicionar uma nova guia personalizada. Ou seja, uma guia exclusiva só para
acomodar suas macros.
Pag.: 32 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
5. Note que o Excel adicionou automaticamente, o ícone padrão para o botão. Para escolher um novo
ícone, mantenha GravarRegistro selecionado, clique no botão Modificar e escolha uma das figuras
exibidas no quadro.
6. Pressione OK para confirmar a figura selecionada e, em seguida, pressione OK para fechar o diálogo
Opções do Excel.
É possível adicionar uma imagem customizada. Mas, para isto, é necessário usar código XML.
Para testar, selecione uma ou mais células com o texto Teste e clique no botão que você acabou de
adicionar.
ATENÇÃO:
Pag.: 34 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Podemos alterar as cores, porém cuidado pois não é recomendado utilizar cores padrões em outros
componentes, pois podemos confundir.
Cor Significado
A cor azul é usada para destacar as Palavras-Chave da linguagem. Ex: Sub, End Sub,
Azul
Function, If, Then, Else, While, Loop,…
A cor vermelha aparece durante a edição do código e, é usada para destacar as linhas
Vermelho
que possuem erros de sintaxe.
Pag.: 36 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
A cor de fundo amarela é usada para indicar que ocorreu um erro, na linha onde a cor
Amarelo
se apresentar, durante a execução do código.
Comentários
Os comentários são um ótimo recurso para a documentação do código. Para inserir um comentário, use
o símbolo apóstrofo ( ' aspas simples) da seguinte forma:
'A linha abaixo declara a variável X.
Dim X As Double
Nota:
Os comentários também são utilizados como documentação do código, porém cuidado com o excesso
de comentários, pois em metodologia de Clean Code (Código Limpo), onde visamos um código funcional
e simples, é defido que não é necessário utilizar comentários, pois o código em si já seria a
documentação, pois ele tem que ser claro e objetivo, o próprio código já falar o que faz.
Para contornar este problema, use o caractere _ (sublinhado) ele, nos permite indicar ao VBA que a
instrução continuará na próxima linha.
A linha abaixo, gera erro de sintaxe (note que não há espaço antes do sublinhado).
MsgBox "A área é: " & Area, vbInformation, "Calculo da Área do Círculo"
Quando você precisar quebrar a linha no meio de um texto, proceda da seguinte forma: Feche o texto
com aspas " Digite o caractere & (e comercial) pressione a tecla Espaço e digite o caractere de
continuação de linha _.
A janela do VBA possui outras janelas, as quais podem ficar flutuando na tela ou encaixada em uma das
quatro laterais.
Pag.: 38 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Janela de Projetos
Exibir código Exibe a janela Code para que você possa gravar e editar código associado ao item
selecionado.
Exibir objeto Exibe a janela Objeto para o item selecionado, um Documento ou UserForm
existente.
Alternar pastas Oculta e mostra as pastas de objetos enquanto exibe os itens individuais contidos
nelas.
Janela de Propriedades
Janela UserForm
Permite-lhe criar as janelas ou caixas de diálogo no
seu projeto. Você desenha e visualiza controles em um
formulário.
Janela de Edição
A janela de edição exibe o código em Visual Basic for Applications
associado ao elemento selecionado na janela do Project Explorer.
Onde:
Pag.: 40 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Pesquisador de Objetos
O Pesquisador de objeto permite que você procure
todos os objetos disponíveis no seu projeto e veja suas
propriedades, métodos e eventos. Além disso, você
pode ver os procedimentos e constantes que estão
disponíveis em bibliotecas de objetos no seu projeto.
Você pode facilmente exibir a Ajuda on-line enquanto
procura. Você pode usar o Pesquisador de objeto para
localizar e usar objetos que você cria ou objetos de
outros aplicativos.
Para pesquisar uma palavra qualquer no Pesquisador de objetos, proceda da seguinte forma: digite o
texto de pesquisa e, em seguida clique no botão Pesquisar .
Na Caixa de combinação onde está escrito Todas as bibliotecas, selecione a aplicação para a qual
pretende ajuda – neste caso Excel. Convém referir que poderá utilizar as funções de toda e qualquer
aplicação.
Na área intitulada Classes, aparecem todos os objetos específicos para o manuseamento da aplicação
selecionada. A classe especial designada Globais refere-se às funções que estão disponíveis na aplicação
independentemente dos objetos selecionados.
Selecione um dos objetos e visualize do lado direito os Membros do Elemento selecionado. No caso
Globais.
Para cada membro da classe dispõe de uma ajuda on-line que o esclarece sobre a respectiva função e
funcionamento, dando um exemplo que poderá testar. Para tal basta clicar sobre o botão de Ajuda da
janela do Pesquisador de Objetos.
Janela Code
Planilha
Use a janela Code para escrever, exibir ou editar códigos de Visual Basic. Você pode abrir tantas janelas
Code quantos forem os módulos, de modo que possa visualizar facilmente o código em diferentes
formulários ou módulos e copiar e colar entre eles.
UserForm: clique duas vezes em um controle ou formulário e escolha Código no menu Exibir ou
pressionando F7.
Você pode dividir a janela Code horizontalmente em dois painéis para exibir diferentes segmentos do
código de um módulo ao mesmo tempo. Cada painel se movimenta separadamente, na horizontal e na
vertical. As opções da caixa Procedimento e Objeto referem-se ao painel que está com o foco. As
alterações de código são imediatamente refletidas nos dois painéis.
Pag.: 42 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
A janela Verificação imediata exibe informações que são o resultado de instruções de depuração no seu
código ou de comandos digitados diretamente na janela.
• Copiar e colar o código da janela Verificação imediata para a janela Code, mas não permite salvar
código na janela Verificação imediata.
• A janela Verificação imediata pode ser arrastada e posicionada em qualquer lugar na sua tela a
menos que você a tenha tornado uma janela encaixável a partir da guia Encaixe na caixa de diálogo
Opções.
• Você pode fechar a janela clicando no botão Fechar. Se o botão Fechar não estiver visível, clique
duas vezes na barra de título para tornar o botão Fechar visível e, em seguida, clique nele.
• Você pode alterar o tamanho dos cabeçalhos das colunas arrastando a sua borda para a direita para
aumentá-la ou para a esquerda para diminuí-la.
• Fechar a janela, clicando na caixa Fechar. Se a caixa não estiver visível, clique duas vezes na barra
Título para torná-la visível.
Autolist Members
Pag.: 44 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Tipos de Métodos
Cada código criado através da linguagem VBA (Visual Basic for Applications), seja através do gravador de
macros ou editadas manualmente, é denominado Método.
Os métodos de ação podem ou não ter argumentos para serem chamados, e podem ser executados
diretamente pelo código ou chamados de algum evento ou outros métodos.
Sub NomeDoMétodo(argumentos)
...
Linhas de código
...
End Sub
Para criar o método iniciamos declarando qual o tipo do método, nesse caso utilizamos a palavra Sub,
em seguida informamos um nome para esse método e pressionamos Enter. Nesse momento será criado
a estrutura de bloco do método contento o início do método “Sub NomeMetodo()” e o fechamento de
bloco do método “End Sub”. Todo precedimento que o método deverá executar, deve ser escrito dentro
do bloco.
Nota:
O nome tem algumas regras que iremos estudar com mais detalher mais a frente em Regras de
Nomenclatura, resumindo não podemos utilizar caracteres especiais nem espaços em branco no nome.
Observe os parênteses () eles fazem parte do método e sua finalidade é a de delimitar os argumentos
passados para o método.
Os parâmetros (argumentos) não são obrigatórios em um método Sub. Mas, mesmo assim, os
parênteses () devem estar presente.
Desafio 1
Vamos criar um método que receba um nome, depois o sobrenome e exibir uma mensagem contendo
o nome completo.
Também é possível executar os mesmos procedimentos que são executados nos métodos de Ação em
um método de retorno, porém não é uma boa prática, pois os métodos que executam tarefas são os de
Ação, por exemplo, não é uma boa prática criar Caixas de Diálogo (MsgBox ou InpuBox) dentro de um
método de Retorno (Function). Mais a frente será demonstrado um exemplo de, porque não utilizar
métodos de Retorno com procedimentos de Ação.
Outra diferença entre os métodos de Ação e Retorno, é a forma de executar os métodos. Os métodos de
Ação são executados conforme informado acima, atribuindo a chamada a um botão, imagem,
executando pela janela de Macros, ou diretamente pela tela de código pressionado o botão executar ou
atalho F5. Já os métodos de Retorno são chamados de algum lugar e o resultado atribuído a algum local.
Exemplo chamamos a Function e atribuímos o resultado a uma variável.
Para criar os métodos iniciamos pela palavra que define o tipo do método, Function, damos um nome
ao métodos, se necessário informamos um argumento e, diferente do método de Ação, informamos
qual tipo de dado o método irá retornar (String, Integer, Boolean, etc...)
Pag.: 46 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
• Na primeira linha (Function RetornaMensagem() As String) foi definido o nome para o método
como RetornaMensagem, o método não contém argumento e retorna um texto (As String)
• Na segunda linha (Dim mensage As String) definimos a variável com o nome mensagem.
• Na terceira linha (nome = "Bom dia turma do VBA") atribuímos um valor para a
variável
• E na ultima linha (End Function) encerramos o bloco Function.
Agora como podemos executar esse método? Conforme falamos acima, o método não é executado e
sim chamado de algum local. Vamos criar um método de Ação (Sub) para chamar nosso método.
' Criando um método Sub para chamar a Function
Sub ExecutandoMensagem()' Este método não utiliza argumentos
Dim mensagem As String ' Declara a variável que irá receber a Function
Agora vamos imaginar que será necessário informar um nome para a mensagem, Exemplo “Bom dia
José”, precisamos um um nome de uma forma dinâmica. Como vimos no método Sub, podemos utilizar
a Caixa de Diálogo InputBox, e em tempo de execução informar um nome que será concatenado a
mensagem, mas na Function, por mais que permita, não é remendado utilizar Caixas de Diálogo. Então
como faremos?
Sempre que for necessário passar um valor para uma Function, iremos utilizar Argumentos, como no
exemplo abaixo.
Function RetornaMensagemComNome(nome As String) As String
Dim mensagem As String ' Declara a variável para receber uma mensagem
End Function
No exemplo acima, criamos um argumento nome do tipo String, agora sempre que chamar o método,
será necessário informar um valor para o argumento.
' Criando um método Sub para chamar a Function
Sub ExecutandoMensagem()' Este método não utiliza argumentos
Dim mensagem As String ' Declara a variável que irá receber a Function
Dim nome As String ' Declara a variável que receberá um nome
Agora podemos passar argumentos para nosso método. Com um método Sub, recebemos um nome
utilizando uma Caixa de Diálogo (InputBox) para atribuir a uma variável nome, e passamos essa variável
como argumento no método RetornaMensagemComNome.
Famos facilitar o entendimento, suponhamos que exista uma lista com diversos nomes, e será
necessário criar uma mensagem para cada nome.
Pag.: 48 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Simplificando
Sempre que gravamos uma Macro, é executado uma Ação, ou seja, movimentos pela tela, serão gerados
métodos Sub.
Todas a Funções do Excel (PROCV, SOMASE, ÍNDICE, CORRESP, etc...) são Functions, pois são chamadas
de um local, célula do Excel, executam alguma tarefa de cálculo, buscar, analise, e retornam um
resultado onde foi chamado. O sinal de “=” dentro da célula quando vamos chamar uma função no
Excel, significa que estamos atribuindo um valor para aquela célula, no caso o resultado do método.
Desafio 2
Vamos criar uma função que receba 2 argumentos, um nome e um sobrenome, e devolva o nome
completo.
Obs. Para adicionar mais que um argumento, utilizamos Vírgula (,) para separa, e quando chamamos
no Excel, assim como os argumentos de métodos como PROCV, utilizamos Ponto e Vírgula (;)
Variáveis
Variável é um local de armazenamento nomeado que pode conter dados, os quais podem ser
modificados durante a execução do programa. Cada variável possui um nome que a identifica com
exclusividade dentro de seu escopo. Um tipo de dados pode ser ou não especificado.
Os nomes de variável devem começar com um caractere alfabético, devem ser exclusivos dentro do
mesmo escopo, não podem ter mais de 255 caracteres e também não podem conter um ponto ou
caractere de declaração de tipo incorporado.
Imagine a memória de um computador como um grande arquivo, com várias gavetas, onde é possível
guardar, em cada gaveta, apenas um único valor por vez. E que estas gavetas deverão, como em um
arquivo, estarem identificadas como uma etiqueta contendo um nome.
Declarar uma variável é estabelecer o seu tipo, de acordo com a finalidade (uso) da mesma.
Exemplos:
Dim nome As String
Dim pi As Double
Dim x As Integer
Observe que devemos declarar o tipo para cada uma das variáveis, se você usar, por exemplo:
Dim x, y As Integer
Apenas y será do tipo Integer. Pois, quando não explicitamos o tipo de uma variável, como no caso do x,
o VBA assume como sendo do tipo Variant.
Pag.: 50 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
$ String
Exemplo de como Declarar uma variável usado o
% Integer
caractere de tipo:
& Long
! Single
Dim S$, I%, L&, Si!, D#, C@
# Double
@ Currency
Declarando variáveis
Ao declarar variáveis, você geralmente utiliza uma instrução Dim. Uma instrução de declaração pode ser
colocada dentro de um método para criar uma variável de nível de procedimento. Ou ela pode ser
colocada na parte superior de um módulo, na seção Declarações, para criar uma variável de nível de
módulo.
Se esta instrução aparecer dentro de um procedimento, a variável strName poderá ser utilizada
somente nesse procedimento. Se a instrução aparecer na seção Declarações do módulo, a variável
strName estará disponível para todos os procedimentos dentro do módulo, mas não para
procedimentos em outros módulos no projeto. Para tornar essa variável disponível para todos os
procedimentos no projeto, preceda-a com a instrução Public, como no exemplo a seguir:
Public strName As String
• Você não pode utilizar um espaço, ponto (.), ponto de exclamação (!) ou os caracteres @, &, $, # no
nome.
• Geralmente, você não deve utilizar nomes iguais às funções, instruções e métodos do Visual Basic.
Você acaba encobrindo as mesmas palavras-chave na linguagem. Para utilizar uma função, instrução
ou método intrínsecos da linguagem que entre em conflito com um nome atribuído, você deve
identificá-lo explicitamente. Preceda o nome da função, instrução ou método intrínseco com o nome
da biblioteca de tipos a que está associado.
Pag.: 52 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Por exemplo, se você tiver uma variável chamada Left, só poderá invocar a função Left utilizando
VBA.Left.
• Você não pode repetir nomes dentro do mesmo nível de escopo. Por exemplo, você não pode
declarar duas variáveis com o nome idade dentro do mesmo procedimento.
No entanto, é possível declarar uma variável privada com o nome idade e uma variável em nível de
procedimento com o nome idade dentro do mesmo módulo.
Observação O Visual Basic não diferencia maiúsculas de minúsculas, mas preserva a colocação em
minúscula na instrução em que o nome for declarado. Falaremos mais sobre boas prática mais a
frente.
As variáveis podem ser declaradas como um dos seguintes tipos de dados: Boolean, Byte, Integer, Long,
Currency, Single, Double, Date, String (para sequências de caracteres de comprimento variável), String
* length (para sequências de caracteres de comprimento fixo), Object, ou Variant. Caso você não
especifique um tipo de dados, o tipo de dados Variant será atribuído como padrão. Você também pode
criar um tipo definido pelo usuário através da instrução Type. Para obter mais informações sobre tipos
de dados, consulte Resumo de tipos de dados na Ajuda do Visual Basic.
Você pode declarar diversas variáveis em uma instrução. Para especificar um tipo de dados, você deve
incluir o tipo de dados para cada variável. Na instrução a seguir, as variáveis intX, intY e intZ são
declaradas como tipo Integer.
Dim intX As Integer, intY As Integer, intZ As Integer
Na instrução a seguir, intX e intY são declaradas como tipo Variant; apenas intZ é declarada como tipo
Integer.
Dim intX, intY, intZ As Integer
Você não precisa fornecer o tipo de dados da variável na instrução de declaração. Caso você omita o
tipo de dados, a variável será do tipo Variant.
Para forçar a declaração explícita de todas as variáveis desse módulo use a instrução Option Explicit.
Comentários: Se usada, a instrução Option Explicit deve aparecer em um módulo antes de qualquer
procedimento.
Quando Option Explicit aparece em um módulo, você será forçado a declarar explicitamente todas as
variáveis usando as instruções Dim, Private, Public, ReDim ou Static. Se você tentar usar o nome não
declarado de uma variável, ocorrerá um erro em tempo de compilação.
Se você não usar a instrução Option Explicit, todas as variáveis não declaradas serão do tipo Variant, a
menos que o tipo padrão seja especificado com uma instrução Deftipo.
Observação Use Option Explicit para evitar a digitação incorreta do nome de uma variável existente ou
para evitar confusão no código em que o escopo da variável não esteja claro e também, por questão de
portabilidade.
Você pode definir uma opção no ambiente de programação do Visual Basic para incluir
automaticamente a instrução Option Explicit em todos os módulos novos.
Para isto, na janela do VBA, clique no menu Ferramentas / Opções e ative a opção Requerer declaração
de variável.
Pag.: 54 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Quando você utiliza um aplicativo para controlar os objetos de outro aplicativo, você deve definir uma
referência à biblioteca de tipos do outro aplicativo. Quando você define uma referência, pode declarar
as variáveis de objeto de acordo com o tipo mais específico. Por exemplo, caso esteja no Microsoft
Word ao definir uma referência à biblioteca de tipos do Microsoft Excel, você pode declarar uma
variável do tipo Worksheet a partir do Microsoft Word para representar um objeto Worksheet do
Microsoft Excel.
Caso você esteja utilizando outro aplicativo para controlar objetos do Microsoft Access, poderá, na
maioria dos casos, declarar as variáveis de objeto de acordo com o tipo de dados mais específico. Você
também pode utilizar a palavra-chave New para criar automaticamente uma nova ocorrência de um
objeto. No entanto, talvez você deva indicar que ele é um objeto do Microsoft Access. Por exemplo,
quando você declara uma variável de objeto para representar um formulário do Microsoft Access, a
partir do Microsoft Visual Basic, deve diferenciar o objeto Form do Microsoft Access de um objeto Form
do Visual Basic. Inclua o nome da biblioteca de tipos na declaração da variável, como no exemplo a
seguir:
Dim frmEncomendas As New Access.Form
Alguns aplicativos não reconhecem tipos de objeto individuais do Microsoft Access. Mesmo se definir
uma referência à biblioteca de tipos do Microsoft Access a partir desses aplicativos, você deve declarar
todas as variáveis de objeto do Microsoft Access como tipo Object. Você também não pode utilizar a
palavra-chave New para criar uma nova ocorrência do objeto. O exemplo a seguir mostra como se
declara uma variável para representar uma ocorrência do objeto Application do Microsoft Access a
partir de um aplicativo que não reconhece tipos de objeto do Microsoft Access. Em seguida, o aplicativo
cria uma ocorrência do objeto Application.
Dim appAccess As Object
Para determinar a qual sintaxe um aplicativo oferece suporte, consulte a documentação do aplicativo.
Exemplos:
Dim pi As double, nome As string
pi = 3,14159
Nome = "João da Silva"
A última instrução não declara explicitamente a variável Var3, mas declara a variável implícita ou
automaticamente. As variáveis que são declaradas implicitamente são especificadas como o tipo de
dados Variant.
Dica Se você especificar um tipo de dados para uma variável ou argumento e, em seguida, utilizar o
tipo de dados errado ocorrerá um erro de tipo de dados. Para evitar erros de tipo de dados, utilize
somente variáveis implícitas (o tipo de dados Variant) ou declare explicitamente todas as suas variáveis
e especifique um tipo de dados. O último método é mais apropriado.
Quando usada em aplicativos do host que permitem referências em múltiplos projetos, Option Private
Module impede que o conteúdo de um módulo seja referenciado fora do seu projeto.
Pag.: 56 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Comentários
Se usada, a instrução Option Private deve aparecer no nível de módulo antes de qualquer
procedimento.
Quando um módulo contém Option Private Module, as partes públicas, por exemplo, variáveis, objetos
e tipos definidos pelo usuário declarados no nível de módulo, continuam disponíveis dentro do projeto
que contém o módulo, mas não ficam disponíveis para outros aplicativos ou projetos.
Este exemplo demonstra a instrução Option Private, que é usada no nível de módulo para indicar que o
módulo inteiro é privado. Com Option Private Module, as partes no nível de módulo não declaradas
Private ficam disponíveis para outros módulo do projeto, mas não para outros projetos ou aplicativos.
Constantes
Um item nomeado que mantém um valor constante por toda a execução de um programa. Uma
constante pode ser uma literal de sequência de caracteres ou numérica, outra constante ou qualquer
combinação que inclua operadores aritméticos ou lógicos, exceto o operador Is e o operador ^
(Exponenciação). Cada aplicativo host pode definir seu próprio conjunto de constantes.
Constantes adicionais podem ser definidas pelo usuário com a instrução Const. Você pode utilizar
constantes em qualquer lugar do seu código em vez de valores reais.
Instrução Const
Declara as constantes a serem usadas no lugar de valores literais.
Parte Descrição
Opcional. Palavra-chave usada no nível de módulo para declarar constantes que estejam
Public disponíveis para todos os procedimentos em todos os módulos. Não é permitida em
procedimentos.
Opcional. Palavra-chave usada no nível de módulo para declarar constantes disponíveis apenas
Private
dentro do módulo no qual a declaração é feita. Não é permitida em procedimentos.
Opcional. Tipo de dados da constante; pode ser Byte, Boolean, Integer, Long, Currency, Single,
type Double, Date, String ou Variant. Use uma cláusula As type separada para cada constante que for
declarada.
Comentários
As constantes são particulares por padrão. Dentro de procedimentos, as constantes sempre serão
particulares; sua visibilidade não pode ser alterada. Em módulos padrão, a visibilidade padrão de
constantes no nível de módulo pode ser alterada com a palavra-chave Public. Nos módulos de classe,
contudo, as constantes só podem ser particulares e sua visibilidade não pode ser alterada com a
palavra-chave Public.
Para combinar diversas declarações de constantes na mesma linha, separe cada atribuição de constante
com uma vírgula. Quando as declarações de constante são combinadas dessa forma, a palavra-chave
Public ou Private, se usada, aplica-se a todas elas.
Pag.: 58 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
• Você não pode usar variáveis, funções definidas pelo usuário ou funções intrínsecas ao Visual
Basic (como Chr) em expressões atribuídas a constantes.
Observação As constantes podem tornar seus programas automaticamente documentáveis e
fáceis de serem modificados. Ao contrário das variáveis, as constantes não podem ser alteradas
inadvertidamente enquanto seu programa está sendo executado.
• Se você não declarar explicitamente o tipo de constante usando As type, a constante receberá o
tipo de dados mais apropriado a expression.
• As constantes declaradas em um procedimento Sub, Function ou Property são locais a esse
procedimento. Uma constante declarada fora de um procedimento é definida em todo o
módulo no qual é declarada. Você pode usar constantes em qualquer lugar em que for possível
usar uma expressão.
Declarando constantes
Através da declaração de uma constante, você pode atribuir um nome significativo a um valor. Utilize a
instrução Const para declarar uma constante e definir o seu valor. Depois que uma constante tiver sido
declarada, não será possível modificá-la ou atribuir-lhe um novo valor.
Você pode declarar uma constante dentro de um procedimento ou na parte superior de um módulo, na
seção Declarações. Como padrão, as constantes em nível de módulo são privadas. Para declarar uma
constante em nível de módulo público, preceda a instrução Const com a palavra-chave Public. Para
declarar explicitamente uma constante privada, preceda a instrução Const com a palavra-chave Private
para facilitar a leitura e a interpretação do seu código. Para obter mais informações, consulte
Compreendendo o escopo e a visibilidade na Ajuda do VBA. O exemplo a seguir declara a constante
Public IdadeLimite como um Integer e atribui a ela o valor 34.
Public Const IDADE_LIMITE As Integer = 34
As constantes podem ser declaradas como um destes tipos de dados: Boolean, Byte, Integer, Long,
Currency, Single, Double, Date, String ou Variant. Como você já conhece o valor de uma constante,
pode especificar o tipo de dados em uma instrução Const. Para obter mais informações sobre tipos de
dados, consulte Resumo de tipos de dados na Ajuda do VBA.
Você pode declarar diversas constantes em uma instrução. Para especificar um tipo de dados, você deve
incluir o tipo de dados de cada constante. Na instrução a seguir, as constantes Idade e Salario são
declaradas como Integer e Currency respectivamente.
Const IDADE As Byte = 34, SALARIO As Currency = 35.000
Desafio 3
Vamos criar um método que receba doi nomes, exemplor JOSÉ e MARIA, armazenar cada nome em
uma variável e depois trocar o valor das variáveis uma com a outra.
Ex.
nome1 = “MARIA”
nome2 = “JOSE”
nome1 = “JOSE”
nome2 = “MARIA”
Pag.: 60 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Alguns exemplos são na forma de definir nomes (variáveis, métodos, objetos, constantes), que defimos
uma forma para cada tipo.
O Visual Basic não faz diferença entre letras maiúsculas e minúsculas para os objetos porém se forem
criados maiúsculo, ela será utilizada maiúscula, não tem como utilizar minúscula.
Na tabela abaixo veremos algumas boas práticas de nomenclatura. Lembrando que não é obrigatório o
uso, apenas boas práticas.
Outra coisa que normalmente não utilizamos, mas o sistema permite é utilização de acentos nos nomes
de métodos, variáveis ou constantes.
O problema na utilização de acentos é que quando for chamar o método, variável ou constante que
contém algum acento, e esquecer de colocar o acento, irá gerar um erro ao executar.
Public Sub BoasPraticas()
' atribuindo valor a uma variável
' sabemos que é uma variável pois iniciou com minusculo
mensagem = "Bom dia turma do VBA"
' chamando um método. Cada palavra inicia com maiúsculo
AbrirArquivo
' aqui temos uma variável (imagem) que recebe o endereço padrão das imagens
' concatenado com o nome do arquivo. O endereço padrão é uma constante
' vemos que o nome está inteiro em maiúsculo
imagem = ENDERECO_IMAGENS & "produto.jpg"
End Sub
Modificadores de Acesso
Os modificadores de acesso são utilizados para definir o nível de acesso a uma variável (no nível de
módulo), método ou constante.
Os modificadores são PUBLIC e PRIVATE, que são definidos no ínicio da criação, conforme exemplos
abaixo.
' Definindo uma variável com a instrução DIM, que ficará com nível privado
Dim variavelPrivada As String
Os modificadores Public podem ser acessados de qualquer lugar do projeto, em outros módulos, em
formulários, em códigos de planilhas, já os modificadores Private podem ser acessados somente dentro
da própria escopo.
Pag.: 62 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
O módulo do lado esquerdo, temos os métodos com seus respectivos Modificadores, e o ultimo método
não foi definido modificador.
O módulo do lado esquerdo, temos os métodos que irão acessar os métodos do primeiro módulo.
O primeiro método consegue acessar, pois o método MetodoPublico foi definido como Public, portanto
é possível acessar de outro escopo.
O segundo método não conseguirá acesso, será gerado um erro ao tentar executar.
Já o terceiro método também conseguirá o acesso, pois quando não definimos um modificador ao
método, o mesmo será considerado Public.
Agora vamos analisar a seguinte situação.
Nesse cenário, temo 3 métodos no módulo do lado esquerdo, o primeiro e o terceiro são Public e o
segundo é Private, porém o ultimo método chama os 2 primeiros. Como eles estão no mesmo escopo, o
os 3 métodos podem chama-los a sem nenhuma restrição.
No módulo do lado direito, temos um método que chama o método do outro escopo,
AcessandoOutrosMetodos, que é Public, portanto ele pode acessar sem restrição. Mas dentro desse
método, ele chama um método Private.
Nesse caso será que é possível o acesso ao método Private, já que está sendo chamado indiretamente
através de outro escopo?
Sim, é possível chamar o indiretamente um método Private de outro escopo, na verdade os métodos do
tipo Private, normalmente contém alguma regra específica que só pode ser chamada dentro do escopo
que ele foi construído, porém eles estão dentro de algum método Public, que o utiliza para algum
procedimento específico.
Um exemplo, em uma classe de conta bancária, tem uma variável que controla o Saldo. Essa variável
não pode ser acessada diretamente, pois seria uma falha de segurança. Imagina acessar por engado a
variável e alterar o valor do saldo para R$1.000.000,00. Essa variável será Private e será acessada
através de métodos Public como Depositar, Transferir, Sacar e dento desses métodos, após passar por
alguma validação, ela poderá ser alterada.
Seja exemplo abaixo:
Podemos ver que a variável saldo não poderá ser acessada diretamente por outro escopo, mas
indiretamente, através dos métodos Depositar e Sacar, poderá ser modificado, onde passará por uma
validação antes que possa alterar o valor.
Pag.: 64 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Caixas de Diálogo
Uma função é uma instrução que realiza um trabalho significativo (por exemplo, emitir uma informação
ao usuário, pedir uma informação ao usuário ou calcular uma equação) e dar resultado ao programa. O
valor retornado por uma função poderá ser atribuído a uma variável ou pode ser atribuído a uma
propriedade ou outra instrução ou função. As funções do VBA podem possuir um ou mais argumentos
para definir suas atividades. Se uma função utiliza mais de um argumento, os argumentos deverão
aparecer separados por vírgulas, e todo o grupo de argumentos entre parênteses.
As funções mais comuns do VBA são: MsgBox e InputBox. Mais adiante veremos outros tipos de
funções.
Função MsgBox
Exibe uma mensagem em uma caixa de diálogo, aguarda que o usuário clique em um botão e retorna
um Integer que indica qual botão o usuário clicou.
Opcional. Expressão numérica que é a soma de valores que especifica o número e o tipo de botões a exibir, o
buttons estilo de ícone a utilizar, a identidade do botão padrão e a modalidade da caixa de mensagem. Se omitido, o
valor padrão para buttons é 0.
title Opcional. Expressão de sequência de caracteres exibida na barra de título da caixa de diálogo. Se você omitir
title, o nome do aplicativo será inserido na barra de título.
Janela restrita de sistema; todos os aplicativos são suspensos até que o usuário
vbSystemModal 4096
responda à caixa de mensagem.
VbMsgBoxSetForeground 65536 Especifica a janela da caixa de mensagens como a janela de primeiro plano
Especifica que o texto deve aparecer como leitura da direita para a esquerda
vbMsgBoxRtlReading 1048576
em sistemas hebraico e árabe
O primeiro grupo de valores (0 a 5) descreve o número e o tipo de botões exibidos na caixa de diálogo; o
segundo grupo (16, 32, 48, 64) descreve o estilo de ícone; o terceiro grupo
(0, 256, 512) determina qual botão é o padrão e o quarto grupo (0, 4.096) determina a modalidade da
caixa de mensagem. Quando estiver somando números para criar um valor final para o argumento
buttons, utilize somente um número de cada grupo.
Pag.: 66 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Observação Essas constantes são especificadas pelo Visual Basic for Applications. Como resultado, os
nomes podem ser utilizados em qualquer lugar do seu código em vez dos valores reais.
Valores retornados
vbOK 1 OK
vbCancel 2 Cancelar
vbAbort 3 Abortar
vbRetry 4 Repetir
vbIgnore 5 Ignorar
vbYes 6 Sim
vbNo 7 Não
Comentários
Se a caixa de diálogo exibir um botão Cancelar, pressionar a tecla ESC terá o mesmo efeito que clicar em
Cancelar.
End If
MsgBox "Você clicou no botão: " & Texto
End Sub
Função InputBox
Exibe um aviso em uma caixa de diálogo, aguarda até que o usuário insira texto ou clique em um botão
e retorna uma String com o conteúdo da caixa de texto.
Parte Descrição
Pag.: 68 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Comentários
Se o usuário clicar em OK ou pressionar, a função InputBox retornará o que estiver na caixa de texto. Se
o usuário clicar em Cancelar, a função retornará uma sequência de caracteres de comprimento zero ("").
Sub ExemploImputBox()
Dim Message As String, Title As String, _
Default As String, MyValue As Byte
Método InputBox
Sintaxe:
expressão.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type)
Parte Descrição
String obrigatória. A mensagem a ser exibida na caixa de diálogo. Pode ser uma sequência,
Prompt um número, uma data ou um valor Boolean (o Microsoft Excel converte o valor
automaticamente para uma String antes de ele ser exibido).
Variant opcional. O título da caixa de entrada. Se esse argumento for omitido, o título padrão
Title
será "Entrada".
Variant opcional. Especifica um valor que aparecerá na caixa de texto quando a caixa de
Default diálogo for inicialmente exibida. Se esse argumento for omitido, a caixa de texto será
deixada vazia. Esse valor pode ser um objeto Range.
HelpFile Opcional Variant O nome do arquivo de ajuda para essa caixa de entrada.
Opcional Variant Especifica o tipo de dados retornado. Se esse argumento for omitido, a
Tipo
caixa de diálogo retornará texto.
0 Uma fórmula
Você pode usar a soma dos valores
1 Um número
permitidos para Type.
2 Texto (uma sequência)
Por exemplo, para uma caixa de
4 Um valor lógico (True ou False) entrada que possa aceitar tanto texto
como números, defina Type como 1 +
8 Uma referência a células, como um objeto Range
2.
16 Um valor de erro, como #N/D
Pag.: 70 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Comentários: Use InputBox para exibir uma caixa de diálogo simples para que você possa inserir
informações a serem usadas em uma macro. A caixa de diálogo tem um botão OK e um botão Cancelar.
Quando você escolhe o botão OK, InputBox retorna o valor inserido na caixa de diálogo. Quando você
clica no botão Cancelar, InputBox retorna False.
Quando Type é 0, InputBox retorna a fórmula na forma de texto, por exemplo, =2*PI()/360. Se houver
quaisquer referências na fórmula, elas serão retornadas como referências de estilo A1. (Use
ConvertFormula para fazer a conversão entre estilos de referências).
Quando Type é 8, InputBox retorna um objeto Range. Você precisa usar a instrução Set para atribuir o
resultado a um objeto Range, como mostrado no exemplo seguinte.
Set myRange = Application.InputBox(prompt:= "Exemplo", type:= 8)
OBS.: Se você não usar a instrução Set, a variável será definida com o valor no intervalo em vez do
próprio objeto Range.
Se você usar o método InputBox para pedir uma fórmula ao usuário, você terá que usar a propriedade
FormulaLocal para atribuir a fórmula a um objeto Range. A fórmula de entrada deverá estar no idioma
do usuário.
O método InputBox difere da função InputBox em permitir validação seletiva da entrada do usuário, e
em poder ser usada com objetos, valores de erro e fórmulas do Microsoft Excel. Observe que
Application.InputBox chama o método InputBox; InputBox sem qualificador de objeto chama a função
InputBox.
Este exemplo usa o argumento Type para assegurar que o valor retornado seja uma referência de célula
válida (um objeto Range).
Sub ExMetodoInputBox()
Dim Intervalo As Range
Worksheets("Plan1").Activate
Pag.: 72 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Worksheet
Charts
Shapes
ChartGroups
As linhas de código devem fazer referência ao objeto que será controlado, seguindo o caminho da
hierarquia do mais alto para o mais baixo.
Exemplo:
Carro.PortaEsquerda.Maçaneta.Puxar
Às vezes fica mais fácil ler o código da direita para a esquerda:
Pag.: 74 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Application.Workbooks("ExerciciosVBA") _
.Worksheets("Cadastro").Range("A2:A25").Select
para selecionar o intervalo A2:A25. porém, alguns objetos podem ser omitidos.
Por Exemplo, Application representa o próprio Excel. Estamos executando o código dentro do Excel.
Logo, podemos usar:
Workbooks("ExerciciosVBA") _
.Worksheets("Cadastro").Range("A2:A25").Select
Se o nome da pasta onde o código está sendo executado for ExerciciosVBA, podemos, também omitir
este trecho de código.
Worksheets("Cadastro").Range("A2:A25").Select
Seguindo o raciocínio anterior, se a macro for executada dentro da planilha Cadastro, podemos reduzir
o código à seguinte linha de código:
Range("A2:A25").Select
José está em uma sala (Sala A) e deseja utilizar o computador 2 (Comp2). Podermos dizer que:
Jose = Comp2
Agora vamos imaginar que José está fora da sala e deseja utilizar o computador 2
Jose = SalaA.Comp2
Jose = PredioX.SalaA.Comp2
Na representação acima, quando mais fora do objetivo José está, mais detalhes precisa passar. No caso
dos objetos será a mesma coisa, se deseja alterar um valor na própria planilha que está ativa, não será
necessário utilizar o objeto Worksheet para alterar um intervalo, apenas o objeto Range, agora se existir
mais que uma planilha, e o intervalo alterado não será da planilha ativa, nesse caso é necessário
especificar mais, Worksheets(1).Range(“A2”).Value.
Exemplos
WORKBOOKS
' Utilizando objeto Workbooks
Public Sub PlastaDeTrabalho()
' Workbooks (Objetos que gerencia todas as pastas de trabalho abertas)
' Até o momento o objeto foi criado mas não está pronto para uso pois
' não tem referência com nenhuma pasta de trabalho
' Para referenciá-lo utilizamos o instrutor SET
' Utilizamos o Workbooks com o nome dessa vez no lugar do índice.
' No caso a PlanilhaTeste.xlsx, é a mesma que está no índice 2
Set pasta = Workbooks("PlanilhaTeste.xlsx")
Pag.: 78 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
ThisWorkbook.Save
End Sub
O exemplo mostra diversas formas de utilizar objetos que representam a Pasta de Trabalho.
WORKSHEETS
' Utilizando objeto Worksheets
Public Sub Planilhas()
' Objeto Worksheets gerencia todas as planilhas da pasta de trabalho
' atual
' O índice é definido pela ordem das planilhas no arquivo,
' e não pela ordem em que foram criadas
Worksheets(2).Select
Worksheets(3).Select
Worksheets(1).Select
planilha.Select
RANGE
' Utilizando Objetos Range
Public Sub Intervalos()
' Objetos Range representam os intervalos de uma planilha
End Sub
Pag.: 80 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Programando
O gravador de macros é muito útil para a criação de macros. Porém, é limitado. Ou seja, se você precisar
inserir uma condição, uma caixa de mensagem, uma caixa de entrada, fazer um loop etc, terá que inserir
tais comandos manualmente, pois o gravador não é suficiente para criar tais comandos.
Além do que, ao gravar uma determinada macro, cria muitas linhas que podem ser suprimidas sem que
o código perca sua finalidade.
Veja um exemplo: a macro abaixo, gerada pelo gravador, seleciona o intervalo A1:D1 e aplica Negrito,
cor vermelha, tamanho 12 e padrão verde claro.
Sub Formatar()
Range("A1:D1").Select
Selection.Font.ColorIndex = 3
Selection.Font.Bold = True
With Selection.Interior
.ColorIndex = 35
.Pattern = xlSolid
End With
With Selection.Font
.Name = "Arial"
.FontStyle = "Negrito"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 3
End With
End Sub
Refinando o código, a macro acima, que contem 21 linhas, será reduzida para o código abaixo que
contem 9 linhas.
Sub Formatar1()
Range("A1:D1").Select
Selection.Interior.ColorIndex = 35
With Selection.Font
.FontStyle = "Negrito"
.Size = 12
.ColorIndex = 3
End With
End Sub
Na dúvida, em saber quais linhas poderão ser removidas. Proceda da seguinte forma: usando o
apóstrofo (aspas simples), comente as linhas que você acha que sejam desnecessárias e reexecute o
código. Se algo não der certo, é porque você comentou uma linha importante para o código. Retire o
apóstrofo e comente outra(s) linha(s).
DICA: comente apenas uma linha por vez, assim fica mais fácil identificar onde ocorreu o erro.
Escrevendo códigos
Para exibir a janela do VBA, pressione o atalho ALT+F11. Será exibida a seguinte janela:
Observe que o Excel abre a janela do VBA sem nenhum módulo ativo. Você pode inserir um novo
módulo de três formas:
Note, na figura abaixo, o novo módulo que foi inserido dentro da pasta módulos.
Pag.: 82 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Se desejar, você poderá alterar o nome de Módulo1. Para isto, na janela propriedades, altere a
propriedade Name para o nome desejado, lembrando de utilizar boas práticas.
DICA: Habitue-se a digitar as linhas de código em minúsculo. Assim, quando o cursor mudar de linha,
algumas letras das palavras chave ficarão maiúscula. Caso isto não ocorra, provavelmente existe algum
erro de sintaxe.
Pressione F5 para executar a macro e veja na planilha, que a célula C2 foi selecionada.
Digamos que, nesta célula, você queira inserir o seu primeiro nome. Neste caso, proceda da seguinte
forma:
Range("C5").Select
Selection.Value = "SeuPrimeiroNome"
Se você usar:
ActiveCell.Value = "SeuPrimeiroNome"
Obterá o mesmo efeito. Pois, Selection e ActiveCell, referem-se à mesma célula. Ou seja, a célula que
contém o foco. Apenas se tiver somente uma célula selecionada, se houvem várias células selecionadas,
todas serão alteradas com o SeuPrimeiroNome
Pag.: 84 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Estruturas
O VBA disponibiliza algumas estruturas que pode utilizar para controlar o decurso da execução da
rotina. Estas estruturas dão ao programador um poder enorme para construir rotinas bastante
complexas e flexíveis.
Estrutura Descrição
Decisão
While - Wend Executa uma determinada tarefa enquanto uma determinada condição
Repetição
For – Each – Next Realiza uma determinada tarefa repetitiva em cada objeto de uma coleção
ou em cada item de uma matriz.
Operadores
Antes de prosseguir no estudo das estruturas, vamos conhecer alguns operadores amplamente
utilizados nas estruturas de decisão operadores Lógicos e Relacionais.
Operadores relacionais
Operador Descrição
Ao ser utilizada uma instrução do tipo If...Then, esta < Menor que
implica na utilização de condições para verificar o estado
<= Menor ou igual a
de uma determinada variável quanto verdadeiro ou falso.
Ou seja, uma condição pode ser verificada como: > Maior que
diferente de; igual a etc. Estas verificações são efetuadas
>= Maior ou igual a
com a utilização de operadores Relacionais, conforme
tabela a seguir: = Igual a
<> Diferente de
Quando o VBA compara duas expressões, ele retorna um de dois valores possíveis, True ou False.
Operadores Lógicos
Pode ser que você necessite, em algum momento, trabalhar com o relacionamento de duas ou mais
condições ao mesmo tempo na mesma instrução If, efetuando desta forma testes múltiplos. Para estes
casos é necessário trabalhar com a utilização dos operadores lógicos, também conhecidos como
operadores booleanos. Veja tabela abaixo:
Operador Função
And Combina duas expressões. Cada expressão deverá ser verdadeira para que toda a
expressão seja verdadeira.
Or Combina duas expressões. Se uma expressão for verdadeira, a expressão toda será
verdadeira.
Not O inverso de uma única expressão.
Eqv Combina duas expressões. Ambas as expressões devem ser verdadeiras ou ambas as
expressões devem ser falsas, para toda a expressão ser verdadeira.
Imp Combina duas expressões. A expressão toda é verdadeira exceto quando a primeira
expressão for verdadeira e a segunda expressão for falsa.
Pag.: 86 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Estruturas de Decisão
Estruturas de Decisão permitem escrever códigos para responder a diferentes situações dependendo do
resultado do teste de uma condição. A condição pode ser uma comparação ou qualquer expressão que
avalie um valor numérico.
A estrutura IF...Then avalia se uma condição é verdadeira ou falsa e direciona o fluxo do programa de
acordo com o resultado. Esta estrutura pode usar a sintaxe de uma única linha ou múltiplas linhas.
1. Única linha:
If condição Then instrução IF Nota < 5 Then Escreva “Reprovado”
2. Múltiplas linhas:
If condição Then IF Nota < 5 Then
End If End If
Note que a versão de uma linha não requer a instrução End If. A versão de múltiplas linhas pode
executar uma ou várias instruções. Em ambos os casos, o princípio essencial envolvido é: “Se condição é
verdadeira então faça...”.
Observação Com a forma de uma linha, é possível ter múltiplas instruções executadas como resultado
de uma decisão If...Then. Todas as instruções devem estar na mesma linha e separadas por dois-pontos,
como na seguinte instrução:
If A > 10 Then A = A + 1 : B = B + A : C = C + B
Uma instrução If em forma de bloco deve ser a primeira em uma linha. As partes Else, ElseIf e End If da
instrução podem ter somente um número de linha ou rótulo de linha precedendo-as. O bloco If deve ser
encerrado com uma instrução End If.
If A > 10 Then
A = A + 1
B = B + A
C = C + B
End If
O exemplo abaixo verifica se a temperatura digitada é maior que 37. Se sim, emite a mensagem: “Você
está com febre” senão, não faz nada.
Sub termometro()
Dim Temp As Integer
Temp = InputBox("Digite uma temperatura", "Termômetro")
If Temp > 37 Then MsgBox "Você está com febre"
End Sub
Na descisão simples não é necessário informar uma instrução caso a condição seja falsa
Um bloco If...Then...Else permite definir dois blocos de código e tem a execução do programa baseada
no resultado de uma condição.
If condição Then
[instruções1]
[Else]
[instruções2]]
End If
No exemplo abaixo, o código testa se uma senha de usuário é valida comparando-a com a senha
correta. Se a senha for válida, o usuário terá acesso permitido. Se a senha for falsa, o usuário verá uma
mensagem indicando que a senha é inválida.
Public Sub ClassificarIdade()
Pag.: 88 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
End Sub
End Function
End Function
Dessa forma, quando for realizar os testes iremos depara com alguns erros. Primeiro se informarmos um
“M” maiúsculo, ele irá retornar “Feminino”, pois na verificação de texto, o VB é Case Sensitive, ou seja,
faz diferença entre maiúsculas e minúscula. Outra coisa é que, qualquer outro valor que informarmos,
retornará Feminino, e não somente o “F”.
End Function
Agora vimos que primeiro será analisado se o valor informado é um “M”, caso seja verdadeiro retorna
“Masculino” senão será analisado se o valor é um “F”, caso seja verdadeiro retorna “Feminino”, senão
retorna “Inválido”.
Para resolver o problema entre Maiúscula e Minúscula, utilizamos o método UCase que transforma o
valor da variável em Maiúscula e compara com o “M” ou o “F” também Maiúscula.
Iremos receber um salário e iremos retornar a alíquota do Imposto de Renda. Vamos utilizar a tabela
abaixo:
Até 1.903,98 0
Pag.: 90 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
End Function
If...Then...ElseIf
Este comando é como o anterior, exceto que ele permite que seu programa escolha mais de duas
alternativas.
If condição1 Then
[instruções1]
End If
End Function
Vemos que no próprio Else, tem uma condicional utilizando ElseIf o que torna a estrutura única e não
aninhada, com um único End If.
Pag.: 92 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Desafio 4
Mais de 65 Idoso
2. Desenvolver uma UDF que leia valores de três células, representando os lados de um triângulo.
Verificar se os lados formam realmente um triângulo, e se for esta condição verdadeira, deverá
ser indicado qual tipo de triângulo foi formado: isósceles, escaleno ou equilátero.
Sintaxe
Select Case testexpression
[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]
End Select
Comentários
A cláusula Case Else é usada para indicar as elsestatements a serem executadas se não for encontrada
coincidência entre testexpression e uma expressionlist em qualquer das outras seleções Case. Embora
não seja necessário, é uma boa ideia ter uma instrução Case Else no seu bloco Select Case para tratar
valores testexpression não previstos.
Usando como exemplo o cenário do cálculo de alíquota de Imposto de Renda, vamos analisar como
ficaria utilizando Select Case.
End Function
Na instrução select case, informamos a variável apenas no cabeçalho do bloco, e as sequências são
condições que, caso positivo executa a instrução.
A seguir vamos imaginar o seguinte cenário. Iremos receber uma idade e classificar conforme tabela
abaixo:
Idade Classe
6, 8 e 10 anos CLASSE B
7 e 9 anos CLASSE C
Pag.: 94 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
As demais CLASSE F
End Function
End Function
Sub Calcula_IMC()
Dim P As Single, Msg As String
Dim A As Single, IMC As Single
P = InputBox("Digite seu peso em Kg", "Peso")
A = InputBox("Digite sua altura em Metros", "Altura")
IMC = P / A ^ 2
Select Case IMC
Case 0 To 16.99
Msg = "Muito abaixo do peso"
Case 17 To 18.49
Msg = "Abaixo do peso"
Case 18.5 To 24.99
Msg = "Peso normal"
Case 25 To 29.99
Msg = "Acima do peso"
Case 30 To 34.99
Msg = "Obesidade I"
Case 35 To 39.99
Msg = "Obesidade II (Severa)"
Case Is >= 40
Msg = "Obesidade III (Mórbida)"
End Select
MsgBox Msg
End Sub
Pag.: 96 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Exercícios
1. Crie uma função para classificar as médias finais dos alunos seguindo a seguinte tabela:
0 a 4,9 5 A 5,9 6 A 6,9 7 A 7,9 8 A 8,9 9 A 10
F E D C B A
2. Crie um código, que identifique qual botão foi clicado em uma MsgBox. A MsgBox deverá
apresentar os seguintes botões: Anula, Repetir e Ignorar.
Sub Diálogos()
Dim R As Long
R = MsgBox("Clique em um botão", vbAbortRetryIgnore, "Select Case")
Select Case R
Case vbAbort
MsgBox "Você clicou em Anular", vbInformation, "Informação"
Case vbRetry
MsgBox "Você clicou em Repetir", vbInformation, "Informação"
Case vbIgnore
MsgBox "Você clicou em Ignorar", vbInformation, "Informação"
End Select
End Sub
Estruturas de Repetição
As estruturas de Repetição permitem que se possa executar determinados trechos do código um
determinado número de vezes.
Sintaxe:
For contador = início To fim [Step passo]
[instruções]
[Exit For]
[instruções]
Next [contador]
Obrigatória. Variável numérica usada como um contador de loops. A variável não pode
Contador
ser um Boolean ou um elemento da matriz.
Opcional. A quantidade em que Contador é alterado sempre que passa pelo loop. Se Step
Passo
não for especificado, o padrão será um.
Opcional. Uma ou mais instruções entre For e Next que são executadas conforme o
Instruções
número de vezes especificado.
Pag.: 98 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Comentários
O argumento Step pode ser positivo ou negativo. O valor do argumento Step determina o
processamento do loop como a seguir:
Valor do Passo O loop é executado se
Depois que todas as instruções do loop foram executadas, Passo é adicionado a Contador. Neste ponto,
as instruções do loop são executadas novamente (baseadas no mesmo teste que causou a execução
inicial do loop) ou o loop sai e a execução continua com a instrução seguinte à instrução Next.
Dica A alteração do valor de Contador enquanto dentro de um loop pode dificultar a leitura e
depuração do código.
Qualquer número de instruções Exit For pode ser posicionado em qualquer lugar do loop como meio
alternativo de sair. Muitas vezes, Exit For é usada depois da avaliação de alguma condição, por exemplo,
If...Then, e transfere o controle para a instrução imediatamente seguinte a Next.
Você pode aninhar loops For...Next posicionando um dentro do outro. Dê um nome de variável
exclusivo como seu Contador a cada loop. A construção a seguir é correta:
For i = 1 To 10
For j = 1 To 10
For k = 1 To 10
...
Next k
Next j
Next i
Observação Se você omitir Contador em uma instrução Next, a execução continua como se Contador
estivesse incluído. Se uma instrução Next for encontrada antes de sua instrução For correspondente,
ocorrerá um erro.
Este exemplo usa a instrução For...Next será exibido uma mensagem com o valor do contador por 10
vezes.
Public Sub ExmploForNext1()
Dim cont As Integer
Resultados
...
Nesse exemplo, identico ao anterior, removemo a instrução Step e a variável cont que vinha após a
instrução Next, pois como iremos incrementar de 1 em 1, não é necessário o Step pois esse é o valor
padrão dele, e também não é necessário informar a variável após o Next pois a estrutura já sabe qual
variável irá incrementar.
Cuidado: Tenha a certeza de estar definindo corretamente os itens: Início, Fim e Passo. Caso contrário,
você gerará um Ciclo Infinito, ou seja, seu código nunca terminará.
Sintaxe
While condition
[statements]
Wend
Parte Descrição
condition Obrigatória. Expressão numérica ou expressão de sequência que avalia como True ou
False. Se condition for Null, ela será tratada como False.
statements Opcional. Uma ou mais instruções executadas enquanto a condição for True.
Comentários
Se condition for True, todas as statements serão executadas até que a instrução Wend seja encontrada.
Então o controle retorna para a instrução While e condition é novamente verificada. Se condition ainda
for True, o processo é repetido. Se não for True, a execução continua com a instrução seguinte à
instrução Wend.
Os loops While...Wend podem ser aninhados a qualquer nível. Cada Wend corresponde ao mais recente
While.
Vamos utilizar o mesmo exemplo da estrutura For para instrução While...Wend para incrementar uma
variável do contador. As instruções no loop são executadas desde que a condição avalie como True.
Como vimos no exemplo acima, antes de entrar na estrutura da instrução While, precisamos adicionar
um valor para a variável, pois no bloco, diferente da instrução For, não é possível iniciar um valor para
ela.
Outra coisa importante é que a instrução também não tem um incremento da variável na estrutura,
igual a instrução Step da instrução For, por isso é necessário adicionar um incremento da variável no
statements para que a variável entre na condition com um valor diferente e não entre em um loop
infinito.
DO
A instrução While já está obsoleta, mas ainda mantém por compatibilidade de aplicações mais antigas,
no lugar temos as instruções “DO” que contém 4 sintaxes de instruções para utilizarmos
Podemos ver que nesse exemplo, a condição muda, enquanto na While a condição será “cont <= 5”, ou
seja, enquanto o contador for menor ou igual a 5, na instrução Until a condição será “cont > 5”, até que
o contador seja maior que 5.
Do
MsgBox "Contador = " & cont
End Sub
Esse exemplo vemos que o statement será executado pelo menos uma vez, pois mesmo que o contador
iniciasse com o valor 10, ele só iria analisar a condição no final do bloco.
Do
MsgBox "Contador = " & cont
End Sub
Vejamos um exemplo de utilização do Do While ... Loop e do Do ... Loop While, para vermos quando
seria mais vantagem utilizar um ou outro.
Do
nome = InputBox("Adivinhe o nome", 0, "Nome")
Loop While UCase(nome) <> "MARIA"
Vemos que no primeiro exemplo, será incrementado um valor a variável nome antes de entrar no bloco
para que ele já consiga uma avaliação na primeira condição, e depois essa mesma instrução será
repetida dentro do bloco.
Já no segundo exemplo não será necessário incrementar um valor para a variável nome antes do bloco,
pois a avaliação da condição será somente no final do bloco.
Resumindo
Qando utilizo cada uma das instruções? No poderemos utilizar qualquer uma das instruções, mas
quando a condição é numérica, a melhor instrução seria a For ... Next, pois sua sintaxe já permite iniciar
um valor para a variável e incrementar a variável, nas demais inscruções será necessário iniciar a
variável antes e será necessário um incremento da variável que será utilizada na condição.
Já quema a condição não é relacionado a número, como os exemplos acima que utiliza uma variável
nome, não tem como utilizar a instrução For ... Next, e como a instrução While ... Wend já está
obsoleta, podemos utilizar qualquer instrução Do, sendo que, se for necessário passar pelo menos uma
vez dentro do statement, utilizamos o Do ... Loop While ou Until, senão utilizamos Do While ou Until ...
Loop.
A instrução For Each ... Next, é diferente das demais instruções pois trabalha com loop utilizando
alguma coleção, vamos ver a figura abaixo.
Na imagem acima temos uma coleção de Personagens, um Ator e um Teatro. A Coleção deve ser algo
que o ator possa interpretar, nesse caso são personalidade e profissões de pessoas e o ator é uma
pessoa, por isso é possível interpretar, se a coleção fossem lugare, por exemplo, não seria possível o
ator interpretar, por exemplo o ator não tem como interpretar, São Paulo, pois é um lugar. O Teatro
seria o local onde o ator irá interpretar.
Passando isso para a instrução For Each, a coleção de Personagens, seriam a coleção que iria percorrer
no loop, o ator, o elemento que irá receber todas as características de cada um dos itens da coleção, e o
teatro o local onde será executado (Statements).
Sintaxe
For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
A sintaxe da instrução For ... Each ... Next possui as seguintes partes:
Parte Descrição
Element Obrigatória. Variável usada para iterar através dos elementos da coleção ou matriz.
Para coleções, element pode ser somente uma variável Variant, uma variável de objeto
genérica ou qualquer variável de objeto específica. Para matrizes, element somente
pode ser uma variável Variant.
Group Obrigatória. Nome de uma coleção ou matriz de objetos (exceto uma matriz de tipos
definidos pelo usuário).
Statements Opcional. Uma ou mais instruções que são executadas em cada item de group.
Observação Você não pode usar a instrução For ... Each ... Next com uma matriz de tipos definidos
pelo usuário porque uma Variant não pode conter um tipo definido pelo usuário.
Este exemplo usa a instrução For Each...Next vamos alterar o nome das planilhas de uma pasta de
trabalho.
Segue método.
End Sub
No exemplo acima, foi criado uma variável do tipo Worksheet, pois eles irá receber itens da coleção
Worksheets. Foi criado uma variável “mes” apenas para utilização do exemplo, ela não tem impacto na
instrução For Each em si.
Vimos que não é necessário informar o final do loop, pois essa instrução já sabe que deve percorrer
todos os itens da coleção, não importa quantos tenham.
O exemplo abaixo, oculta todas as planilhas O exemplo abaixo, reexibe todas as planilhas
exceto a de nome Maio. ocultas.
Sub OcultarPlanilhas() Sub ReexibirPlanilhas()
Dim P As Worksheet Dim P As Worksheet
For Each P In Worksheets For Each P In Worksheets
If P.Name <> "Maio" Then P.Visible = xlSheetVisible
P.Visible = xlSheetHidden Next
End If End Sub
Next
End Sub
O exemplo abaixo protege todas as planilhas da O exemplo abaixo desprotege todas as planilhas
pasta com a senha: 123. protegidas anteriormente.
Sub ProtegerPlanilhas() Sub DesprotegerPlanilhas()
Dim P As Worksheet Dim P As Worksheet
For Each P In Worksheets For Each P In Worksheets
P.Protect "123" P.Unprotect "123"
Next Next
End Sub End Sub
MeuContSe = cont
End Function
Para testar vamos criar uma tabela com alguns nomes e chamar nossa função passando algum dos
nomes com parâmetro, igual ao exemplo abaixo.
Variáveis Indexadas
A indexação de uma matriz a partir de 0 ou 1 depende da definição da instrução Option Base. Se Option
Base 1 não for especificada, todos os índices de matriz iniciarão em zero.
OBS.: O uso da instrução Option Base em seus projetos pode acarretar problemas de portabilidade.
Pois, na maioria das linguagens, o índice inicia-se em 0 (zero). Porém utilizando no Excel, é
recomendado utilizar Option Base 1, pois as matrizes das funções do Excel inical com 1
Suponha que você use uma variável denominada salário para armazenar um valor do salário de um
funcionário.
Salário = 8350
E se você quisesse armazenar 25 salários, um para cada funcionário? Você poderia declarar 25 variáveis:
salario1, salario2, até salário25, ou poderia declarar um array com 25 elementos.
Dim Salário(25) As Currency
Na linha de código a seguir, uma matriz de tamanho fixo é declarada como uma matriz String com 5
colunas. Este tipo de matriz é, comumente chamado de Vetor.
Dim Nome(4) As String
Observe que, embora a declaração tenha sido Nome(4), foram declarados 5 nomes, onde o primeiro
possui índice 0 e o último possui índice 4. Ou seja, (0, 1, 2, 3, 4).
Exemplos:
MsgBox Nome(3) ‘exibe o nome cujo índice é o número 3, ou seja: Daniele.
End Sub
For i = 1 To 5
nome(i) = InputBox("Informe o " & i & "o nome")
Next
End Sub
Agora vimos a verdadeira utilidade de variáveis de Matriz (Array), pois diverente das variáveis escalares,
nos podemos utilizar a mesma variável em uma estrutura de repetição e armazenar vários valores.
Nesse exemplo acima utilizamos uma condição FOR ... NEXT para receber os valores da variável, ao
invés de criarmos 5 linhas de código, 1 para cada variável, criamos 3 linhas contando com a condição
For. Se necessitarmos de mais armezamento, não precisamos adicionar mais nenhuma linha de código,
apenas alterar o tamanho da Matriz e o índice final da condição For.
For i = 1 To 5
nome(i) = InputBox("Informe o " & i & "o nome")
Next
For i = 1 To 5
Range("A" & i) = nome(i)
Next
End Sub
Nesse exemplo, além do loop para alimentar a variável Matriz, também utilizamos outro loop para
enviar da Matriz para uma planilha.
Matriz
Declarando uma matriz fixa Multidimensional
Na linha de código a seguir, uma matriz de tamanho fixo é declarada como uma matriz Integer com 10
linhas e 10 colunas:
Dim Matriz1(Linhas, Colunas) As Tipo
Como ocorre com qualquer outra declaração de variável, a menos que você especifique um tipo de
dados para a matriz, o tipo de dados dos elementos em uma matriz declarada é Variant. Cada elemento
numérico Variant da matriz utiliza 16 bytes. Cada elemento Variant de sequência de caracteres utiliza
22 bytes. Para criar código o mais compacto possível, declare explicitamente as suas matrizes como um
tipo de dados diferente de Variant.
Exemplos:
MsgBox MeuArray(6, 0) ‘Exibe o número 973.
' Matriz de dupla precisão utiliza 100 * 100 * 8 bytes (80.000 bytes).
ReDim MyDoubleArray (99, 99) As Double
' Matriz Variant utiliza pelo menos 160.000 bytes (100 * 100 * 16 bytes).
Dim MyVariantArray (99, 99)
O tamanho máximo de uma matriz varia com base no seu sistema operacional e na quantidade de
memória disponível. A utilização de uma matriz que exceda a quantidade de RAM disponível no seu
sistema é mais lenta porque os dados devem ser lidos e gravados no disco.
Ao declarar uma matriz dinâmica, você pode dimensionar a matriz durante a execução do código. Utilize
uma instrução Static, Dim, Private ou Public para declarar uma matriz, deixando vazios os parênteses,
como mostra o exemplo a seguir.
Dim sngArray() As Single
Observação Você pode utilizar a instrução ReDim para declarar uma matriz implicitamente dentro de
um procedimento. Tome cuidado para não digitar errado o nome da matriz quando utilizar a instrução
ReDim. Mesmo que haja uma instrução Option Explicit incluída no módulo, será criada uma segunda
matriz.
Em um procedimento dentro do escopo da matriz, utilize a instrução ReDim para alterar o número de
dimensões, definir o número de elementos e definir os limites superior e inferior de cada dimensão.
Você pode utilizar a instrução ReDim para alterar a matriz dinâmica com a frequência necessária. No
entanto, todas as vezes que você tomar essa providência, os valores existentes na matriz serão
perdidos. Utilize ReDim Preserve para expandir uma matriz enquanto preserva os valores existentes na
matriz. Por exemplo, a instrução a seguir acrescenta 10 elementos à matriz varArray sem perder os
valores atuais dos elementos originais.
ReDim Preserve varArray(UBound(varArray) + 10)
For lin = 1 To 10
For col = 1 To 10
operacao = lin & "x" & col & "=" ' ex. 3x5=
resultado = lin * col ' ex. 15
tabuada(lin, col) = operacao & resultado ' ex. 3x5=15
Next
Next
For lin = 1 To 10
For col = 1 To 10
Cells(lin, col) = tabuada(lin, col)
' No comando acima, a tabuada será criada na horizontal
' para inverter para vertival, utilizamos conforme abaixo
' Cells(col, lin) = tabuada(lin, col)
Next
Next
End Sub
Observação Quando utilizar a palavra-chave Preserve com uma matriz dinâmica, você pode alterar
somente o limite superior da última dimensão, mas não pode alterar o número de dimensões.
Resumo
Vetor (array uni-dimensional) é uma variável que armazena várias variáveis do mesmo tipo.
Matriz (array multi-dimensional) é um vetor de vetores. Nele temos linhas e coluna, sendo que primeiro
informamos a linha e depois a coluna.
Funções
O VBA disponibiliza diversas funções para uso em seus códigos. Elas estão distribuídas em categorias,
tais como:
• Cálculos matemáticos
• Conversão
• Datas e horas
• Diretórios e arquivos
• Entrada e saída
• Erros
• Finanças
• Manipulação de sequência de caracteres
• Matrizes
• Miscelânea
• Operadores
Funções matemáticas
Função Descrição
Funções Financeiras
As funções desta categoria são utilizadas para cálculos financeiros.
fv: é o valor futuro. Se você aplicar R$ 250,00 por mês e resgatar R$ R$ 3.000,00 no final do
investimento, o valor futuro será 3000.
pv: é o valor presente. Quando você aplicar R$ 250,00 e resgatar 500, 250 é o valor atual.
Retorna o valor futuro de uma anuidade com base em depósitos fixos periódicos e uma taxa de juros
FV
fixa. FV(rate, nper, -pmt[, -pv][, tipo])
Retorna o número de períodos para uma anuidade com base em pagamentos fixos e periódicos e uma
NPer
taxa de juros fixa. Nper(rate, -pmt, pv[, fv][, tipo])
Retorna o quanto deve ser pago a cada período com base em pagamentos fixos, periódicos e uma taxa
Pmt
de juros fixa. Pmt(rate, nper, -pv[, fv][, tipo])
Retorna o valor atual de uma anuidade com base em pagamentos fixos periódicos a serem pagos no
PV
futuro e taxas de juros fixas. PV(rate, nper, -pmt [, fv][, tipo)
Retorna a taxa de juros por período. Quando você financiar um veículo a uma taxa de 1,5% ao mês
Rate Rate(nper, -pmt, pv[, fv][, tipo][, guess])
Uma data é tratada pelo VBA como sendo um número inteiro, sendo a data 30/12/1899 representada
pelo número 0. Números menores que zero representam datas inferiores a 30/12/1899. Sendo assim, -1
representa a data de 29/12/1899 e assim regressivamente até a data de 01/01/100 (-657.434). As datas
posteriores a 30/12/1899 são representadas por números inteiros positivos, de 31/12/1899 (1) até a
maior data que é 31/12/9999 (2.958.465). Por ser um número inteiro, a diferença entre duas datas é
equivalente ao número de dias existentes entre as duas datas.
' Este exemplo mostra algumas datas entre os anos 100 e 3000.
Sub MostraDatas()
Dim J As Long
End Sub
00:00:00 0
As horas são representadas por números fracionários entre 0 e 1. Ou 01:00:00 0,041666667
seja, uma hora é representada por 1/24 avos do dia,
conforme tabela ao lado. 12:00:00 0,5
23:59:59 0,999988425
Função Descrição
Sintaxe: WeekDay(date[,firstdayofweek])
WeekDay
Se FirstDayOfWeek não for especificado o VBA assume 1 (Domingo).
End Function
dia = Weekday(data)
NomeDiaSemana = WeekdayName(dia)
End Function
mes = Month(data)
NomeDoMes = MonthName(mes)
End Function
End Function
Desafio 5
1º. Vamos criar um método que receba um tempo e retorne uma mensagem conforme tabela abaixo.
2º. Vamos criar um método que receba um tempo e retorne uma mensagem conforme tabela abaixo.
Em muitas situações, uma operação resulta em um valor String que precisa ser manipulado. O VBA traz
várias funções para trabalhar com sequências de caracteres. Veja as funções descritas abaixo:
Função StrConv
Retorna uma Variant (String) convertida conforme especificado.
Obrigatória. Integer. A soma dos valores que especificam o tipo de conversão a ser
executada.
conversion 1 vbUpperCase Converte para maiúsculos.
2 vbLowerCase Converte para minúsculos.
3 vbProperCase Primeira letra em maiúscula as demais minúsculas.
64 vbUnicode Converte a sequência em Unicode
LCID Opcional. (A LocaleID do sistema é o padrão.) Geralmente não é especificado.
Exemplo:
MsgBox StrConv("EDSON ARANTES", 3) ‘retorna: Edson Arantes
Função Lcase
Converte uma string para letras minúsculas.
Sintaxe: Lcase(string)
Exemplo:
Sub ConvParaMinúsculo()
Dim S As String
S = InputBox("Digite um texto qualquer", "Converte para minúsculas")
MsgBox LCase(S)
End Sub
Função Ucase
Converte uma string para letras maiúsculas.
Sintaxe: Ucase(string)
Exemplo:
Sub ConvParaMaiúsculo()
Dim S As String
S = InputBox("Digite um texto qualquer", "Converte para maiúsculas")
MsgBox UCase(S)
End Sub
Função Len
Retorna a quantidade de caracteres de uma string.
Sintaxe: Len(expressão)
Exemplo:
Sub ContaCaracteres()
Dim S As String
S = InputBox("Digite um texto qualquer", "Conta caracteres")
MsgBox Len(S)
End Sub
Função InStr
Retorna a posição da primeira ocorrência de uma sequência de caracteres dentro de outra.
Opcional. Expressão numérica que define a posição inicial de cada pesquisa. Se omitido, a
start pesquisa iniciará na posição do primeiro caractere. Se start contiver Null, ocorrerá um
erro. O argumento start será necessário, se compare for especificado.
Definições
Se A InStr retornará
string2 for encontrado dentro de string1 A posição em que a correspondência foi encontrada
Exemplo:
Sub PesquisaString()
Dim s1 As String, s2 As String
Função InStrRev
Descrição
Retorna a posição de uma ocorrência de uma sequência de caracteres dentro de outra, a partir do final
da sequência de caracteres.
Parte Descrição
start Opcional. A expressão numérica que define a posição inicial para cada pesquisa. Se for
omitida, –1 será usado, o que significa que a pesquisa começará na posição do último
caractere. Se start contiver Null, ocorrerá um erro.
compare Opcional. O valor numérico que indica o tipo de comparação a ser usado ao avaliar
subsequências de caracteres. Se for omitido, uma comparação binária será efetuada.
Consulte a seção Configurações para obter os valores.
Definições
Valores retornados
Comentários:
Observe que a sintaxe da função InstrRev não é igual à sintaxe da função Instr.
Exemplo:
Sub PesquisaString()
Dim s1 As String, s2 As String
Função Left
Retorna caracteres à esquerda de uma string.
Exemplos:
' Extrai 10 caracteres à esquerda de um texto.
Sub Esquerda()
Dim s As String
Função Right
Retorna caracteres à direita de uma string.
Exemplos:
' Retorna 12 caracteres à direita de um texto.
Sub Direita()
Dim S As String
Função StrReverse
Retorna uma string em ordem inversa.
Sintaxe: StrReverse(string)
Curiosidade: Esta função “pode” determinar se uma palavra ou frase é um palíndromo, ou seja, a
palavra ou frase pode ser lida da esquerda para a direita ou da direita para a
esquerda. Pois, em qualquer direção, possui o mesmo significado.
Tais como: osso, asa, “o galo nada no lago”, “ame o poema”, “anotaram a data da
maratona”, arara, radar, rever etc.
Exemplo:
Sub MostraStrReverse()
Dim s As String
MsgBox StrReverse(s)
End Sub
Função Mid
Retorna uma string com um número determinado de caracteres, da esquerda para a direita, a partir de
uma determinada posição.
Onde:
Exemplos:
Sub DemoMid()
Dim s As String
End Sub
Sintaxe: Trim(string)
Ltrim(string)
Rtrim(string)
Exemplos:
Sub LTrimRTrimTrim()
Dim s As String
End Sub
X = Trim(T)
J = 0
For L = 1 To Len(X)
If Mid(X, L, 1) = " " Then
Pag.: 130 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
J = J + 1
If J <= 1 Then Y = Y & Mid(X, L, 1)
Else
Y = Y & Mid(X, L, 1)
J = 0
End If
Next L
AllTrim = Y
End Function
Função String
Retorna uma string que contém uma seqüência de caracteres repetida com o comprimento
especificado.
Exemplo:
Sub FunçãoString()
MsgBox String(5, ".") ' Retorna ".....".
MsgBox String(5, 42) ' Retorna "*****".
MsgBox String(10, "ABC") ' Retorna "AAAAAAAAAA".
End Sub
Função Space
Retorna uma quantidade especificada de espaços.
Sintaxe: Space(number)
Exemplo:
Sub FunçãoSpace()
MsgBox "|" & Space(25) & "|"
End Sub
Função Asc
Retorna um Número inteiro que representa o código de caractere correspondente à primeira letra de
uma sequência.
Sintaxe: Asc(string)
Exemplo:
Sub funçãoAsc()
MsgBox Asc("A") ' Retorna 65.
MsgBox Asc("a") ' Retorna 97.
MsgBox Asc("Amora") ' Retorna 65.
End Sub
Função Chr
Retorna uma sequência de caracteres que contém o caractere associado ao código de caractere
especificado.
Sintaxe: Chr(charcode)
Exemplo:
Sub FunçãoChr()
MsgBox Chr(65) ' Retorna A.
MsgBox Chr(97) ' Retorna a.
MsgBox Chr(62) ' Retorna >.
MsgBox Chr(37) ' Retorna %.
End Sub
End Function
End Function
Funções de conversão
As funções de conversão são usadas para converter uma expressão em um tipo de dados específico.
A = 5: B = 5 MyDouble = 125.5678
MyShortTime = CDate(Tm)
Int1 = 4534
Valor de
Sintaxe Intervalo de expression
retorno
Um tipo de dados com apenas dois valores possíveis, True (-1) ou False (0). As variáveis Boolean são
armazenadas como números de 16 bits (de 2 bytes).
As variáveis Byte são armazenadas como números de 8 bits simples (1 byte) e sem sinal.
Utilize este tipo de dados para cálculos que envolvam moedas e para cálculos de ponto fixo em que a precisão
seja extremamente importante. O caractere de declaração é o sinal de arroba @.
Um tipo de dados utilizado para armazenar datas e horas como um número real. As variáveis de data são
armazenadas como números de 64 bits (8 bytes). O valor à esquerda do decimal representa uma data e o valor à
direita do decimal representa uma hora.
Um tipo de dados que contém números de ponto flutuante de precisão dupla como números de 64 bits. O
caractere de declaração é o sinal numérico #.
Um tipo de dados que contém números decimais na escala de potência de 10. Observe que o tipo de dados
Decimal só pode ser utilizado dentro de uma Variant. Você não pode declarar uma variável do tipo Decimal. No
entanto, você pode criar uma Variant com o subtipo Decimal usando a função CDec.
Um tipo de dados que contém variáveis de números inteiros armazenadas como números inteiros de 2 bytes. O
tipo de dados Integer também é utilizado para representar valores enumerados. O caractere de declaração é o
sinal de percentual %.
Um tipo de dados que armazena variáveis de ponto flutuante de precisão simples como números de ponto
flutuante de 32 bits (4 bytes). O caractere de declaração é o ponto de exclamação !.
Um tipo de dados que consiste em uma sequência de caracteres contíguos que representam os próprios
caracteres no lugar de seus valores numéricos. Uma String pode incluir letras, números, espaços e pontuação. O
tipo de dados String pode armazenar sequências de caracteres de comprimento fixo que variam em tamanho de
0 a aproximadamente 63 mil caracteres e sequências de caracteres dinâmicas que variam em comprimento de 0
a aproximadamente 2 bilhões de caracteres. O caractere de declaração é o cifrão $.
Um tipo de dados especial que pode conter dados numéricos, de sequência de caracteres ou de data, assim
como os tipos definidos pelo usuário e os valores especiais Empty e Null. O tipo de dados Variant possui um
tamanho de armazenamento numérico de 16 bytes e pode conter dados até o intervalo de um Decimal ou um
tamanho de armazenamento de caractere de 22 bytes (mais o comprimento da sequência de caracteres), e pode
armazenar qualquer texto de caractere. A função VarType define como os dados de uma Variant são tratados.
Todas as variáveis tornam-se tipos de dados Variant se não forem declaradas explicitamente como algum outro
tipo de dados.
Você pode usar a maioria das funções de planilha do Microsoft Excel em suas instruções de Visual Basic.
Para fazer uso de uma função de planilha é preciso especificar que a função pertence ao objeto
Application, de acordo com a seguinte sintaxe:
Application.WorksheetFunction.NomeDaFunção(argumentos)
Observação As funções do Visual Basic não usam o qualificador WorksheetFunction. Uma função pode
ter o mesmo nome que uma função do Microsoft Excel e ainda assim funcionar de maneira diferente.
Por exemplo, Application.WorksheetFunction.Log (decimal) e Log (natural) retornam valores
diferentes.
Exemplo:
Média = Application.WorksheetFunction.Average(Range("C2:C32"))
BahtText, BesselI, BesselJ, BesselK, BesselY, BetaDist, BetaInv, Bin2Dec, Bin2Hex, Bin2Oct,
B
BinomDist
Ceiling, ChiDist, ChiInv, ChiTest, Choose, Clean, Combin, Complex, Confidence, Convert, Correl, Cosh, Count,
C CountA, CountBlank, CountIf, CountIfs, CoupDayBs, CoupDays, CoupDaysNc, CoupNcd, CoupNum,
CoupPcd, Covar, CritBinom, CumIPmt, CumPrinc
DAverage, Days360, Db, DCount, DCountA, Ddb, Dec2Bin, Dec2Hex, Dec2Oct, Degrees, Delta, DevSq,
D DGet, Disc, DMax, DMin, Dollar, DollarDe, DollarFr, DProduct, DStDev, DStDevP, DSum, Duration, DVar,
DVarP
Fact, FactDouble, FDist, FInv, Finv, Fisher, FisherInv, Fixed, Floor, Forecast, Frequency, FTest, Fv,
F
FVSchedule
IfError, ImAbs, Imaginary, ImArgument, ImConjugate, ImCos, ImDiv, ImExp, ImLn, ImLog10, ImLog2,
I ImPower, ImProduct, ImReal, ImSin, ImSqrt, ImSub, ImSum, Index, Intercept, IntRate, Ipmt, Irr, IsErr,
IsError, IsEven, IsLogical, IsNA, IsNonText, IsNumber, IsOdd, Ispmt, IsText
K Kurt
M Match, Max, Mdeterm, MDuration, Median, Min, Minverse, Mirr, Mmult, Mode, MRound, MultiNomial
Pearson, Percentile, PercentRank, Permut, Phonetic, Pi, Pmt, Poisson, Power, Ppmt, Price, PriceDisc,
P
PriceMat, Prob, Product, Proper, Pv
Q Quartile, Quotient
R Radians, RandBetween, Rank, Rate, Received, Rept, Roman, Round, RoundDown, RoundUp, RSq, RTD
SeriesSum, Sinh, Skew, Sln, Slope, Small, SqrtPi, Standardize, StDev, StDevP, StEyx, Substitute, Subtotal,
S
Sum, SumIf, SumIfs, SumProduct, SumSq, SumX2MY2, SumX2PY2, SumXMY2, Syd
T Tanh, TBillEq, TBillPrice, TBillYield, TDist, Text, TInv, Transpose, Trend, Trim, TrimMean, TTest
X Xirr, Xnpv
Comecemos pelas Classes. Uma janela é muito diferente de um botão, mas os dois são objetos. Isso
acontece porque eles são definidos por Classes diferentes. Classes definem um objeto a grosso modo.
As Classes definem suas Propriedades, seus Métodos e seus Eventos. Podemos dizer que as Classes são
os moldes dos objetos.
Um botão pode ser diferente do outro (maior ou menor, com uma legenda diferente...). Mas como isso
é possível se eles pertencem à mesma classe? Porque suas propriedades são diferentes. As
Propriedades definem características mais específicas dos objetos. Um botão tem, por exemplo,
propriedades que determinam sua altura, sua largura e sua legenda.
Um Método é uma função, uma ação que age sobre um objeto. Por exemplo, se tivermos uma lista (tipo
as listas de tópicos no "procurar" da ajuda do Windows), adicionamos ou removemos itens através de
Métodos. Ou ainda, se quisermos mover um certo objeto pela tela, poderíamos usar um Método.
Por fim, o Evento. Digamos que em um certo programa, pressionamos um botão e um Beep é emitido.
Como o programa sabe quando apertamos o botão? Ele sabe por que quando um objeto da classe botão
é clicado, é gerado um Evento. E é a esse Evento que está associado o Código (comandos) que produzirá
o beep. Ocorrem também Eventos, por exemplo, ao modificarmos o texto de uma caixa de texto ou ao
mover o cursor do mouse sobre uma janela.
Só para ficar mais claro, um exemplo não muito nobre: digamos que haja uma classe "Galinha". Um
objeto Galinha poderia ter a propriedade "Idade", uma propriedade "CorDasPenas" e uma propriedade
"Nome". Ela teria um Método "PoeOvo" e um Método "Cacareja". E ela geraria Eventos ao dormir ao
acordar e ao ser ameaçada.
Add-Ins
Um Add-In do Excel é um arquivo (normalmente com a extensão .XLA) que o Excel pode carregar
quando ele for inicializado. O Add-In contem códigos que adicionam funcionalidades ao Excel. Ou seja,
disponibiliza novas funções, menus e ferramentas ao Excel.
Os Add-Ins são uma excelente forma de aumentar o potencial do Excel. Além do que, são a forma ideal
para a distribuição de funções customizadas. O Excel é disponibilizado com vários Add-Ins tais como:
Solver, Ferramentas de análise, Autosalvamento etc. A Microsoft também disponiliza Add-Ins
gratuitamente, por exemplo, o PowerPivot que aumenta, em muito, a capacidade de processamento
com centenas de milhões de linhas.
Um Add-In (Suplemento) é uma pasta de trabalho com comandos e funções customizadas que podem
ser usadas com o Excel.
Os Add-In são usados para a distribuição de macros, UDF’s (User Defined Function) "Função Definida
pelo Usuário" ou soluções customizadas para outros usuários.
Se o Add-In contiver códigos VBA que se refere à pasta de trabalho onde está o código em execução,
você deverá usar o objeto ThisWorkbook em vez de ActiveWorkbook. Um Add-In nunca será a
ActiveWorkbook.
O Excel 97 ou superior, pode abrir e editar os Add-Ins, assim não é necessário manter a cópia original da
pasta de trabalho que gerou o Add-In. A partir da versão 97 é possível proteger, com senha, o conteúdo
de um projeto VBA de uma pasta de trabalho. Assim, com esta proteção, o código ficará protegido
contra visualização e edição por outros usuários.
Os Add-Ins podem ser instalados abrindo normalmente o arquivo, assim como você abre qualquer pasta
de trabalho. Outra forma de instalar um Add-In é a seguinte: salve o Add-in na pasta Suplementos e
instale-o através do Gerenciador de Suplementos (Addin Manager) clicando no menu Ferramentas
(Tools) e escolhendo a opção Suplementos (Add-ins).
Quando você instala um Addin as funções, menus e barras de ferramentas contidas nele, ficam
disponíveis para uso em qualquer pasta de trabalho do Excel aberta na máquina onde o Add-in foi
instalado.
Vantagens do Add-In:
1. Os códigos sempre serão carregados e rodam em qualquer Pasta de trabalho.
2. Como não roda dentro do VBE não existe nenhum conflito com demais rotinas da planilha. Com isto
um dos maiores problemas do uso dos scripts é eliminado.
3. Usar Add-In é fácil e pratico principalmente para planilhas muito pesadas que utilizem macros e
scripts pois minimiza erros.
Desvantagens:
1. Não é possível ver o código via VBE
2. Caso uma planilha seja aberta em um outro computador que não tenha o Add-In a função não ira
funcionar. Para solucionar o problema instale o Add-In na outra máquina.
Comportamento de um Add-In
Um Add-In é um tipo especial de pasta de trabalho do Excel (XLAM). Um Add-In pode conter: planilhas,
gráficos, procedimentos Sub, Function e Class. Os códigos contidos em um Add-In adicionam comandos
opcionais e características ao Excel sem que o usuário possa visualizar ou editar.
Diferentemente de uma pasta de trabalho normal, um Add-In, quando aberto, não fica visível na tela e
você não poderá exibir o conteúdo, mesmo usando o comando reexibir da guia Exibição. Um Add-In é
exibido somente na janela do editor do Visual Basic.
Se o Add-In foi, previamente protegido com uma senha, você não poderá visualizar nem editar o seu
código.
Um Add-In pode conter o número UDF’s que você precisar, e você poderá adicionar outras funções mais
tarde. Basta abrir e editar o conteúdo do Add-In.
Inicie o Excel ou, se você já estiver com o Excel aberto, crie uma nova pasta de trabalho.
Abra o Editor do Visual Basic guia Desenvolvedor / Visual Basic (atalho Alt+F11).
Na janela do VBA, painel VBAProject, caso você tenha mais de uma pasta aberta, selecione o nome da
nova pasta de trabalho VBAProject (Pasta1).
No menu Inserir da janela do VBA ou na barra de ferramentas Padrão escolha Módulo. Isto irá adicionar
um novo modulo de código em branco na pasta de trabalho selecionada. Você também verá o nome do
modulo na janela do Project Explorer. Se você já estiver trabalhando com o Excel o nome talvez seja
diferente – verifique o nome na barra de titulo da janela do Excel caso você não tenha certeza. Se a
janela VBAProject não estiver visível, abra-a clicando no menu Exibir / Project Explorer (atalho Ctrl+R).
Na janela de código, do Project Explorer, clique com o botão direito do mouse sobre
VBAProject(Pasta1) ou no menu Ferramentas escolha a opção Propriedades do VBA Project.
Clicar em OK.
Primeiro obtemos o valor do primeiro Dígito Verificador, para isso deve-se multiplicar os 9 primeiros
dígitos pela sequência de 1 até 9, com esse resultado utilizamos o resto da divisão por 11.
Posição 1 2 3 4 5 6 7 8 9 10 11
CPF 4 6 2 7 1 7 5 3 0 2 7
Multiplicador 1 2 3 4 5 6 7 8 9
Resultado 4 12 6 28 5 42 35 24 0 2
Multiplicando cada dígito dos 9 primeiros números do CPF pelo multiplicador da sequência temos um
resultado que a soma é 156, com esse resultado dividimos por 11 e o resto da divisão é o primeiro dígito
verificador, 156 / 11 = 14 e o resto da divisão é 2.
Agora para conseguir o segundo Dígito Verificador, deverá ser multiplicado os 10 primeiros dígitos
porém agora iniciando a sequência de multiplicador com 0 (zero).
Posição 1 2 3 4 5 6 7 8 9 10 11
CPF 4 6 2 7 1 7 5 3 0 2 7
Multiplicador 0 1 2 3 4 5 6 7 8 9
Resultado 4 12 6 28 5 42 35 24 0 2 7
Multiplicando cada dígito dos 10 primeiros números do CPF pelo multiplicador da sequência temos um
resultado que a soma é 139, com esse resultado dividimos por 11 e o resto da divisão é o primeiro dígito
verificador, 139 / 11 = 12 e o resto da divisão é 7.
' Completa com zeros à esquerda caso não esteja com os 11 digitos
If Len(sCPF) < 11 Then
sCPF = String(11 - Len(sCPF), "0") & sCPF
End If
End If
End Function
Validando CPNJ
As regras para validar o CNPJ é parecida com a do CPF, porém os multiplicadores tem outros valores
Posição 1 2 3 4 5 6 7 8 9 10 11 12 13 14
CNPJ 1 8 9 1 5 0 8 3 0 0 0 1 0 4
Multiplicador 6 7 8 9 2 3 4 5 6 7 8 9
Resultado 6 56 72 9 10 0 32 15 0 0 0 9 0
Agora, com o primeiro Dígito Verificador, calculamos o segundo Dígito Verificador, com os
multiplicadores iniciando em 5 até 9 e 2 até 9, multiplicando agora os 13 primeiros números.
Posição 1 2 3 4 5 6 7 8 9 10 11 12 13 14
CNPJ 1 8 9 1 5 0 8 3 0 0 0 1 0 4
Multiplicador 5 6 7 8 9 2 3 4 5 6 7 8 9
Resultado 6 56 72 9 10 0 32 15 0 0 0 9 0 4
A soma dos resultado da multiplicação é 213, 213 / 11 = 19, o resto é 4. Obtendo assim o segundo Dígito
Verificador.
Dim d6 As Integer
Dim d7 As Integer
Dim d8 As Integer
Dim d9 As Integer
Dim d10 As Integer
Dim d11 As Integer
Dim d12 As Integer
Dim d13 As Integer
Dim d14 As Integer
Dim DV1 As Integer
Dim DV2 As Integer
Dim UltDig As Integer
' Completa com zeros à esquerda caso não esteja com os 14 digitos
If Len(sCNPJ) < 14 Then
sCNPJ = String(14 - Len(sCNPJ), "0") & sCNPJ
End If
Criando um Add-In
Na janela do Excel, ative a guia Desenvolvedor e clique no botão Macros (atalho Alt+F8).
Será aberta a caixa de diálogo Inserir função. Nela, selecione a categoria Definida pelo usuário. Note
que, na lista Nome da função, aparecerá o nome da UDF ValidarCPF. Selecione o nome ValidarCPF e
observe, na parte inferior da caixa de diálogo, a descrição que você acabou de adicionar.
Agora, vamos salvar a pasta de trabalho, criada anteriormente, como um Add-In. Para isto, na guia
Arquivo, clique na opção Salvar como.
No diálogo Salvar como, observe que a lista Salvar em, automaticamente, selecionou a pasta
Suplementos. Esta é uma pasta especial do Excel, específica para armazenar suplementos.
Clique na caixa Nome do arquivo e digite: Validador de Documentos Add-In. Em seguida, na lista Tipo,
selecione o item Suplemento do Excel ( *.xlam ). clique no botão Salvar. O local onde será gravado o
suplemento irá variar de acordo com a versão do Windows e do Office.
Será aberta a caixa de diálogo Suplementos onde você irá selecionar o suplemento desejado. No caso:
Meu Primeiro Suplemento Observe, na parte inferior da caixa de diálogo, a descrição que você
adicionou acima (passo 2). Ative o CheckBox relativo ao suplemento e clique no botão OK para ativar o
suplemento.
Ou
O suplemento Meu Primeiro Suplemento ficará disponível para uso em qualquer pasta de trabalho do
Excel.
Após a instalação do Add-In, você poderá encontrar a nova função na categoria denominada: Definida
pelo usuário. Clique no botão Inserir função e selecione a categoria "Definida pelo usuário" em Ou
selecione uma categoria.
Seu arquivo Add-In pode conter diversos módulos com várias funções cada um. Você poderá adicionar
uma nova função ou módulo a qualquer momento.
Se seu Add-In estiver instalado, você o verá na lista do Project Explorer no Editor do VBA. Localize o
módulo contendo sua função e faça a alteração ou adição desejada.
Se seu Add-In não estiver instalado, procure pelo arquivo do Add-In e dê um duplo clique para abri-lo no
Excel. O Add-In não será visível na janela do Excel, mas estará visível na janela Editor do VBA.
Não se esqueça de salvar as alterações efetuadas em seu Add-In. Na janela do Editor do VBA, clique no
botão Salvar ou use o menu Arquivo.
Tratamento de Erros
Tipos de erros
1. Sintaxe
2. Run-time
3. Lógica
Erros de sintaxe
Os erros de sintaxe, são os erros mais fáceis de se corrigir. Pois o VBA, normalmente, indica o tipo do
erro que ocorreu e formata a linha que contem o erro na cor vermelha. Facilitando assim, a identificação
e a correção do mesmo.
O VBA não permite que o código seja executado enquanto os erros de sintaxe não forem corrigidos.
Atenção: um nome de arquivo digitado errado, por exemplo, é considerado um erro de sintaxe. Porém,
o VBA, não tem como identificar se ele está ou não correto.
Erros de Run-Time
Erros de run-time (tempo de execução) é um erro que faz com que a execução do código seja
interrompida inesperadamente em tempo de execução. Estes erros ocorrem quando um evento externo
ou erros de sintaxe não descobertos forçam a interrupção de execução do código. Um nome de arquivo
errado, a falta de um Pen drive na unidade são condições que podem provocar erros de execução.
Exemplo 1:
Um erro de Run-Time bem comum é o exemplo abaixo, onde declaramos uma variável X como sendo do
tipo Integer. Porém, de acordo com o código, ela poderá receber valores bem altos, veja:
Sub TestaErros1()
Dim X As Integer
' solicita a digitação de um número
X = InputBox("Digite um número qualquer", "Entrada")
X = X ^ 2 ' eleva X ao quadrado
MsgBox X ' exibe o valor de X
End Sub
Se você digitar um valor maior que 181, receberá a seguinte mensagem de erro:
Por quê?
Simples, ocorre que variáveis do tipo Integer, podem receber valores entre -32.768 até 32.767 e, 182 ao
quadrado, da 33.124 que é maior que o limite definido para o tipo Integer. Logo, para que o código
acima funcione adequadamente, declare X como sendo do tipo Double que possui um limite superior de
1,79769313486232E+308 que é um número astronômico.
Erros de Lógica
Um erro de lógica afeta o programa apenas em tempo de execução. Um erro de lógica fatal faz o
programa falhar e ser finalizado prematuramente. Um erro de lógica não fatal não finaliza a execução de
um programa, mas faz com que o programa produza resultados incorretos. Ou seja, resultados
diferentes do esperado.
A maioria dos recursos de depuração estão voltados à rastrear os erros de lógica cometidos pelo
programador.
Exemplo 1:
Considere a seguinte estrutura de decisão If...Then, que avalia duas expressões condicionais e exibe
uma das mensagens baseadas no resultado:
Um adolescente é uma pessoa com idade entre 13 e 19 anos, mas a estrutura não consegue identificar a
pessoa que tem exatamente 13 anos.
Este tipo de erro, não é um erro de sintaxe (as instruções seguem as regras do VBA). Também não é um
erro de run-time. Pois não provoca a interrupção da execução do código.
É um erro de raciocínio (erro de lógica). A estrutura correta deverá conter o operador "maior ou igual
a" >= conforme abaixo:
Porém, de difícil identificação. Pois o erro não ocorre frequentemente, ou seja só ocorrerá quando for
digitada a idade de 13 anos, nas demais idades, funcionará corretamente.
Enquanto você está depurando seu aplicativo, talvez queira abrir a barra de ferramentas Debug
(Depurar) com botões para rastrear erros.
Você pode também querer abrir a janela Watches (Inspeção de variáveis) que pode exibir o conteúdo de
variáveis críticas que você está interessado em ver. Para inserir instruções de programa e ver seu efeito
imediato, utilize a janela Immediate (Verificação Imediata).
A barra de ferramentas acima pode ser exibida clicando em: Exibir / Barras de ferramentas / Depurar
esta BF contém botões que são atalhos para alguns itens de menu frequentemente utilizados na
depuração do código.
Você pode clicar uma vez em um botão da barra de ferramentas para realizar a ação representada por
esse botão. Você pode selecionar a opção Mostrar dicas de ferramentas na guia Geral da caixa de
diálogo Opções se desejar exibir as Dicas de ferramentas dos botões da barra de ferramentas.
Tratando erros
Quando sabemos, de antemão que pode ocorrer algum erro em nosso código, podemos fazer uso do On
Error.
Linha pode ser um número de linha ou o nome de um label (mais usado). Veja exemplo:
Sub TestaErros2()
Dim X As Integer
A linha On error GoTo TrataErros, diz ao VBA que: caso ocorra algum erro, a execução do código deverá
ser desviada para o label TrataErros: observe que o símbolo : (dois pontos) faz parte do label.
A instrução Exit Sub, faz com que o procedimento finalize nesta linha. Caso contrário, mesmo sem
ocorrer erro, será emitida a mensagem de alerta.
Instrução On Error
Ativa uma rotina de tratamento de erro e especifica o local da rotina dentro de um procedimento; pode
ser usada também para desativar uma rotina de tratamento de erro.
On Error GoTo 0
A sintaxe da instrução On Error pode ter qualquer uma das seguintes formas:
Instrução Descrição
Ativa a rotina de tratamento de erro que inicia na linha especificada do argumento line
(obrigatório). O argumento line é qualquer rótulo de linha ou número de linha. Se
On Error GoTo Line ocorrer um erro em tempo de execução, o controle desvia para line, tornando o
tratamento de erro ativo. A line especificada deve estar no mesmo procedimento em
que se encontra a instrução On Error.
Comentários
Se você não usar uma instrução On Error, qualquer erro em tempo de execução que ocorrer será fatal,
isto é, será exibida uma mensagem de erro e a execução para.
Um manipulador de erro ativado é o que foi ativado por uma instrução On Error; um manipulador de
erro ativo é um manipulador de erro ativado que está no processo de tratar um erro. Se ocorrer um
erro enquanto o manipulador de erro estiver ativo (entre a ocorrência do erro e uma instrução Resume,
Exit Sub, Exit Function ou Exit Property), o manipulador de erro do procedimento atual não poderá
tratar o erro. O controle retornará para o procedimento de chamada. Se o procedimento de chamada
possuir um tratamento de erro ativado, ele será ativado para tratar o erro. Se o manipulador de erro do
procedimento de chamada também estiver ativo, o controle passará de volta pelos procedimentos de
chamada anteriores até encontrar um manipulador de erro ativado, mas inativo. Se não for encontrado
nenhum manipulador de erro ativado e inativo, o erro será fatal no ponto em que ele realmente
ocorreu. Sempre que o manipulador de erro passa o controle de volta para um procedimento de
chamada, esse procedimento torna-se o procedimento atual. Uma vez que o erro é tratado por um
manipulador de erro em qualquer procedimento, a execução continua no procedimento atual no ponto
designado pela instrução Resume.
Observação Uma rotina de tratamento de erro não é um procedimento Sub ou Function. É uma seção
do código marcada por um rótulo ou número de linha.
As rotinas de tratamento de erro dependem do valor na propriedade Number do objeto Err para
determinar a causa do erro. A rotina de tratamento de erro deve testar ou salvar valores de propriedade
relevantes do objeto Err antes que qualquer outro erro possa ocorrer ou antes que um procedimento
que possa causar um erro seja chamado. Os valores de propriedade no objeto Err refletem somente o
erro mais recente. A mensagem de erro associada a Err.Number está contida em Err.Description.
On Error Resume Next faz com que a execução continue com a instrução imediatamente após a
instrução que causou o erro em tempo de execução ou continue com a instrução imediatamente após a
chamada mais recente do procedimento que contém a instrução On Error Resume Next. Essa instrução
permite que a execução continue apesar de um erro em tempo de execução. Você pode colocar a rotina
de tratamento de erro onde é possível a ocorrência de erro, em vez de transferir o controle para outro
local dentro do procedimento. Uma instrução On Error Resume Next torna-se inativa quando outro
procedimento for chamado, assim você deve executar uma instrução On Error Resume Next em cada
rotina chamada para tratar os erros em linha dentro dessa rotina.
Observação A construção On Error Resume Next pode ser preferível a On Error GoTo ao tratar erros
gerados durante o acesso a outros objetos. Verificar Err após cada interação com um objeto remove a
ambiguidade sobre qual objeto foi acessado pelo código. Você pode ter certeza de qual objeto colocou o
código de erro em Err.Number, assim como qual objeto gerou originalmente o erro (o objeto especificado
em Err.Source).
On Error GoTo 0 desativa o tratamento de erro no procedimento atual. Ele não especifica a linha 0
(zero) como início do código de tratamento de erro, mesmo que esse procedimento contenha uma linha
com o número 0. Sem a instrução On Error GoTo 0, um tratamento de erro é automaticamente
desativado ao sair do procedimento.
Para evitar que o código de tratamento de erro seja executado quando não ocorreram erros, coloque
uma instrução Exit Sub, Exit Function ou Exit Property imediatamente antes da rotina de tratamento de
erro, como no exemplo a seguir:
O código de tratamento de erro segue a instrução Exit Sub e precede a instrução End Sub para separá-lo
do fluxo de procedimento. O código de tratamento de erro pode ser colocado em qualquer lugar do
procedimento.
Os erros não interceptados em objetos são retornados ao aplicativo de controle quando o objeto está
sendo executado como um arquivo executável. Dentro do ambiente de desenvolvimento, os erros não
interceptados são retornados ao aplicativo de controle somente se as opções apropriadas estiverem
definidas. Consulte a documentação de seu aplicativo host para obter uma descrição das opções que
devem ser definidas durante a depuração, como defini-las e se o host pode criar classes.
Se você criar um objeto que acessa outros objetos, deve tentar tratar os erros que foram retornados
deles sem que tenham sido tratados. Se você não puder tratar esses erros, mapeie o código do erro em
Err.Number para um de seus próprios erros e, em seguida, retorne-os para o chamador de seu objeto.
Você deve especificar seu erro adicionando o código de erro à constante vbObjectError. Por exemplo, se
o código de erro for 1052, atribua-o como a seguir:
Err.Number = vbObjectError + 1052
Este exemplo primeiramente usa a instrução On Error GoTo para especificar o local de uma rotina de
tratamento de erro dentro de um procedimento. No exemplo, uma tentativa de excluir um arquivo
aberto gera o erro número 55. O erro é tratado na rotina de tratamento de erro e, em seguida, o
controle é retornado à instrução que provocou o erro. A instrução On Error GoTo 0 desativa a
interceptação de erro. Em seguida, a instrução On Error Resume Next é usada para adiar a
interceptação de erro de modo que o contexto do erro gerado pela próxima instrução possa ser
conhecido com certeza. Observe que Err.Clear é usada para limpar as propriedades do objeto Err depois
que o erro é tratado.
Sub OnErrorStatementDemo()
' Ative a rotina de tratamento de erro.
On Error GoTo ErrorHandler
End If
Case Else
' Trate outras situações aqui...
End Select
Resume ' Continue a execução na mesma linha que provocou o erro.
End Sub
Os erros interceptáveis podem ocorrer quando um aplicativo está sendo executado. Alguns erros
interceptáveis podem ocorrer também durante o desenvolvimento ou o tempo de compilação. Você
pode testar e responder a erros interceptáveis usando a instrução On Error e o objeto Err. Números de
erro, não usados no intervalo 1 – 1000, são reservados para uso futuro do Visual Basic.
Código
Descrição
do Erro
0006 Estouro
Código
Descrição
do Erro
Impossível reduzir os eventos do objeto, pois o objeto já está disparando eventos para o número
0096
máximo de receptores de eventos que suporta
0097 Impossível chamar uma função adequada que não seja uma instância de definição de classe
Uma chamada de propriedade ou método não pode incluir uma referência a um objeto particular,
0098
seja como um argumento ou como um valor de retorno
Código
Descrição
do Erro
0432 O nome ou a classe do arquivo não foi encontrada durante a operação de Automação
A conexão à biblioteca de objetos ou de tipos foi perdida. Pressione OK para o diálogo remover a
0442
referência.
0451 O procedimento Property Let não foi definido e o procedimento Property Get não retornou um objeto
Código
Descrição
do Erro
Formulários (UserForms)
Com a utilização de UserForms você pode criar formulários personalizados, semelhantes aos que podem
ser criados usando linguagens de programação como o Visual Basic ou Delphi.
Você pode criar interfaces personalizadas, parecidas com as utilizadas em programas do Windows. Você
pode criar formulários onde são inseridos controles tais como:
Caixa de Listagem
O uso prático de um UserForm é na criação de um formulário que facilita a utilização das planilhas de
uma pasta de trabalho do Excel. Por exemplo, você pode criar um formulário onde o usuário seleciona o
nome de um cliente em um controle do tipo Caixa de Combinação.
Ao selecionar o nome do cliente, no controle Caixa de Combinação, será disparado o Evento Após
alterar da Caixa de Combinação. Em resposta a este evento, você pode utilizar código VBA para localizar
os dados do cliente selecionado e exibi-los em Caixas de texto no UserForm. Este é apenas um pequeno
exemplo das possibilidades disponibilizadas pelos UserForms, juntamente com o modelo de Eventos do
Windows e a utilização do VBA.
Com o uso destes recursos é possível criar aplicativos bastante sofisticados, usando o Excel.
Mesmo com todos estes recursos, sempre é importante lembrar que é um erro querer utilizar o Excel
para solucionar todo e qualquer problema. Existe até um ditado bastante popular para descrever esta
situação: "Quando a única ferramenta que você conhece é um martelo, todos os problemas se
parecerão com um prego."
Ou seja, é um erro querer adaptar todos os problemas para serem resolvidos com o Excel, só porque
esta é a ferramenta que você mais domina. Em situações que envolvam um grande volume de registros
(milhões de registros), ou um grande número de tabelas ou problemas que envolvem muitos cálculos ou
cálculos complexos, a ferramenta mais indicada não é o Excel.
Para grandes volumes de dados e para problemas que envolvam um grande número de diferentes
tabelas você pode usar um banco de dados, como o Microsoft Access ou SQL Server.
Em situações que envolvam muitos cálculos e uma lógica complexa, é recomendado o uso de uma
linguagem de programação para geração de aplicativos, tais como o Visual Basic, VB.NET, Delphi, C++,
C#, Java e assim por diante.
No entanto, com o lançamento do Excel 2010, a Microsoft lançou, também, o PowerPivot suplemento
para lidar com centenas de milhões de dados descrito mais abaixo.
O uso mais comum e prático para os UserForms é a criação de formulários que atuam como uma
interface mais amigável para o usuário utilizar os dados de uma ou mais planilhas de uma pasta de
trabalho:
Uma situação típica para a utilização de UserForms é quando você precisa criar uma ou mais planilhas,
as quais serão utilizadas por funcionários que não foram treinados no Excel e, portanto, não sabem
utilizar os recursos de uma planilha do Excel. Nestas situações você cria uma ou mais formulários,
usando UserForms, formulários estes que atuam como uma interface entre o usuário final e as planilhas
do Excel. Ou seja, o usuário final – que nada conhece do Excel, interage diretamente com os formulários,
usando os recursos disponíveis nos formulários, para inserir, pesquisar, classificar e excluir dados.
O que é um Formulário
Um objeto UserForm é uma janela ou caixa de diálogo que constitui parte da interface de usuário de um
aplicativo. Podemos dizer que os formulários são recipientes de controles.
No VBA, a interface entre o usuário e o computador é feita pelas caixas de diálogo, que são criadas
através de UserForms, nos quais você pode inserir os controles que desejar e colocar botões para o
usuário responder aos controles, tornando a aplicação personalizada. Através de um formulário você
poderá dar consistência às informações fornecidas e executar as ações que desejar quando for
pressionado o botão OK.
Para inserir um formulário, na janela do VBA clique no menu Inserir UserForm. Surgirá uma nova
pasta com o nome de Formulários, na qual os formulários serão armazenados. Dentro da pasta há um
formulário com o nome de UserForm1. também será exibida uma caixa de ferramentas contendo os
controles de formulários que será utilizada para inserir objetos no formulário.
Caso a caixa de ferramentas não apareça, clique no menu Exibir Caixa de Ferramentas.
Um objeto que você pode inserir em um formulário que possui seu próprio conjunto de propriedades,
métodos e eventos reconhecidos. Você utiliza controles para receber entrada do usuário, exibir saída e
acionar procedimentos de evento. Você pode manipular a maioria dos controles utilizando métodos.
Alguns controles são interativos (respondem a ações do usuário), enquanto outros são estáticos
(acessíveis somente por meio de código).
Posicione o mouse sobre o formulário e clique e solte o mouse na posição onde deseja colocar o
controle. Se desejar, você poderá: clicar e arrastar o mouse para desenhar o controle no tamanho
desejado.
Lista dos Controles da Caixa de Ferramentas do VBA
Nome
Botão Descrição
prefixo
Object Selecionar objetos é o único item da Caixa de ferramentas que não desenha um
controle. Ao selecioná-lo, você somente poderá redimensionar ou mover um
Selection controle que já tenha sido desenhado em um formulário.
Label Permite-lhe ter algum texto que você não deseja que o usuário altere, como uma
lbl legenda sob um gráfico.
TextBox
Contém texto que o usuário pode inserir ou alterar.
txt
ListBox Utilizada para exibir uma lista de itens que o usuário pode escolher. A lista pode
lst ser deslocada se tiver mais itens do que podem ser exibidos de uma só vez.
CheckBox Cria uma caixa que o usuário pode facilmente escolher para indicar se algo é
verdadeiro ou falso ou para exibir várias opções quando o usuário desejar
chk escolher mais de uma.
OptionButton
Permite-lhe exibir várias opções das quais o usuário pode escolher somente uma.
opt
ToggleButton Cria um botão com dois estágios, ativado (pressionado) ou desativado. Usando
dois OptionButtons ou um CheckBox você terá o mesmo efeito.
tgb
CommandButton
Cria um botão que o usuário pode escolher para executar um comando.
cmd
TabStrip Permite-lhe definir várias páginas para a mesma área de uma janela ou caixa de
diálogo do seu aplicativo.
tst
Page
Apresenta várias telas de informações como um único conjunto.
pge
Fornece uma ferramenta gráfica para navegação rápida através de uma longa
ScrollBar lista de itens ou de uma grande quantidade de informações, para indicar a
scr posição atual em uma escala ou como um dispositivo de entrada ou indicador de
velocidade ou quantidade.
SpinButton Um controle de rotação que você pode utilizar com outro controle para
incrementar e decrementar números. Você pode também utilizá-lo para rolar
spi para trás e para frente, através de um intervalo de valores ou uma lista de itens.
O controle RefEdit deve ser usado quando você queira dar, ao usuário, a
RefEdit liberdade de selecionar um intervalo na planilha.
Propriedade Descrição
É um caractere qualquer para representar a tecla de aceleração do comando. Este caractere ficará
Accelerator sublinhado para chamar a atenção seu uso é ALT+caractere.
Se True, o controle será redimensionado o suficiente para mostrar todo seu conteúdo. Se False,
Autosize mostra/exibe parte do conteúdo.
Especifica se ocorre tabulação automática quando um usuário digita o número máximo de caracteres
Autotab permitido em um TextBox ou na parte da caixa de texto de um ComboBox.
Especifica o modo de seleção de palavras em um TextBox ou ComboBox. Se for True, ao arrastar o mouse
pelos caracteres de uma palavra para selecionar, quando iniciar a seleção da próxima palavra, ambas
AutoWordSelect ficarão automaticamente selecionadas. Se False, ao arrastar o mouse para selecionar, somente serão
selecionados os caracteres, não selecionando automaticamente a palavra inteira.
Define qual coluna de um ComboBox ou ListBox de várias colunas contém o dado a ser armazenado.
Se o valor desta propriedade for True, o botão de comando será o botão Cancelar do formulário, que é o
Cancel botão a ser executado ao pressionar a tecla ESC. Se for definido como False, este não será o botão cancelar.
Somente um botão de comando pode ter o valor desta propriedade definido como True.
Rótulo ou título do objeto. Esta propriedade define o que será exibido como texto na barra de titulo do
Caption form ou o rótulo de um objeto, como um Label.
Especifica quantas colunas serão exibidas em um ComboBox ou ListBox. Se for 0, nenhuma coluna da lista
ColumnCount será exibida e –1 exibe todas as colunas.
Indica o local onde serão armazenados ou definidos os valores do controle. Por exemplo, ao digitar um
ControlSource texto em um TextBox, você pode especificar que este texto seja armazenado em uma determinada célula
de uma determinada planilha. Por exemplo: Plan1!A1. Pode-se usar uma célula nomeada.
Especifica o texto que aparece quando o usuário mantém, durante um momento, o ponteiro do mouse
ControlTipText sobre um controle sem clicar.
Designa o botão de comando padrão em um formulário. Ou seja, caso o usuário pressionar Enter, este será
Default o botão executado.
Enabled Especifica se um controle pode receber o foco e responder aos eventos gerados pelo usuário.
A altura em pontos, de um objeto. Um ponto é igual a 0,0353 cm. Costuma-se medir em pontos os
Height tamanhos de fonte.
HideSelection Especifica se o texto selecionado permanece realçado quando um controle não tem o foco.
Indica se um ListBox ou TextBox exibe linhas completas de texto em uma lista ou linhas parciais. A
IntegralHeight propriedade IntegralHeight refere-se à altura da lista, da mesma forma que a propriedade AutoSize se
refere à largura da lista.
Left À distância entre um controle e a borda esquerda ou superior do formulário que o contém.
Especifica o número máximo de linhas a exibir na lista. Se o número de itens na lista exceder o valor da
ListRows propriedade ListRows, aparecerá uma barra de rolagem na borda direita da parte caixa de listagem da
caixa de combinação.
Propriedade Descrição
Especifica se um controle pode ser editado. Quando um controle está bloqueado e ativado, ele ainda
Locked pode iniciar eventos e ainda pode receber o foco.
Retorna ou define um valor indicando como um ListBox ou ComboBox pesquisa sua lista à medida que o
usuário digita. Por exemplo, se digitar a letra M, surgirá a primeira palavra iniciada por esta letra. Esta
propriedade define a maneira como é feita a pesquisa e seu valor pode ser:
0 – A pesquisa é feita de forma que será exibida a primeira palavra iniciada com o caractere digitado. Se
Matchentry digitar M, será exibido Maio. Se, em seguida, digitar J, será exibido Janeiro.
Determina se o texto digitado na caixa de texto de uma ComboBox deve ser igual a um item da lista do
MathRequired controle. Pode ser True, indicando que o texto deve existir na lista, ou False, que aceita qualquer valor.
Especifica o número máximo de caracteres que um usuário pode digitar em um TextBox ou ComboBox.
MaxLenght Definir a propriedade MaxLength como 0 indica que não há nenhum outro limite além do criado por
restrições de memória.
Especifica o tipo de ponteiro exibido quando o usuário posiciona o mouse sobre um determinado objeto.
Utilize a propriedade MousePointer quando desejar indicar mudanças na funcionalidade à medida que o
MousePointer ponteiro do mouse passar sobre controles de um formulário. Por exemplo, a definição de ampulheta (11)
é útil para indicar que o usuário deve aguardar o término de um processo ou operação.
Especifica se caracteres de espaço reservado são exibidos no lugar dos caracteres realmente digitados em
um TextBox.
PasswordChar
Você pode utilizar a propriedade PasswordChar para proteger informações importantes, como senhas ou
códigos de segurança.
Especifica a origem que fornece uma lista para um ComboBox ou ListBox. Pode ser uma célula ou um
RowSource intervalo.
Especifica se um controle, formulário ou página possui barra de rolagem vertical, horizontal ou ambas.
ShowModal Se True, a janela será restrita. Ou seja, para acessar outras janelas você deverá fechar o formulário.
Especifica a quantidade de movimento que ocorre quando o usuário clica em qualquer uma das setas de
SmallChange rolagem em um ScrollBar ou SpinButton.
Para ComboBox, especifica como o usuário pode escolher ou definir o valor do controle.
TabStop Indica se um objeto pode receber o foco quando o usuário tabula até ele.
Text Retorna ou define o texto em um TextBox. Muda a linha selecionada em um ComboBox ou ListBox.
Propriedade Descrição
Especifica como o texto é alinhado em um controle.
TextAlign
1 – Esquerda 2 – Centralizado 3 – Direita
TextColumn Em uma lista com várias colunas, esta propriedade define qual coluna será exibida ao usuário.
Top A distância entre um controle e a borda esquerda ou superior do formulário que o contém.
Frame Page
Label
TextBox
OptionButton
CommandButton
ComboBox
CheckBox
Frame
Construindo um formulário
De um duplo clique no botão Clique aqui e preencha o código para que fique da seguinte forma:
End Sub
Pressione a tecla F5 e clique no botão Clique Aqui. Será executado o evento com o comando MsgBox
que exibirá uma mensagem.
Se você clicar no botão x (canto superior direito do form) o formulário também será fechado.
Eventos
Os Eventos são métodos que são disparados através de alguma ação realizada no formulário. Todos os
controles contém Eventos, alguns são comuns entre eles, mas alguns Eventos são específicos para
determinado controle.
Pois os eventos de algum controle, por padrão será privado, pois ele
depende do formulário aberto para ser executado, então é um método
Private exclusivo do formulário.
Sub Todos os eventos são uma Ação, portanto são do tipo SUB.
Para mudarmos o evento, por exemplo, desejamos que um CommandButton seja executado apenas
com duplo-clique e não um clique normal, dessa forma, criamos o evento Click, dando duplo-clique no
controle, e quando for direcionado à página de código com o Evento criado, com o curso dentro do
evento, selecionamos o evento desejado conforme imagem abaixo.
Dessa forma será criado um novo Evento, e como não iremos utilizar o evento Click, podemos Deletar o
mesmo para não ficar com códigos que não serão utilizados.
Alguns controles permitem que utilizemos mais que um Evento para o mesmo controle, exemplo o
controle TextBox que podemos utilizar os controles Change, Enter, Exit, KeyPress. Porém alguns
Eventos podem impedir a execução de outro, por exemplo no CommandButton, não podem ser
utilizados os Eventos Click e DblClick simultaneamente, pois quando clicar uma vez já será executado,
não possibilitando assim realizar o segundo clique.
Exit O oposto do Evento Enter, esse será executado sempre que saír do
controle
KeyPress Sempre que pressionar alguma tecla do teclado estando com o cursor
dentro do controle
Temos diversos outro eventos, que veremos alguns outros no decorror na dos exemplos.
DICAS: Alterando a propriedade Default do botão CommandButton para True. Assim, em vez de
clicar no botão, basta pressionar a tecla Enter.
Altere a propriedade Cancel de outro botão CommandButton para True. Assim poderá
pressionar a tecla Esc para executar o comando. Normalmente utilizamos relacionado a
algum botão para fechar o formulário.
cálculo. Se um TextBox estiver ligado a uma fonte de dados, a alteração do conteúdo do TextBox irá
alterar também o valor da fonte de dados acoplada.
A formatação aplicada a qualquer parte do texto em um TextBox afetará todo o texto do controle. Por
exemplo, se você alterar a fonte ou o tamanho, em ponto, de qualquer caractere do controle, essa
alteração afetará todos os caracteres desse controle.
Vamos melhor o formulário, agora gostaríamos que a mensagem fosse personalizada, ou seja,
informamos um nome para que na mensagem contenha o nome.
Como estamos utilizando um formulário, nesse caso não será necessário utilizar o comando InputBox,
vamos criar uma caixa de texto (TextBox) que receberá o nome.
Como podemos repara, não será necessário alterar a propriedade (Name) do controle Label, pois
normalmente é recomendado alterar o nome dos controle que sofrerão alguma alteração através do
código. Nesse exemplo o controle Label será somente para informar que o TextBox refere-se a um
nome.
Pag.: 182 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Agora daremos duplo-clique no controle BtnExecutar para gerar o evento Click que iremos criar um
comando conforme abaixo:
Private Sub BtnExecutar_Click()
MsgBox "Olá " & TxtNome.Text & ", como vai?"
End Sub
Com esse mesmo formulário, vamos realizar uma alteração para, ao invés de informar a mensagem em
um MsgBox, não utilizar um controle Label. Ficará com a aparencia abaixo.
Para isso vamos modificar as propriedades desse novo Label conforme abaixo:
A instrução Load, carrega um formulário para a memória. Mas, o formulário não será exibido. Ou seja,
ficará oculto.
Load NomeDoFormulário
• Esta instrução é útil quando se tem diversos formulários e, a maioria deles sejam grandes. Neste caso,
ao carregar a pasta de trabalho escreve-se no evento Open da Workbook o código para o
carregamento de todos os formulários. Assim, quando precisar exibir um formulário, basta usar o
método Show e o formulário será exibido rapidamente.
Se o formulário foi previamente carregado com a instrução Load, o método Show simplesmente exibe o
formulário.
Caso o formulário não esteja carregado, o método show carrega e exibe o formulário. Ou seja, o método
Show, executa a instrução Load automaticamente.
Ocultar um formulário
Fechar e reabrir novamente um formulário pode levar certo tempo, principalmente se o formulário for
grande. Neste caso é melhor Ocultar o formulário e depois reexibi-lo.
Descarregar um formulário
Se você terminou de fazer uso de um formulário e não vai mais precisar dele, então é melhor
descarregá-lo da memória. Para tal, use a instrução Unload.
Unload NomeDoFormulário 'descarrega o formulário especificado
Este código gera, na planilha ativa, uma lista de nomes das barras de ferramentas do Excel.
Sub ListaNomeDasBarras()
Dim L As Integer, C As CommandBar, LIN As Integer
L = 2
With Worksheets("Plan2")
With .Range("A1:C1")
Fone: 4121-6166 Reprodução Proibida Pag.: 185
VBA para Excel
.Font.Bold = True
.Value = Array("Index", "Nome (Inglês)", "Nome (Português)")
End With
For Each C In CommandBars
.Cells(L, 1).Value = C.Index
.Cells(L, 2).Value = C.Name
.Cells(L, 3).Value = C.NameLocal
L = L + 1
Next C
.Range("A1").CurrentRegion.Columns.AutoFit
.Range("A1:A" & L).HorizontalAlignment = xlCenter
End With
End Sub
Formulário de cálculos
Utilizando um formulário para calcular valores. Vamos começar com um formulário simples, onde irá
receber 2 valores, somar e devolver a resposta.
2º. O campo Resultado deve estar bloqueado para alteração, mas pode ser selecionado e até copiado.
Após criar o formulário conforme exemplo acima, devemos renomear os objetos que serão utilizados no
código conforme tabela abaixo:
Primeiro vamos deixar os campos Valor 1 e Valor 2 aceitando apenas números (0 – 9).
Para isso vamor dar duplo-clique no controle Valor 1, isso irá criar um evento Change.
Vamos gerar o evento KeyPress e depois deletar o evento Change. Com o cursor no evento Change,
vamos escolher o evento KeyPress.
O Evento KeyPress recebe um argumento, KeyAscii, que representa o código ASCII da tecla digitada. O
código 48 refere-se ao número “0” e o 57 o número “9”. Dessa forma o código verifica se a tecla digitada
estiver fora do intervalo entre os códigos ASCII 48 e 57, ou seja os números 0 até 9, ele irá retornar o
código ASCII 0, que refere-se a nulo.
Agora iremos adicionar o comando para calcular os valores do Evento Clique do botão.
O controle Resultado irá receber a soma de Valor 1 + Valor 2. No código acima utilizaremos a instrução
VAL(), que converte o texto em Double, pois se efetuar a soma sem a conversão dos valores
TxtValor1.Text + TxtValor2.Text, como os 2 controles são campos de texto, ao invés de soma os valores
serão concatenados, exemplo, 5 + 4, o código entenderá que está recebendo 2 texto, então irá juntar e
o resultado será 54. Com a instrução VAL(), os valores serão convertidos para double primeiramente,
depois serão somandos, dai sim o resultado será 9
Resultado Final
Reaproveitando Código
No próximo formulário, faremos uma forma diferente, iremos reaproveitar os códigos, ou seja, o mesmo
método será utilizado em vários locais.
Vamos pensar da seguinte maneira, se vais que um controle utiliza o mesmo algorítimo, ou muito
semelhante, podemos criar um único método e chama-lo de outros locais.
Vamos criar mais um formulário para realizar cálculos, mas dessa vez com as 4 operações fundamentais,
conforme exemplo abaixo:
2º. O Resultado deve ser travado para alteração mas pode ser selecionado e até copiado.
3º. Ao clicar em algum dos botões, Adicionar, Subtrair, Multiplicar ou Dividir, deverá executar a
operação e aparecer o resultado no controle Resultado.
Após criar o formulário com os controles, vamos alterar as propriedades conforme abaixo:
CommandButton Caption +
CommandButton Caption -
CommandButton Caption *
CommandButton Caption /
Assim como no formulário anterior, vamos deixar os campos Valor 1 e Valor 2 aceitando apenas
números, porém será criado um único método que os 2 controles irão chamar.
Dessa forma, caso seja necessário alguma alteração, basta alterar no método SomenteNumeros que irá
refletir em todos os locais que estão chamando.
Para executar as operações, também será criado um único método, que os botões irão chamar.
Nesse caso, será necessário criar um argumento que consiga diferenciar qual o tipo de operação será
realizado. Não seria uma boa prática criar um argumento do tipo String, pois os a validação pode está
em maiúsculo e passar o argumento minúsculo, ou escrever diferente, a melhor alternativa seria um
número, pois se o número for 1 não teria como o número de outra forma. O problema é que ficaria
difícil lembrar números, principalmente se forem muitas opções, então iremos utilizar uma estrutura
chamada Enumeration. Simplificando, Enumeration é uma forma de dar nome a um número, no próprio
Excel utilizamos os Enumeration, que são listas com item que representam um valor numérico, a Função
SUBTOTAL, por exemplo, utiliza uma lista Enumeration.
No VBA temos Enumeration no método MsgBox, no argumento referente ao tipo de botão que será
utilizado.
A lista Enumeration, deve ser criada no topo do módulo, antes das variáveis e métodos. Para criar uma
lista Enumeration iniciamos com a chabe Enum, seguida pelo nome que deseja para a lista, será
necessário fechar o bloco com um End Enum e no meio do bloco deve ser criado a lista com o valor
numérico referente a cada item. Deve criar um item por linha.
Será criado uma lista Enumeration para representar os operadores conforme acima. Quando for
necessário passar um argumento do tipo Enumeration, pode ser informado seu nome ou número
referente.
Agora para criar o método, basta passar qual tipo de Operador ele deverá calcular e os 2 valores, e
dentro será de responsabilidade do método calcular dependendo do argumento passado.
É criado uma variável do tipo Double que irá receber o resultado da operação, dependendo do tipo de
operação, o método é responsável pelo calculo, depois devolve o resultado do cálculo.
Nos eventos clique de cada botão iremos passar o tipo de operação e os 2 valores para calculo, e
resultado será armazenado no controle Resultado.
Muitas vezes são necessárias alterações de propriedades dos controles em tempo de execução, ou seja,
enquanto o formulário é executado. Para isso precisamos alterar as propriedades através do código.
Vamos criar um formulário que altere algumas propriedades dinamicamente em tempo de execução.
Iremos utilizar alguns controles novos nesse exemplo como o ScrollBar e o Image.
Esse formulário tem como objetivo misturar as cores conforme alteramos o valor do ScrollBar, e nos
Label de cada ScrollBar, será exibido o valor do respectivo ScrollBar e alterado a cor somente em sua
tonalidade.
Label4 Caption 0
Label5 Caption 0
Label6 Caption 0
Nesse formulário iremos fazer uma mistura com referencia aos comandos dos Eventos, iremos criar um
método que todos os eventos irão chamar, porém cada evento também terão seus próprios comandos.
Nesse método, será atribuído ao controle ImgCores, na propriedade BackColor, o resultado do método
RGB, que recebe valores de 0 até 255 dos argumentos Vermelho, Verde e Azul, com isso o método
realiza o calculo e retorna um valor referente a mistura dessas cores.
Agora iremos criar os eventos de cada ScrollBar. Esse controle contém o evento padrão Change, que é
executado quando alterado o valor do ScrollBar.
Em cada evento, ele primeiro altera os valores de sua respectiva Label e depois chama o método
MisturarCores, que irá alterar a cor do controle ImgCores.
LblVermelho.Caption = ScbVermelho.Value
Nessa primeira linha o controle Label LblVermelho recebe o valor do ScrollBar ScbVermelho.
LblVermelho.BackColor = RGB(ScbVermelho.Value, 0, 0)
Nesse segunda linha o controle Label LblVermelho, a propriedade BackColor, recebe da propriedade
RGB somente alterações da cor Vermelha. Podemos notar que os argumentos referente ao Verde e o
Azul, estão com valor “0”.
Será informado um valor de entrada por padrão, mas esse valor poderá ser modificado.
Caso escolha a área VIP, terá um acréscimo de 50% do valor da entrada. No case de mulher, será
acrescido 50% sobre o valor já com o desconto.
Se for no período Noturno, será proibido a entrada de menores. Deverá apresentar uma mensagem com
as cores em vermelho.
Algumas opções já vem pré-definidas, mas poderão ser alteradas, e para exibir o valor, ou a mensagem,
deverá clicar no botão Calcular.
TextBox2 Text 18
SpinButton1 Min 14
SpinButton1 Value 18
Começando com o código do botão Fechar. Vamos dar um duplo clique no botão para gerar o evento
Click, porém desta vez o comportamento de fechar o formulário será um pouco diferente. Será possível
fechar o formulário somente pelo botão Fechar, o botão “X” do próprio formulário será desativado.
Nesse métodos, caso o CloseMode seja “0” (zero), significa que o formulário foi fechado pelo botão “X”
do formulário ou pelo atalho Ctrl+F4.
Depois definir que o campo TxtEntrada receba somente números ou vírgula. Será feito no evento
KeyPress.
Caso a tecla digitada, com o cursor dentro do campo, será um número (intervalo ASCII entre 47 e 58) ou
uma vírgula (código ASCII 44), ele irá aceita, senão irá retorna um ASCII 0, que significa vazil.
Anter que criar o método principal, executado pelo botão BtnCalcular, iremos executar o comando do
botão SpbIdade, que irá modificar o valor do campo TxtIdade. Para esse compando iremos utilizar o
evento Change do controle SpinButton.
Nesse comando o controle TxtIdade, na propriedade Value, recebe o valor do botão SpbIdade, também
da propriedade Value.
Agora que já criamos todos os métodos menores do formulário, iremos para o método principal.
No inicio do método, logo após o comentário, será realizado a verificação se o período é Noturno e se a
pessoa é menor de idade, caso a verificação seja positiva, ou seja, é noturno a pessoa é menor de idade,
será exibido a mensagem, o texto ficará da cor vermelha do controle LblMensagem e sairá do método,
pois não há necessidade de continuar executando os demais códigos.
Caso o fluxo da validação esteja ok, dará sequencia nos demais passos.
A seguir será criado uma variável que irá receber o valor do campo TxtEntrada, que será convertido para
o tipo Double.
Depois o a cor do texto do controle LblMensagem ficará preta, pois caso em algum momento a
validação deixou ela vermelha, deverá voltar a cor preta.
Em seguida será analisado se foi selecionado a opção Mulher. Caso sim data um desconto de 10%.
Depois se foi selecionado área VIP, caso afirmativo, terá um acréscimo de 50%.
Pra finalizar, no controle LblMensagem, será exibido a mensagem com o valor total da entrada, onde o
a variável é formatada para ficar com da forma monetária.
Formulário de Cadastro
Uma das principais funções de um formulário é para gravar e visualizar informações de uma forma mais
rápido e fácil, assim como são nos sistema corporativos, ERP, CRM, Sistemas Financeiros, de RH,
Contábeis, etc.
Com o VBA no Excel, podemos utilizar as próprias planilhas para simular um banco de dados, como
existem diversas outras formas também para trabalhar com cadastro.
Esse próximo exemplo iramos criar um formulário e gravar seus dados em memória, uma variável Array,
ou seja, só será visível enquanto o formulário estiver aberto.
Existem várias formar de cadastrar e recuperar dados de uma planilha, e iremos trabalhar com uma
técnica bem eficiente e simples.
Label2 Fonte.Tamanho 16
TextBox MaxLength 50
Nesse formulário iremos trabalhar com variáveis de Módulo, onde teremos 3 variáveis que todos os
métodos irão compartilhar
Variáveis
• nomes(): Um array de String que serão armazenados os dados. Não iremos definir o
tamanho do array na criação, faremos de forma dinâmica quando iniciar o formulário
• i: Variável que irá representar o índice do Array.
• t: Variável que irá representar o tamanho total do índice do array de dados, quantos
registros ele poderá armazenar.
Também iremos utilizar um Enumerador “Enum”, para chamar o método que ficará encarregado de
armazenar os dados e exibir no formulário.
Com as variáveis prontas, vamos inicializar o formulário, nele através de um InputBox vamos atribuir um
valor à variável t, com o tamanho que desejamos o array nomes(), depois iremos redefinir o tamanho do
array (ReDim) que irá do índice 1 até o tamanho de t.
Pra finalizar iremos chamar o método ExibirRegistros para preencher o controle LblRegistro.
Esse método, NavegarRegistros, recebe um argumento do tipo Navegadores, que é o Enum que
criamos acima. Com esse argumento o método irá tomar as decisões de qual ação será executada.
Primeiro será gravado no array da posição atual do i, o valor que está no controle TxtNomes.
Depois, dependendo da ação informada no parâmetro, será tomado uma decisão de qual ação executar.
Para retornar ao Primeiro registro, i será igual a 1, que é o primairo índice do array.
Para Voltar 1 registro, será decrementado 1 do valor de i, desde que ele seja maior que 1, ou seja,
poderá ser decrementado até chegar ao valor 1.
Para o Próximo registro, será acrescentado 1 à variável i, desde que ele seja menor que o valor da
variável t, ou seja, poderá chegar no máximo até o valor de t.
E para o Último registro, o valor de i será igual ao valor de t, que é o índice máximo do array.
No final será exibido no controle TxtNomes, o valor que se encontroa no array da posição i, lembrando
que agora o valor de i foi alterado. Caso fique em branco, significa que o array na posição de i encontra-
se vazio.
Também será tratado o formulário ao fechar, onde será exibido uma mensagem se realmente deseja
fechar. Esse tratamento será realizado no evento QueryClose do UserForm.
E o botão fechar que irá chamar o método de fechar o formulário, mas lembrando que antes de fechar
ele irá passar pelo evento QueryClose.
Agora iremos executar os comandos dos botões, e como veremos, todos irão utilizar o mesmo método,
passando como argumento um valor do Enum.
No botão copiar, faremos um loop (For ... Next) onde iremos pegar todos os dados do array nomes e
copiar para a planilha local, a partir da célula A1 até o total de registros.
Código Completo:
Option Explicit
Enum Navegadores
Primeiro = 1
Voltar = 2
Proximo = 3
Ultimo = 4
End Enum
For linha = 1 To t
Range("A" & linha).Value = nomes(linha)
Pag.: 204 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Next
End Sub
TxtNome.Value = nomes(i)
ExibirRegistros
End Sub
Projeto Final
Agora iremos criar nosso projeto final do curso. Vamos criar um sistema de cadastro de Clientes e
Fornecedores, onde teremos 2 formulários de cadastro, uma tela de login para autenticação do usuário,
além de uma faixa de opções personalizada ao projeto.
O projeto também terá 3 planilhas, sendo 2 que irão trabalhar como uma base de dados e 1 que será a
Capa do sistema.
Iremos utilizar algumas imagens no projeto que estarão disponíveis no material do aluno, ou se
desejarem podem utilizar outras imagens buscada na internet.
Todos os controles e códigos do projeto serão comentados e descritos um passo a passo nessse
material, também terá um demo do projeto no material de apoio ao aluno.
Todas as senha que serão gravadas no projeto para esse documento, serão sempre, por padrão, 1234.
Resumo do Sistema:
O sistema permitirá, através de formulários, o cadastro e consulta aos clientes e fornecedores.
O formulário terá uma grid de dados onde o usuário poderá selecionar o Cliente/Fornecedore que
deseja visualizar nos campos, depois podendo editá-lo.
Requisitos:
Cadastro de Clientes
O comportamento normal do formulário ao iniciar será de trazer todos os campos bloqueados e
somente alguns botões desbloqueados
O formulário de cadastro de clientes deverá conter 6 botões em uma barra de ferramentas que serão
eles:
Também terá uma Grid com todos os clientes cadastros, que ao selecionar um registro, o mesmo será
preenchido nos campos do cadastro.
Vamos começar criando um arquivo novo e salvando como Projeto Final VBA.xlsm.
O Painel de apresentação, iremos inserir algumas imagens, que estarão disponível no material do aluno,
mas poderão ser alteradas pois não há impacto no sistema.
Agora na planilha Cadastro de Clientes, iremos adicionar o cabeçalho de nossa base de dados, que serão
os campos dos nossos registros, conforme abaixo.
Agora vamos configurar nosso projeto VBA. Iremos no VBE, no menu Ferramentas/Propriedades de
VBAProject.
Na janela de propriedades, vamos alterar o nome do projeto para ProjetoVBA, a descrição do projeto
para Projeto final de cadastro com VBA.
Na guia Proteção, vamos selecionar a opção Bloquear projeto para exibição, e inserir uma Senha depois
Confirmar senha. A senha padrão para o projeto será “1234”.
Agora iremos renomear os Objetos do Excel na barra de Projet Explorer. Para os objetos vamos adotar
um padrão que, o início do nome será o tipo do objeto, seguido por um nome intuitivo, exemplo um
TextBox que irá receber um nome será TxtNome.
Lembrando que para alterar os nomes, basta selecionar o objeto e alterar na janela de Propriedades.
Agora já deixaremos criados os objetos que iremos trabalhar no projeto que serão 3 UserForms e 1
Módulo, já podemos alterar os nomes conforme imagem abaixo.
Pronto, agora estamos prontos para começar a criar o formulário de cadastro de clientes. Vamos criar
um formulário igual ao mostrado abaixo.
Vamos descrever cada uma das partes do formulário e informar os controles e propriedades.
Formulário
CONTROLE PROPRIEDADE VALOR
Título do formulário
Label1 Font.Tamanho 18
A Label deverá ser posicionada no topo do formulário e redimensionada com que ocupe toda a estenção
horizontal do formulário.
Barra de ferramentas
Campos
TextBox2 MaxLength 50
TextBox3 MaxLength 18
TextBox3 Tag c
TextBox4 MaxLength 30
TextBox5 Tag t
TextBox5 MaxLength 16
Grid (Tabela)
Pra finalizar vamos criar nossa Grid para visualizar os dados já cadastrados.
Inicialmente nossa grade não irá exibir o cabeçalho, isso faremos no decorrer do projeto.
Módulo
Vamos abrir o módulo que criamos (ModCadastros).
Para dar uma cara mais profissional, vamos adicionar uma nota no cabeçalho do módulo.
Iremos utilizar algumas constantes em ambos os formulários, então iremos criar no próprio módulo
Essas constantes serão utilizadas para inserir as máscaras nos campos CNPJ e Telefone.
O próximo método será utilizado para retornar a última linha com registro em uma planilha
Para isso vamos precisar de um argumento do tipo Worksheet, dentro do método utilizamos uma
função do próprio Excel (WorksheetFunction.CountA) que se refere a função CONT.VALORES. Ela irá
retornar quantos linhas estão com algum valor na coluna “A”, que representa o Código, um campo
obrigatório. O argumento planilha, será utilizado para informar que será nessa planilha específica que
será contado os registros.
O próximo método é bem parecido com o anterior, porém ele retorna o número referente a próxima
linha disponível, ou seja, um após o ultimo registro.
Esse método também precisa informar um argumento do tipo Worksheet, e como podemos ver, ele irá
chamar o método anterior, RetornaUltimaLinha(), e adiciona 1 ao resultado para depois retornar a
função.
Agora precisamos de um método para Gerar um código automático para nossos cadastros.
Esse método também precisa de um argumento do tipo Worksheet, pois ele irá analisar qual o próximo
código da planilha informada.
Ele também chama o método RetornaUltimaLinha, para saber o valor do ultimo código inserido
Com a informação da ultima linha, podemos ver que será analisado se o valor que está na coluna “A”, da
última linha de código, é do tipo numérico, pois caso não seja numérico, significa que o valor refere-se
ao cabeçalho, pois ainda não existe nenhum registro cadastrado, nesse caso o código será 1, senão, se o
valor for numérico, então será acrescentado 1 ao valor do código do último registro.
Agora um método que utilizamos em outros exemplos, para aceitar somente número em um campo.
Esse método será utilizado nos campos Telefone e CNPJ de ambos os formulários.
Caso a telha digitada estiver fora do intervalo do código ASCII que representa os número, então
retornará “0” que significa vazio.
O próximo método será utilizado nos campos de cadastro, para de uma forma genérica percorrermos
todos os controles de cadastro para limpar os valores deles.
Esse método, iremos informar um controle que é do tipo container. O que seria um container.
Os controles do tipo container são todos aqueles que podem armazenar outros controles dentro, por
exemplo o próprio UserForm, os Frames, os Multi-Pages, os TabStrip, ou seja, todos os controles que
podem adicionar armazenas outros controles.
No método acima, podemos informar tanto o UserForm ou o Frame que contém os campos de cadastro,
que será o melhor para esse exemplo, pois ficará com uma performance melhor.
Vamos entender como funciona.
Vamos receber pelo argumento um container, depois criamos uma variável do tipo Object para utilizar
no Loop. Para isso iremos utilizar o For Each, que irá percorrer todos os controles dentro do container
indicado, e caso seja do tipo TextBox, ele ira analisar a propriedade Tag dos controle, por esse motivo
nos controles de CNPJ e de Telefone foram alterados a propriedade Tag.
Quando ele encontrar uma Tag vazia, que é o padrão dos controles, ele irá alterar a propriedade Value
do controle para Empty, que significa vazio. Agora se a Tag for “c” então a propriedade Value recebe a
constante FORMA_CNPJ, que contém o formato de um CNPJ. Já se a Tag for um “t”, então ele recebe a
constante FORMA_TELEFONE, que contém o formato de um Telefone. Agora se o controle for do tipo
CheckBox, então a propriedade Valor irá receber um valor False.
O próximo método será parecido com o de limpar os campos, porém ele irá habilitar ou bloquear os
campos.
Esse método também ira utilizar um container para percorrer os controles, ele não fara tratará de forma
diferente os TextBox e os CheckBox, pois eles serão modificados a mesma propriedade com o mesmo
valor. Se ele será habilitado ou bloqueado, será passado pelo argumento habilitado que é do tipo
Boolean, que será utilizado na propriedade Enabled do controle.
Porque é necessário verificar se é do tipo TextBox ou CheckBox? Dentro do Frame de dados, existe
também os controles Label que não é necessário limpar ou mesmo bloquear nos métodos acima, e caso
seja informado o UserForm como container, para não correr o risco de limpar ou bloquear todos os
controles dentro do formulário.
Também iremos precisar de um método que localiza em qual linha está um determinado código, para
que possamos realizar buscar.
Esse método utiliza uma função CORRESP do Excel em toda a coluna “A”, procurando o código
informado por argumento e retorna a linha encontrada. Também utilizamos um tratamento de erros,
pois se for informado um código que ele não encontre será gerado um erro. Então será retornado 0 e
tratamos depois informando que não foi encontrado.
O último método que precisamos no Módulo será para preencher as Grids (Listas) dos formulários.
Esse método recebe como argumento uma variável do tipo Object que será o objeto ListBox de nosso
formulário. Também terá um argumento Worksheet.
O método irá preencher 3 propriedades do controle ListBox, são eles.
RowSource O endereço que estão os dados. Será necessário informar o caminho
completo do intervalo, inclusive o nome da planilha. Ex.:
'Planilha1'!A2:D10.
Será somente o intervalo de dados, não será infomado a linha do
cabeçalho.
ColumnCount Quantidade de colunas que serão exibidas na lista
ColumnHeads Se irá exibir o cabeçalho.
Quando é utilizado essa propriedade, ele sempre utiliza a linha
acima dos dados informados com os dados para o cabeçalho. Se o
intervalo de dados é de A2:D10, será utilizado o intervalo de A1:D1
como o cabeçalho. Se o intervalo de dados for de A1:D10, como não
existe linha antes da linha 1, ele irá criar um cabeçalho como
“Coluna1”, “Coluna2”, “Coluna3”, etc.
No método, para conseguir o endereço dos intervalos de dados, primeiro será utilizado o método
RetornaUltimaLinha para conseguir qual o ultimo registro.
Em uma variável do tipo String, será recebido o seguinte valor. Apóstrofo entre aspas concatenando
com o nome da planilha, depois concatena com o fechamento do apóstrofo mais uma exclamação
seguido pelo inicio de intervalo A2:D, e concatenando com o total de linhas com registros.
O resultado ficará algo parecido com
'Cadastro de Clientes'!A2:D10
Sempre iremos utilizar o cabeçalho com a linha 1, por esse motivo inicia com “A2”, e iremos exibir
apenas 4 colunas, por isso irá apenas até a coluna “D”.
Código completo
Option Explicit
' #########################################################
'
' MÓDULO COM MÉTODOS DE CADASTRO
'
' Descrição: Módulo contendo métodos genéricos que
' serão utilizados pelos formulários de cadastro
' Desenvolvedor: Claudio Fernando Scatolin
' Data: 01/02/2020
'
' #########################################################
' Constantes
Public Const FORMA_CNPJ As String = "__.___.___/____-__"
Public Const FORMA_TELEFONE As String = "(__) _ ____-____"
linha = WorksheetFunction.CountA(planilha.Range("A:A"))
RetornaUltimaLinha = linha
End Function
linha = RetornaUltimaLinha(planilha) + 1
RetornaProximaLinha = linha
End Function
linha = RetornaUltimaLinha(planilha)
With planilha
If IsNumeric(.Range("A" & linha).Value) Then
codigo = .Range("A" & linha).Value + 1
Else
codigo = 1
End If
End With
GerarCodigo = codigo
End Function
linha = RetornaUltimaLinha(planilha)
With lista
.ColumnCount = 4 ' Quantidade de colunas exibidas
.ColumnHeads = True ' Exibir cabeçalho da tabela
.RowSource = endereco ' Intervalo de dados
End With
End Sub
LocalizarCodigo = linha
End Function
Eventos do Formulário
Agora que já temos os métodos que serão utilizados pelo formulário, vamos começar a codificar os
Eventos dos controles.
Também iremos criar uma documentação comentando o cabeçalho do Code-Behind (código por trás) do
Formulário.
O formulário também irá precisar de algumas variáveis exclusivas dele, então dentro do Code-Behind do
formulário iremos criar as variáveis.
E a variável planilha, será para representar a planilha que iremos trabalhar, nesse caso a PlCadClientes
(Cadastro de Clientes).
Antes de iniciar a codificar os Eventos do botões, vamos inserir os eventos que definem os
comportamentos dos controles TxtCnpj e TxtTelefone.
Começando com o TxtCnpj, primeiro vamos trabalhar com a máscara do controle. O comportamento
será, ele sempre irá iniciar com o formato do CNPJ, e quando ele receber o foco, ou seja, o cursos
posicionar entro do controle, se estiver apenas com o formato do CNPJ, ele deverá ficar vazio, para que
possa receber algum valor digitado. Para isso utilizamos o Evento Enter.
Em seguinda, quando o controle perder o foco, ou seja, o cursor sair do controle, será analisado se ele
está vazio ou tem algum valor. Caso esteja vazio, ele irá retornar com o formato do CNPJ, senão ele irá
formatar os números para que fiquem com a máscara do CNPJ. Esse comportamento será ativado no
Evento Exit.
E não podemos esquecer que esse controle só deverá receber números, então no evento KeyPress
devemos bloquear outro tipo de caracter.
E para que, assim que digitarmos os valores, já será preenchido automaticamente os pontos “.” e o
hífem “-“, devemos utilizar o seguinte procedimento no Evento KeyUp.
A propriedade SelStart, dos controles TextBox são propriedade que indicam qual a posição do cursor no
momento da digitação, e a propriedade SelText, é para inserir um texto exatamente na posição que o
cursor está no momento. Exemplo no método acima, quando o cursos está na posição 2 ou na posição
6, ele irá inserir um ponto “.” na posição atual, ou seja, após digitar 2 números, ele irá inserir um ponto
“22.”, depois quando digitar mais 3 números, juntando aos 2 primeiro e mais o ponto ele irá inserir mais
1 ponto na sétima posição “22.222.”.
No Evento KeyUp do controle TxtTelefone, vemos que tem uma pequena diferença no início, pois não
tem como ele analisar se é o primeiro digito pela propriedade SelStart, pois ele já está na posição. Nesse
caso utilizamos uma analise se o controle tem apenas 1 caracter e se esse caracter é um número, se der
verdadeiro, ele irá primeiro inserir um parêntese aberto, depois o valor que tem no TxtTelefone.
Exemplo, se inserido o número “1”, ele irá substituir para “(1”.
Porque também é analisado se o valor é um número, porque ele poderá ter apenas o parêntese como
caracter inicial, caso delete o número posterior a ele, nesse caso ele iria inserir mais 1 parêntese.
Agora iremos codificar os eventos do UserForm, que no projeto iremos utilizar o Initialize e o
QueryClose.
Para inicializar o formulário, vamos começar iniciando a variável planilha referenciando qual planilha ela
deverá representar, nesse caso a PlCadClientes.
Em seguida iremos desabilitar todos os campos do Frame FrDados, utilizando o método
HabilitarCampos passando o parâmetro False.
Em seguida limpar os campos com o Método LimparCampos, isso também fará com que os campos
TxtTelefone e TxtCnpj fiquem com o formato correspondente a cada um.
Iniciamos a variável estaEditando como False, informando que o formulário não está sofrendo
alterações.
E para finalizar chamamos o método PreencherLista, para deixar o ListBox já formatado com o
cabeçalho e se tiver algum registro, será preenchido.
No evento QueryClose, será inserido a analise com a pergunta se realmente deseja fechar o formulário.
Caso clique em não, será cancelado o fechamento. Dessa forma a mensagem será solicitada tanto
quando clicar no botão Fechar quando ao clicar no “X” do formulário.
Pra finalizar os comportamentos referente ao formulário, vamos inserir o Evento do botão BtnFechar.
Simplesmente irá chamar o método Unload com o argumento Me, que significa que é o próprio
formulário.
Vamos começar a adicionar Eventos aos controles, e iremos começar com o botão Adicionar.
Esse controle irá chamar diversos métodos que já criamos. Vamos analisar linha a linha.
Após finalizar os códigos para o botão Adicionar, iremos adicionar o Evento do botão Salvar.
No Evento do botão Salvar, é adicionado cada a planilha em cada uma das colunas, o valor de cada um
dos controle correspondentes. Após inserir os valores será exibido uma mensagem informando que o
registro foi salvo, a variável estaEditando passará para False, pois nesse momento encerou-se as
alterações no formulário, o método HabilitarCampos irá desabilitar os campos, pois está com o
parâmetro False e é chamado o PreencherLista, para que a lista veja atualizada com o cadastro que
acabou de ser salvo.
Finalizando o botão Salvar, podemos ver o botão Desfazer, que seria uma função de cancelar as
alterações.
No desfazer, iremos simplemente falar que a variável estaEditando será False e chamar o método
HabilitarCampos para desabilitar os campos, pois quando cancelamos o formulário não estará mais em
estado de alteração.
Como já temos os arquivos salvos, precisamos de um método para Preencher os campos com os
registros que já temos na planilha.
Esse método é bem parecido com o Evento do botão Salvar, a diferença é que o salvar copia os valores
dos controle para a planilha e o método preencher copiamos da planilha para os controles.
Antes de chamar os Eventos dos botões Editar e Deletar, vamos inserir o Evento para o ListBox, pois
assim teremos registros selecionados para podermos Editar ou Deletar.
Esse evento atribui a variável linha o resultado da Função LocalizarCodigo, que busca em qual linha está
determinado código. Depois ele chama o método PreencherCampos mas somente se linha for maior
que 0.
Podemos ver que ele somente executa o procedimento se a variável estaEditando estiver como False,
pois se estiver como True, significa que o formulário está em estado de alteração então não poderá ser
alterado os registros até que seja finalizado.
Agora vamos para o Botão Editar. Ele será muito simple, o objetivo principal será debloquear os campos
preenchidos para que possa editá-lo.
O botão Editar simplemente informa que o formulário está em estado de alteração e habilita os campos
para poder alterá-los.
E para finalizar os eventos de botões, vamos criar o Evento para o botão Deletar.
O método primeiro pergunta se realmente deseja deletar o registro, caso positivo ele remove a linha
inteira da planilha referente ao registro, depois mostra uma mensagem informando que o registro foi
deletado.
Para finalizar os comportamentos do formulário, vamos criar a tarefa de busca. Esse processo será em 2
etapas.
Primeiro clicamos no botão Localizar, ele irá debloquear o campo Código e permitirá sua edição.
O segundo passo será após o campo Código perder o foco depois de ter digitado algum código que
deseja procurar, através de um Tab ou Enter.
Primeiro o campo Código só poderá aceiar números, portanto vamos utilizar o método
SomenteNumeros
Ele simplemente limpar os campos, habilita o campo Código, desbloqueia para digitação e altera a cor,
depois recebe o Foco do cursor.
Primeiro temos algumas codições, para ele realizar a busca o campo deve ter um número e ser diferente
de vazio.
Depois ele irá atribuir à variável linha o resultado da função LocalizarCodigo.
Agora irá confirmar se restornou algum valor maior que 0, o que significa que encontrou um registro,
dai irá preencher os campos. Senão irá limpar os campos e exibir uma mensagem informando que não
localizou o código.
Pra finalizar ele volta a bloquear o campo, desabilita e volta a cor original.
Cadastro de Fornecedores
Os controles do formulário serão selecionado, então vão copiar com um Ctrl+c, ir até o formulário de
Cadastro de Fornecedores e colar Ctrl+v.
Agora iremos ajustar o tamanho do formulário com os controles, alterar as propriedades BackColor e
Caption do Label do cabeçalho do formulário. Ele ficará como a imagem abaixo.
Agora precisamos codificar, para isso vamos continuar com o Copiar e Colar.
No Code-Behind do formulário de Cadastro de Clientes, vamos pressionar Ctrl+t para selecionar todos
os registros, depois Ctrl+c para copiar.
Agora no Code-Behind do formulário de Cadastro de Fornecedores, vamos pressionar Ctrl+v.
Agora para que o formulário funcione corretamente, basta ir até o Evento Initialize do UserForm e
alterar a inicialização da variável planilha de PlCadClientes para PlCadFornecedores.
Pronto, mais um formulário funcionando.
Código completo
Como os 2 formulários tem o código praticamente idênticos, vou deixar somente o código do formulário
de Cadastro de Clientes, mas no projeto que estará disponível no material do aluna, tem todo o código
funcionando para futuros estudos.
Option Explicit
' #########################################################
'
' Projeto de conclusão do curso
' Excel com VBA
'
' Descrição: Cadastro de clientes e fornecedores
' Desenvolvedor: Claudio Fernando Scatolin
' Data: 01/02/2020
'
' #########################################################
Pag.: 236 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
' *****************************
' EVENTOS
' *****************************
' BOTÕES
End Sub
End Sub
End Sub
With TxtCnpj
If .SelStart = 2 Or .SelStart = 6 Then .SelText = "."
If .SelStart = 10 Then .SelText = "/"
If .SelStart = 15 Then .SelText = "-"
End With
End Sub
.Enabled = False
.Locked = True
.BackColor = &H80000005
End With
End Sub
With TxtTelefone
If Len(.Text) = 1 And IsNumeric(.Text) Then
.Text = "(" & .Text
End If
End Sub
Formulário de Login
O formulário de login terá um usuário e senha para liberar a entrada da planilha. O comportamento
deverá ocultar a planilha assim que for aberta e abrirá o formulário de Login, validando o usuário e
senha o formulário será fechado e a planilha aparecera liberada. Se for cancelado deverá fechar o
projeto.
Para criar o formulário vamos precisar dos seguintes controles com suas propriedades
Label1 Font.Tamanho 12
Label2 Font.Tamanho 12
TextBox1 Font.Tamanho 14
TextBox2 Font.Tamanho 14
TextBox2 PasswordChar *
CommandButton1 Caption OK
CommandButton1 Font.Tamanho 12
CommandButton2 Caption OK
CommandButton2 Font.Tamanho 12
Será utilizado 2 constantes e 1 variável, que indica que o login foi cancelado.
Vamos criar os efeitos dos controles TxtLogin e TxtSenha, onde verão com os valores “User Name” e
“********”. Quando receber foco, caso tenham esses valores, o controle será limpo, ao sair se estiver
vazio, recebe de volta os valores padrão.
O Evento cancelar irá informar que está cancelando o login e solicita o fechamento do formulário.
A regra utilizada ao fechar, será criada no evento QueryClose, pois também poderá ser fechado pelo
botão fechar “X”.
Quando for cancelado o login, deixará o Aplicativo (Excel) novamente visível e irá fechar o projeto.
A analise de estaCancelado é realizada, pois quando o login for valido também irá fechar o formulário, e
nesse caso não poderá aplicar a regra de quando for cancelado.
Caso o usuário e senha estiverem corretos, o Aplicativo (Excel) será exibido, a planilha Painel será
selecionada e o formulário de login será fechado.
Caso a senha esteja errada, será exibido uma mensagem, o campo senha será limpo e receberá o foco.
Código completo
Option Explicit
'################################################
'
' LOGIN
'
' Será utilizado um usuário e senha padrão
' Usuário "Admin", com o "A" maiúsculo
' Senha "1234"
'
'#################################################
' CONSTANTES
Private Const USER_NAME As String = "User Name"
Private Const PASSWORD As String = "********"
Private estaCancelado As Boolean
Para esse projeto não criaremos uma Faixa de Opções utilizando as ferramentas do Excel, iremos criar
um Faixa de Opções exclusiva para o Projeto. Para isso iremos utilizar o software Custom UI Editor for
Microsoft. Um software que permite customizar o arquivo utilizando a linguagem XML.
O instalador do sistema mais uma apostila simplificada de como utilizar com de uma forma mais
explicativa, estará disponível no material de apoio do aluno.
Após instalado, o primeiro passo é fechar nosso projeto, pois ele será aberto pelo UI Editor, e como irá
modificar a estrutura do arquivo, o mesmo deverá ficar fechado.
Ao finalizar a instalação será criado um ícone na área de trabalho, vamos abrir o UI Editor.
A janela dela é bem simples, com poucos botões, pois o objetivo é codificar utilizando o XML.
Vamos abrir nosso projeto, clicando no Menu File/Open ou pelo ícone da pasta na barra de ferramentas.
Após abrir o projeto, ele ficará em uma lista do lado esquerdo do aplicativo.
Agora iremos atribuir um arquivo XML para nosso projeto, e nesse arquivo XML que iremos criar as TAGs
necessárias para criar nossa faixa de opções.
Para inserir o arquivo XML, no menu Insert existem 2 opções, Office 2010 Custom UI Part e Office 2007
Custom UI Part. Qualquer versão igual ou superior ao Office 2010 irá utilizar a primeira opção
Não precisamos começar a criar as TAGs XML do zero, podemos utilizar algum modelo pronto e apenas
modifica-lo.
No Menu Insert/Sample XML/Excel – A Custom Tab, temos um modelo que atende nossa necessidade.
Um conselho seria utilizar uma outra aplicação para modificar o XML, pois o UI Editor não é um bom
editor de texto. Pode ser utilizado o Notepad++ ou o Visual Studio Code. Ambos são softwares Free.
Notepad++
Pag.: 248 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
customUI > ribbon > tabs > tab > group > button
A TAG customUI é a Tag raiz que contem o schema de validação das Tags, não iremos nos preocupar
com essa.
A TAG ribbon será para indicar que iremos trabalhar com a estrutura do ribbon, ou a Faixa de Opções.
A TAG Group são os grupos dentro das Guias, Área de Transferencia, Fonte, etc.
Importante, para diferenciar quando alguma TAG representa algum objeto já criado pelo próprio
aplicativo ou uma que TAG de algum componente que iremos criar, das propriedades das TAGs sempre
que o nome dessa propriedade terminar com Mso, exemplo idMso, quando o componente for de nossa
criação será utilizado somente id.
Para nosso projeto iremos trabalhar com as TAGs, tab, group e button.
Criaremos uma Guia personalizada com o nome de Projeto VBA, dentro ela terá 3 grupos Cadastro,
Navegação e Sistema.
O grupo Navegação, terá 3 botões que serão para navegar entre as planilhas, os botão serão Ir Painel, Ir
Cadastro de Cliente, Ir Cadastro de Fornecedores.
O grupo Sistema terá 2 botão, Salvar que ira salvar o arquivo e Fechar que irá salvar e depois fechar o
arquivo.
label O que aparecerá escrito no elemento. Exemplo das guias Página Inicial,
Inserir, Design.
insertAfterMso Essa propriedade informa em qual posição será inserida a guia, passamos o
nome de uma guia existente e a guia criada será inserida após essa guia.
insertBeforeMso Essa propriedade informa em qual posição será inserida a guia, passamos o
nome de uma guia existente e a guia criada será inserida antes essa guia.
size O tamanho do botão. O tipo large deixa o botões grandes e o tipo normal
deixa os botões pequenos.
onAction Aqui iremos inserir o nome do método que irá executar quando clicarmos
no botão
Lembrando que todas as propriedades acima que terminarem com Mso, são exclusivas do Office.
PROPRIEDADE VALOR
id TabProjetoVba
insertBeforeMso TabHome
A propriedade insertBeforeMso="TabHome", infoma que nossa guia será exibida antes da guia Página
Inicial, ou seja, nossa guia será a primeira guia da Faixa de Opções.
Dentro da tab, existem 6 group, onde 5 são do próprio Excel (idMso) e 1 é personalizado. Vamos excluir
todos os group que são do Excel (idMso) e deixar apenas o personalizado.
PROPRIEDADE VALOR
id GroupCadastro
label Cadastros
Agora iremos alterar os button. Dentro do group, existem 3 button, porém para esse group iremos
precisar apenas de 2, portanto vamos deletar 1 button.
PROPRIEDADE VALOR
id BtnCadClientes
label Clientes
size large
onAction AbrirCadastroClientes
image addClient
id BtnCadFornecedores
label Fornecedores
size large
onAction AbrirCadastroFornecedores
image addSupplier
As propriedades de imageMso que vem por padrão deverá ser alterada para image, pois iremos inserir
uma imagem personalizada e não alguma imagem da biblioteca do Office. O nome da imagem deverá
ser exatamente igual ao nome da imagem que iremos inserir, inclusive caracteres maiúsculos e
minúsculos.
Agora vamos criar os outros 2 groups, para isso iremos copiar o group que já está criado e colar 2 cópias
abaixo do existente.
PROPRIEDADE VALOR
id GroupNavegador
label Navegação
PROPRIEDADE VALOR
id BtnIrPainel
size normal
onAction IrPainel
image goPanel
id BtnIrClientes
size normal
onAction IrClientes
image goClient
id BtnIrFornecedores
size normal
onAction IrFornecedores
image goSupplier
PROPRIEDADE VALOR
id GroupSistema
label Sistema
PROPRIEDADE VALOR
id BtnSalvar
label Salvar
size large
onAction SalvarProjeto
image save
id BtnFechar
label Fechar
size large
onAction FecharProjeto
image close
Segue abaixo o código XML completo. Caso tenha escrito o código em outro Editor, Notepad++ ou
Visual Studio Code, basta copiar e substituir o que está no UI Editor.
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="TabProjetoVba" label="Projeto VBA" insertBeforeMso="TabHome">
<group id="GroupCadastro" label="Cadastros">
<button id="BtnCadClientes" label="Clientes" size="large"
onAction="AbrirCadastroCliente" image="addClient" />
</group>
Primeiro iremos inserir as imagens, para isso iremos clicar no botão Insert Icons que encontra-se na
barra de ferramentas.
Vamos selecionar as imagens, podem ser inseridas todas ao mesmo tempo. Lembrando que as imagens
devem ter o mesmo nome que está informado na propriedade image do XML, caso esteja diferente,
deverá altear o nome da imagem ou da propriedade.
Agora iremos validar se o XML está OK, para isso vamos clicar no botão Validate que está na barra de
ferramentas.
Caso o XML esteja de acordo com o Schema de validação, será exibido uma mensagem informando que
o arquivo está bem formado.
Agora se existir alguma divergência, também será informado em uma mensagem com o erro
encontrado. Para simular o erro, iremos alterar alguma TAG deixando 2 ids com o mesmo nome.
Lembrando que nas propriedades onAction, nós informamos o nome dos métodos que devem ser
executados quando clicarmos nos botões, porém esses métodos ainda não existem em nosso projeto.
Para facilitar a sua criação, vamos clicar no botão Generate Callbacks, que está na barra de ferramentas.
Ele irá mostrar a estrutura dos métodos já pronto, precisando somente codigicar as ações. Então
irermos copiar esses estruturas pois iremos utilizar em nosso projeto.
Nas estruturas já vem com o argumento do tipo IRibbinControl, que o sistema utiliza para identificar
que está sendo chamado da Faixa de Opções.
Então agora que as alterações já estão salvas e já copiamos a estrutura dos métodos, podemos fechar o
UI Editor e abrir o Projeto Final VBA.xlsm.
Ao abrir o projeto, podemos ver que nossa guia já está disponível com os controles, porém ainda não
está funcionando pois os módulos ainda não existem.
Então vamos abrir o VBE, e criar um novo Módulo no projeto, e iremos chama-lo de ModFaixaOpcoes.
Dentro desse módulo iremos colar as estruturas de métodos que copianos.
Começando pelos controle para abrir os formulários de cadastro, vamos utilizar um tratamento de
erros, apenas para, se ocorrer algum erro durante a abertura, ele será ignorado.
Para abrir o formulário, basta apontar o formulário que deseja abrir, pelo nome, e adicionar o método
Show.
Agora os controle de navegação. Esse serão bem simples, basta selecionar a planilha que deseja exibir.
Pra finalizar, os controle do sistema. As ações Salvar e Fechar, já são eventos disponível no objeto
Workbook, portanto podemos utilizar o objeto ThisWorkbook e chamar os métodos.
Código Completo
Option Explicit
' #########################################################
'
' MÓDULO FAIXA DE OPÇÕES
'
' Descrição: Módulo contendo métodos dos eventos
' dos controles da faixa de opções personalizada
' no projeto
' Desenvolvedor: Claudio Fernando Scatolin
' Data: 01/02/2020
'
' #########################################################
End Sub
Review
Pronto, nosso projeto está finalizado, vamos olhar as telas.
Assinatura Digital
No Windows Explorer, localize e clique duas vezes no arquivo SelfCert.exe em C:\Program Files
(x86)\Microsoft Office\OfficeXX.
Observação: Caso você não encontre o item Ferramentas do Microsoft Office 2016 ou o Certificado
Digital para Projetos de VBA, é porque ele não foi instalado. Neste caso, é necessário refazer a
instalação do Office 2016 e, desta vez, ativar o Certificado Digital.
Selecione Assinatura digital para projetos do VBA, clique na seta ao lado da seleção e selecione Executar
a partir de Meu computador.
Digite seu nome ou suas iniciais e clique o botão OK para finalizar. O Excel emitirá uma mensagem
informando que o certificado foi criado com êxito.
Certifique-se de que tenha no mínimo um certificado digital antes de tentar assinar um projeto de
macro
• Abra a pasta de trabalho ou o modelo que contém o projeto de macro que você deseja assinar.
• Na guia Desenvolvedor, clique no botão Visual Basic para exibir a janela do VBA.
Observação: Como um certificado digital que você cria sozinho não é emitido por uma autoridade formal de
certificação, projetos de macros que são assinados usando esse certificado são denominados projetos de auto-
assinatura. Dependendo de como sua empresa usa os recursos de assinatura digital no Microsoft Office, talvez
você seja impedido de usar esse tipo de certificado e talvez outros usuários não consigam executar macros de
auto-assinatura por razões de segurança.
Arquivos que contem macros, trazem um certo transtorno ao usuário e uma preocupação extra ao
desenvolvedor. Ao usuário porque o mesmo sempre será questionado se deseja executar/habilitar as
macros do sistema. Ao desenvolvedor porque, se o usuário, não habilitar a execução das macros, o
sistema falhará. Pois nenhum código será executado.
Sendo assim, o ideal seria que as macros fossem executadas automaticamente sem questionar o
usuário. Independente do nível de segurança configurado. Janela do Excel, na guia DESENVOLVEDOR
Código Segurança de Macro.
Abra a pasta de trabalho ou carregue o programa suplementar que contém macros da fonte que você
deseja adicionar à lista.
Na caixa de diálogo Aviso de segurança, marque a caixa de seleção Sempre confiar em macros dessa
fonte.
Observação Se a caixa de diálogo Aviso de segurança não exibir a caixa de seleção Sempre confiar em
macros dessa fonte, isso significa que as macros não são digitalmente assinadas. Sem uma assinatura
digital, você não pode adicionar esse desenvolvedor de macros à lista de fontes confiáveis.
Observação Você pode desabilitar apenas macros escritas em Visual Basic for Applications. As macros
do Microsoft Excel versão 4.0 não são afetadas pela configuração de nível de segurança.
Um bom desenvolvedor, deve aprender sobre como níveis de segurança e assinaturas digitais
funcionam em conjunto. No entanto, o assunto foge ao escopo deste curso.
Códigos extras
O procedimento abaixo usa a função NumSerie para exibir o número de série do drive C: da máquina
onde ele estiver sendo executado.
Sub MostrNumSerie()
MsgBox NumSerie("C:")
End Sub
O procedimento abaixo salva o documento ativo com um nome contido na célula A1.
Sub SaveAsA1()
ActiveWorkbook.SaveAs Filename:=Range("A1").Value
End Sub
O procedimento abaixo congela a faixa A1:A5. Ou seja, o usuário só terá acesso neste intervalo.
Sub CongelaArea()
With Worksheets("Plan3")
.Activate 'ativa a Plan3
.ScrollArea = "A1:E5" 'determina a área de scroll
End With
With Range("A1:E5")
.Interior.ColorIndex = 19 'define a cor marfim
.BorderAround xlContinuous, xlMedium 'define a borda externa
'define as bordas internas
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
.Borders(xlInsideVertical).LineStyle = xlContinuous
End With
[A1].Select 'seleciona a célula A1
End Sub
' DESAFIO 1
Public Function nomeCompleto(nome As String, sobrenome As String) As String
Dim completo As String
nomeCompleto = completo
End Function
' DESAFIO 2
Public Function MensagemNome(nome As String, sobrenome As String) As String
Dim nomeCompleto As String
Dim mensagem As String
MensagemNome = mensagem
End Function
' DESAFIO 3
Public Sub TrocarNomes()
Dim nome1 As String
Dim nome2 As String
Dim nomeTemp As String
' Retornando
MsgBox "Primeiro nome: " & nome1 & Chr(10) & _
"Segundo nome: " & nome2
End Sub
' DESAFIO 4
hora = Hour(tempo)
minuto = Minute(tempo)
segundo = Second(tempo)
Apêndice 1
Glossário
Fone: 4121-6166 Reprodução Proibida Pag.: 275
VBA para Excel
Glossário
Aplicativo host
Qualquer aplicativo que dá suporte ao uso do Visual Basic for Applications; por exemplo, o Microsoft Excel, o
Microsoft Project e assim por diante.
Argumento
Assinatura digital
Um carimbo digital de identificação em uma macro que confirma que a fonte da macro é o desenvolvedor que a
assinou e que a macro não foi alterada. Para assinar digitalmente projetos de macro e identificá-los como seus, é
necessário obter e instalar um certificado digital. Quando você abre um arquivo ou carrega um suplemento que
contém uma macro assinada digitalmente, é exibida uma assinatura digital no computador como um certificado
que identifica a fonte da macro, além de fornecer informações adicionais sobre a identidade e integridade dessa
fonte.
Classe
A definição formal de um objeto. A classe atua como o modelo a partir do qual uma ocorrência de um objeto é
criada durante o tempo de execução. A classe define as propriedades do objeto e os métodos utilizados para
controlar o comportamento do objeto.
Constante
Um item nomeado que mantém um valor constante por toda a execução de um programa. Uma constante pode
ser uma literal de sequência de caracteres ou numérica, uma outra constante ou qualquer combinação que inclua
operadores aritméticos ou lógicos, exceto Is e exponenciação. Cada aplicativo host pode definir seu próprio
conjunto de constantes. Constantes adicionais podem ser definidas pelo usuário com a instrução Const. Você pode
utilizar constantes em qualquer lugar do seu código em vez de valores reais.
Uma biblioteca de rotinas carregada e vinculada em aplicativos durante o tempo de execução. As DLLs são criadas
com outras linguagens de programação como o C, MASM ou FORTRAN.
Um erro que ocorre quando o código está sendo executado. Ocorre um erro em tempo de execução quando uma
instrução tenta uma operação inválida.
Escopo
Define a visibilidade de uma variável, um procedimento ou objeto. Por exemplo, uma variável declarada como
Public é visível a todos os procedimentos de todos os módulos em um projeto de referência direta, a menos que o
Option Private Module esteja ativo. Quando Option Private Module está ativo, o próprio módulo é privado e
portanto não está visível a projetos de referência. As variáveis declaradas em um procedimento são visíveis
somente dentro do procedimento e perdem seu valor entre chamadas, a menos que sejam declaradas Static.
Fórmula matricial
Executa cálculos múltiplos e, em seguida, produz um único resultado ou resultados múltiplos. Fórmulas matriciais
agem sobre um ou mais conjuntos de valores conhecidos como argumentos de matriz. Cada argumento de matriz
deve ser retangular e cada argumento precisa ter o mesmo número de linhas e/ou o mesmo número de colunas
que os outros argumentos. Para produzir resultados múltiplos, a fórmula deve ser inserida em células múltiplas.
Para inserir uma fórmula matricial, pressione CTRL+SHIFT+ENTER. O Microsoft Excel coloca fórmulas matriciais
entre chaves ( { } ).
Instrução
Uma unidade sintaticamente completa que expressa um tipo de ação, declaração ou definição. Uma instrução
geralmente ocupa uma única linha, ainda que você possa utilizar dois-pontos (:) para incluir mais de uma instrução
em uma linha. Você também pode utilizar um caractere de continuação de linha (_) para continuar uma única linha
lógica em uma segunda linha física.
Método
Código de programa que fica incorporado à definição de um objeto, o qual define de que modo o objeto irá atuar
sobre as informações e responder a certos eventos. Por exemplo, os objetos bancos de dados têm métodos que
abrem recordsets e deslocam itens de registro para outro.
Módulo
módulo de classe
Um módulo que contém a definição de uma classe, incluindo suas definições de propriedade e método.
Número de linha
Utilizado para identificar uma única linha de código. Um número de linha pode ser qualquer combinação de dígitos
que seja exclusiva dentro do módulo no qual é utilizado. Os números de linha devem iniciar na primeira coluna.
Módulo de formulário
Um arquivo de um projeto do Visual Basic, com extensão de nome de arquivo .frm, que pode conter descrições
gráficas de um formulário, seus controles e suas definições de propriedade; declarações ao nível de formulário de
constantes, variáveis e procedimentos externos, e procedimentos gerais e de evento.
Módulo Padrão
Um módulo que contém somente declarações e definições de procedimento, tipo e dados. As declarações e
definições em nível de módulo em um módulo padrão são Public por padrão. Um módulo padrão é chamado de
módulo de código em versões anteriores do Visual Basic.
Objeto
Uma combinação de código e dados que podem ser tratados como uma unidade; por exemplo, um controle,
formulário ou componente de aplicativo. Cada objeto é definido por uma classe.
Um elemento básico de um programa, que contém propriedades para descrever suas características e métodos
para definir suas tarefas, e que é capaz de reconhecer eventos aos quais pode responder. Os controles e os
formulários são exemplos de objetos usados no VBA.
Procedimento
Uma sequência nomeada de instruções executadas como uma unidade. Por exemplo, Function, Property e Sub
são tipos de procedimentos. Um nome de procedimento é sempre definido ao nível de módulo. Todo código
executável deve estar contido em um procedimento. Procedimentos não podem ser aninhados dentro de outros
procedimentos.
Procedimento Function
Um procedimento que executa uma tarefa específica dentro de um programa e retorna um valor. Um
procedimento Function começa com uma instrução Function e termina com uma instrução End Function.
Procedimento Sub
Um procedimento que executa uma tarefa específica dentro de um programa, mas não retorna um valor explícito.
Um procedimento Sub começa com uma instrução Sub e termina com uma instrução End Sub.
Projeto
Um conjunto de módulos.
projeto de macro
Um conjunto de componentes, que inclui formas, código e módulos de classe que constituem uma macro. Os
projetos de macro criados no Microsoft Visual Basic for Applications podem ser incluídos em suplementos,
documentos e modelos do Microsoft Word, apresentações e modelos de apresentação do Microsoft PowerPoint,
pastas de trabalho e modelos do Microsoft Excel e bancos de dados do Microsoft Access.
Propriedades
São as características de um objeto, tais como o tamanho, a posição, a cor ou a fonte do texto. As propriedades
determinam a aparência e, algumas vezes, o comportamento de um objeto. As propriedades também são usadas
para fornecer dados a um objeto e obter informações do objeto.
Rótulo de linha
Utilizado para identificar uma única linha de código. Um rótulo de linha pode ser qualquer combinação de
caracteres que inicie com uma letra e termine com dois-pontos (:). Os rótulos de linha não diferenciam maiúsculas
de minúsculas e devem iniciar na primeira coluna.
Tempo de compilação
Qualquer tipo de dados definido utilizando-se a instrução Type. Os tipos de dados definidos pelo usuário podem
conter um ou mais elementos de qualquer tipo de dados. As matrizes de tipos de dados definidos pelo usuário e
de outros tipos de dados são criadas utilizando-se a instrução Dim. Matrizes de qualquer tipo podem ser incluídas
nos tipos definidos pelo usuário.
Variável
Um local de armazenamento nomeado que pode conter dados, os quais podem ser modificados durante a
execução do programa. Cada variável possui um nome que a identifica com exclusividade dentro de seu escopo.
Um tipo de dados pode ser ou não especificado.
Os nomes de variável devem começar com um caractere alfabético, devem ser exclusivos dentro do mesmo
escopo, não podem ter mais de 255 caracteres e também não podem conter um ponto ou caractere de declaração
de tipo incorporado.
Apêndice 2
Propriedades do
Objeto
Application
Definições e opções para o aplicativo como um todo (muitas das opções da caixa de diálogo Opções
(menu Ferramentas), por exemplo).
Métodos que retornem objetos do nível mais alto, como ActiveCell, ActiveSheet e assim por diante.
Use a propriedade Application para retornar o objeto Application. O exemplo seguinte aplica a
propriedade Windows ao objeto Application.
Application.Windows("book1.xls").Activate
O exemplo a seguir cria um objeto de pasta de trabalho do Microsoft Excel em um outro aplicativo e, em
seguida, abre a pasta de trabalho no Microsoft Excel.
Set xl = CreateObject("Excel.Sheet")
xl.Application.Workbooks.Open "newbook.xls"
Comentários
Muitas das propriedades e métodos que retornam os objetos mais comuns da interface do usuário,
como a célula ativa (propriedade ActiveCell), podem ser usados sem o qualificador de objeto
Application. Por exemplo, em vez de escrever:
Application.ActiveCell.Font.Bold = True
ActiveCell.Font.Bold = True.
Propriedade ActiveCell
Retorna um objeto Range que representa a célula ativa na janela ativa (a janela visível) ou na janela
especificada. Se a janela não estiver exibindo uma planilha, esta propriedade falhará. Somente leitura.
Sintaxe: expressão.ActiveCell
Comentários
Quando você não especifica um qualificador de objeto, essa propriedade retorna a célula ativa na janela
ativa. Tenha cuidado ao distinguir entre célula ativa e seleção. A célula ativa é uma única célula dentro
da seleção atual. A seleção pode conter mais de uma célula, mas somente uma é a célula ativa.
Application.ActiveCell
ActiveWindow.ActiveCell
Application.ActiveWindow.ActiveCell
Exemplo
Este exemplo usa uma caixa de mensagem para exibir o valor da célula ativa. Como a propriedade
ActiveCell falha se a planilha ativa não for uma planilha de trabalho, o exemplo ativa Sheet1 antes de
usar a propriedade ActiveCell.
Worksheets("Plan1").Activate
MsgBox ActiveCell.Value
With ActiveCell.Font
.Bold = True
.Italic = True
End With
Propriedade ActiveWindow
Retorna um objeto Window representando a janela ativa (a janela visível). Somente leitura. Retorna
Nothing se nenhuma janela estiver aberta.
Sintaxe expressão.ActiveWindow
Exemplo
Propriedade Caption
Retorna ou define um valor String que representa o nome que aparece na barra de título da janela
principal do Microsoft Excel.
Sintaxe expressão.Caption
Comentários
Se você não definir um nome ou se definir o nome como Empty, esta propriedade retornará "Microsoft
Excel".
Exemplo
Este exemplo define um nome personalizado para aparecer na barra de título da janela principal do
Microsoft Excel.
Propriedade CutCopyMode
Retorna ou define o status do modo Recortar ou Copiar. Pode ser True, False ou uma constante
XLCutCopyMode, conforme exibido nas seguintes tabelas. Long de leitura/gravação
Sintaxe expressão.CutCopyMode
Exemplo
Este exemplo usa uma caixa de mensagem para exibir o status do modo Recortar ou Copiar.
Select Case Application.CutCopyMode
Case Is = False
Case Is = xlCopy
Case Is = xlCut
End Select
Propriedade DataEntryMode
Retorna ou define o modo Entrada de Dados, como mostrado na tabela seguinte. Quando em modo
Entrada de Dados, você só pode inserir dados nas células não protegidas do intervalo atualmente
selecionado.
Valor Significado
If (Application.DataEntryMode = xlOn) Or _
Application.DataEntryMode = xlOff
End If
Propriedade Dialogs
Retorna uma coleção Dialogs representando todas as caixas de diálogo internas. Somente leitura.
Sintaxe expressão.Dialogs
Exemplo
Propriedade DisplayAlerts
True se o Microsoft Excel exibir determinados alertas e mensagens enquanto uma macro está em
execução. Boolean de leitura/gravação
Sintaxe expressão.DisplayAlerts
Comentários
O valor padrão é True. Defina essa propriedade como False para suprimir solicitações e mensagens de
alertas enquanto uma macro está em execução; quando uma mensagem exige uma resposta, o
Microsoft Excel escolhe a reposta padrão.
Se você definir essa propriedade como False, o Microsoft Excel a definirá como True quando o código
for concluído, a menos que você esteja executando código de processo cruzado.
Observação: Ao usar o método SaveAs de pastas de trabalho para substituir um arquivo existente, a
caixa de diálogo Confirmar salvar como terá como padrão Não, enquanto a resposta Sim é selecionada
pelo Excel quando a propriedade DisplayAlerts está definida como False. A resposta Sim substitui o
arquivo existente.
Ao usar o método SaveAs de pastas de trabalho para salvar uma pasta de trabalho contendo um projeto
do Visual Basic for Applications (VBA) no formato de arquivo do Excel 5.0/95, a caixa de diálogo
Microsoft Excel terá como padrão Sim, enquanto a resposta Cancelar é selecionada pelo Excel quando a
propriedade DisplayAlerts está definida como False. Você não pode salvar uma pasta de trabalho que
contenha um projeto do VBA usando o formato de arquivo do Excel 5.0/95.
Exemplo
Esse exemplo fecha a pasta de trabalho Book1.xls e não solicita ao usuário que salve alterações. As
alterações feitas em Book1.xls não são salvas.
Application.DisplayAlerts = False
Workbooks("BOOK1.XLS").Close
Application.DisplayAlerts = True
Esse exemplo suprime a mensagem que, de outra forma, aparece quando você inicia um canal DDE para
um aplicativo que não está sendo executado.
Application.DisplayAlerts = False
channelNumber = Application.DDEInitiate( _
app:="WinWord", _
topic:="C:\WINWORD\FORMLETR.DOC")
Application.DisplayAlerts = True
Application.DDETerminate channelNumber
Application.DisplayAlerts = True
Propriedade DisplayStatusBar
Sintaxe expressão.DisplayStatusBar
Exemplo
Este exemplo salva o estado atual da propriedade DisplayStatusBar e define a propriedade como True
de modo que a barra de status fique visível.
saveStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Propriedade EnableCancelKey
Controla como o Microsoft Excel trata interrupções do usuário causadas por CTRL+BREAK (ou ESC ou
COMANDO+PONTO) no procedimento sendo executado. Leitura/gravação XlEnableCancelKey.
Sintaxe expressão.EnableCancelKey
Comentários
Use essa propriedade com muito cuidado. Se você usar xlDisabled, não haverá maneira de interromper
um loop de fuga ou outro código que não para automaticamente. Da mesma forma, se você usar
xlErrorHandler, mas seu manipulador de erros sempre voltar a usar a declaração Resume, não haverá
uma maneira de parar o código de fuga.
Exemplo
Este exemplo mostra como você pode usar a propriedade EnableCancelKey para configurar um
tratamento personalizado de cancelamento.
handleCancel:
If Err = 18 Then
MsgBox "You cancelled"
End If
Propriedade EnableEvents
Sintaxe expressão.EnableEvents
Exemplo
Este exemplo desativa eventos antes de um arquivo ser salvo de forma que o evento BeforeSave não
ocorre.
Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True
Propriedade OnWindow
Retorna ou define o nome do procedimento executado sempre que você ativa uma janela. String de
leitura/gravação.
Sintaxe expressão.OnWindow
Comentários
O procedimento especificado por esta propriedade não é executado quando outros procedimentos
alternam para a janela ou quando um comando para alternar para uma janela é recebido através de um
canal DDE. Em vez disso, o procedimento responde às ações do usuário, como clicar em uma janela com
o mouse.
Se uma planilha ou uma folha de macro tiver uma macro Ativar_auto ou Desativar_auto definida, essas
macros serão executadas após o procedimento especificado pela propriedade OnWindow.
Propriedade Path
Retorna um valor String que representa o caminho completo para o aplicativo, excluindo o separador
final e o nome do aplicativo.
Sintaxe expressão.Path
Exemplo
End Sub
Propriedade ScreenUpdating
Sintaxe expressão.ScreenUpdating
Comentários
Desative a atualização da tela para acelerar o código da macro. Você não poderá ver o que a macro está
fazendo, mas ela será executada mais rapidamente.
Não se esqueça de definir a propriedade ScreenUpdating novamente como True quando a macro
terminar.
Exemplo
Este exemplo demonstra como a desativação da atualização da tela pode acelerar a execução do código.
O exemplo oculta as colunas de Sheet1 alternativamente enquanto mantém registro do tempo que leva
para isso. Na primeira vez em que o exemplo oculta as colunas, a atualização da tela está ativada; na
segunda vez, a atualização da tela está desativada. Ao executar este exemplo, você pode comparar os
respectivos tempos de execução, que são exibidos na caixa de mensagem.
Dim elapsedTime(2)
Application.ScreenUpdating = True
For i = 1 To 2
startTime = Time
Worksheets("Sheet1").Activate
c.Hidden = True
End If
Next c
stopTime = Time
Next i
Application.ScreenUpdating = True
MsgBox "Elapsed time, screen updating on: " & elapsedTime(1) & _
" sec." & Chr(13) & "Elapsed time, screen updating off: " & _
elapsedTime(2) & " sec."
Propriedade ThisWorkbook
Retorna um objeto Workbook que representa a pasta de trabalho na qual o código da macro atual está
em execução. Somente leitura.
Sintaxe expressão.ThisWorkbook
Comentários
Use essa propriedade para se referir à pasta de trabalho que contém o código da macro.
A propriedade Workbooks pode falhar, pois é provável que o nome da pasta de trabalho tenha sido
alterado quando você criou o suplemento. ThisWorkbook sempre retorna a pasta de trabalho na qual o
código está em execução.
Por exemplo, use um código como o seguinte para ativar uma folha de caixa de diálogo armazenada na
sua pasta de trabalho do suplemento:
ThisWorkbook.DialogSheets(1).Show
Essa propriedade só pode ser usada de dentro do Microsoft Excel. Você não pode usá-la para acessar
uma pasta de trabalho a partir de um outro aplicativo.
Exemplo
Este exemplo fecha a pasta de trabalho que contém o código de exemplo. As alterações na pasta de
trabalho, caso existam, não são salvas.
ThisWorkbook.Close SaveChanges:=False
Propriedade WindowState
Sintaxe expressão.WindowState
Exemplo
Este exemplo expande a janela ativa até o tamanho máximo disponível (supondo que a janela não esteja
maximizada).
With ActiveWindow
.WindowState = xlNormal
.Top = 1
.Left = 1
.Height = Application.UsableHeight
.Width = Application.UsableWidth
End With
Apêndice 3
Métodos
do Objeto
Application
Por exemplo, Add é um método do objeto Workbooks, pois adiciona uma nova pasta.
Método Calculate
Calcula todas as pastas de trabalho abertas, uma planilha específica em uma pasta de trabalho ou um
intervalo especificado de células em uma planilha, como mostra a tabela a seguir.
Sintaxe expressão.Calculate
Comentários
Exemplo
Método GetOpenFilename
Exibe a caixa de diálogo Abrir padrão e obtém um nome de arquivo do usuário sem realmente abrir
nenhum arquivo.
Sintaxe
Parâmetros
Obrigatório Tipo de
Nome Descrição
Opcional dados
Comentários
Esta sequência passou no argumento FileFilter que consiste de pares de sequências de filtros de arquivo
seguidos pela especificação de filtro de arquivo curinga do MS-DOS, com cada parte e cada par separado
por vírgulas. Cada par separado está listado na caixa de listagem suspensa
Arquivos do tipo.
Por exemplo, a seguinte sequência especifica dois filtros de arquivo — texto e suplemento: "Arquivos de
texto (*.txt),*.txt,Arquivos de suplemento (*.xla),*.xla".
Para usar múltiplas expressões curinga do MS-DOS para um tipo de filtro de arquivo simples, separe as
expressões curinga com ponto-e-vírgula; por exemplo, "Arquivos do Visual Basic (*.bas;
*.txt),*.bas;*.txt".
Se FileFilter for omitido, este argumento ficará padrão como "Todos os arquivos (*.*),*.*".
Este método retorna o nome do arquivo selecionado ou o nome inserido pelo usuário. O nome
retornado pode incluir uma especificação de caminho. Se MultiSelect for True, o valor de retorno será
uma matriz dos nomes de arquivo selecionados (mesmo se apenas um nome de arquivo for
selecionado). Retorna False se o usuário cancelar a caixa de diálogo.
Exemplo
Este exemplo exibe a caixa de diálogo Open, com o filtro de arquivo definido para arquivos de texto. Se
o usuário escolher um nome de arquivo, o código exibirá esse nome de arquivo em uma caixa de
mensagens.
fileToOpen = Application _
End If
Método MacroOptions
Corresponde às opções da caixa de diálogo Opções de Macro. Você também pode usar esse método
para exibir uma função definida pelo usuário em uma categoria nova ou interna na caixa de diálogo
Inserir Função.
Sintaxe
Parâmetros
Nome Descrição
True para atribuir uma tecla de atalho à macro (ShortcutKey também deve ser especificado). Se esse
argumento for False, nenhuma tecla de atalho será atribuída à macro. Se a macro já possuir uma
HasShortcutKey
tecla de atalho, a configuração desse argumento como False removerá a tecla de atalho. O valor
padrão é False.
ShortcutKey Necessário se HasShortcutKey for True e ignorado caso contrário. A tecla de atalho.
Um inteiro que especifica a categoria da função de uma macro existente (Financeira, Data & Hora ou
Definida pelo Usuário, por exemplo). Consulte a seção Comentários para determinar quais inteiros
Category são mapeados para as categorias internas. Você também pode especificar uma cadeia de caracteres
para uma categoria personalizada. Se você fornecer uma cadeia de caracteres, ela será tratada como
o nome da categoria exibida na caixa de diálogo Inserir Função. Se o nome da categoria nunca foi
usado, será definida uma nova categoria com esse nome. Se você usar um nome de categoria que
seja o mesmo do nome interno (consulte a lista na seção Comentários), o Microsoft Excel mapeará a
função definida pelo usuário para essa categoria interna.
HelpContextID Um número inteiro especificando a identificação de contexto do tópico da Ajuda atribuído à macro.
HelpFile O nome do arquivo de ajuda que contém o tópico da Ajuda definido por HelpContextId.
As descrições dos argumentos de um UDF que são exibidas na caixa de diálogo Argumentos da
ArgumentDescriptions
Função.
Comentários
A tabela a seguir lista os inteiros mapeados para as categorias internas que podem ser usados no
parâmetro Category.
1 Financeira 9 Informação
8 Lógica
Exemplo
Este exemplo adiciona uma macro definida pelo usuário, denominada "TestMacro", a uma categoria
personalizada, denominada "My Custom Category". Após executar este exemplo, você deverá ver "My
Custom Category", que contém a função "TestMacro" definida pelo usuário, na lista suspensa Ou
selecione uma categoria da caixa de diálogo Inserir Função.
Function TestMacro()
MsgBox ActiveWorkbook.Name
End Function
Sub AddUDFToCustomCategory()
Application.MacroOptions Macro:="TestMacro", Category:="My Custom Category"
End Sub
Pag.: 298 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Método OnKey
Parâmetros
Obrigatório Tipo de
Nome Descrição
Opcional dados
Tecla Obrigatório Sequência Uma sequência de caracteres indicando a tecla a ser pressionada.
Comentários
O argumento Key pode especificar qualquer tecla combinada com ALT, CTRL ou SHIFT, ou qualquer
combinação dessas teclas. Cada tecla é representada por um ou mais caracteres, tais como "a" para o
caractere a, ou "{ENTER}" para a tecla ENTER.
Para especificar caracteres que não são exibidos quando você pressiona a tecla correspondente (ENTER
ou TAB, por exemplo), use os códigos listados na tabela seguinte. Cada código da tabela representa uma
tecla no teclado.
HOME {HOME}
Você também pode especificar teclas combinadas com SHIFT e/ou CTRL e/ou ALT. Para especificar uma
tecla combinada com uma outra tecla ou teclas, use a tabela seguinte.
CTRL ^ (circunflexo)
Para atribuir um procedimento a um dos caracteres especiais (+, ^, % e assim por diante), coloque o
caractere entre chaves. Para obter detalhes, consulte o exemplo.
Exemplo
Método Quit
Sintaxe expressão.Quit
Comentários
Se houver pastas de trabalho abertas que não tenham sido salvas quando você usar esse método, o
Microsoft Excel exibirá uma caixa de diálogo perguntando se você deseja salvar as alterações. É possível
impedir isso salvando todas as pastas de trabalho antes de usar o método Quit ou configurando a
propriedade DisplayAlerts como False. Quando essa propriedade é False, o Microsoft Excel não exibe a
caixa de diálogo ao sair das pastas de trabalho não salvas; ele as fecha sem salvá-las.
Se você definir a propriedade Saved para uma pasta de trabalho como True sem salvá-la no disco, o
Microsoft Excel irá sair sem pedir que você salve a pasta de trabalho.
Exemplo
Este exemplo salva todas as pastas de trabalho abertas e encerra o Microsoft Excel.
w.Save
Next w
Application.Quit
Método SendKeys
Parâmetros
Obrigatório Tipo de
Nome Descrição
Opcional dados
Comentários
Este método coloca os pressionamentos de teclas em uma memória intermediária de teclas. Em alguns
casos, você precisa chamar esse método antes de chamar o método que irá usar os pressionamentos de
teclas. Por exemplo, para enviar uma senha para uma caixa de diálogo você precisa chamar o método
SendKeys antes de exibir a caixa de diálogo.
O argumento Keys pode especificar qualquer tecla única ou qualquer tecla combinada com ALT, CTRL ou
SHIFT (ou qualquer combinação dessas teclas). Cada tecla é representada por um ou mais caracteres,
tais como "a" para o caractere a, ou "{ENTER}" para a tecla ENTER.
Para especificar caracteres que não são exibidos quando você pressiona a tecla correspondente (por
exemplo, ENTER ou TAB), use os códigos listados na tabela seguinte. Cada código da tabela representa
uma tecla no teclado.
HOME {HOME}
Você também pode especificar teclas combinadas com SHIFT e/ou CTRL e/ou ALT. Para especificar uma
tecla combinada com uma outra tecla ou teclas, use a tabela seguinte.
CTRL ^ (circunflexo)
Exemplo
Método Volatile
Marca uma função definida pelo usuário como volátil. Uma função volátil precisa ser recalculada sempre
que ocorrem cálculos em qualquer célula da planilha. Um função não volátil só é recalculada quando as
variáveis de entrada são alteradas. Este método não tem efeito quando não está dentro de uma função
definida pelo usuário usada para calcular uma célula de pasta de trabalho.
Sintaxe expressão.Volatile(Volatile)
Parâmetros
Obrigatório Tipo de
Nome Descrição
Opcional dados
Exemplo
Este exemplo marca como volátil a função definida pelo usuário "My_Func". A função será recalculada
sempre que ocorrer um cálculo em quaisquer células da planilha nas quais a função apareça.
Function My_Func()
Application.Volatile
'
'
End Function
Método Wait
Pausa uma macro em execução até um momento especificado. Retorna True se o momento
especificado chegou.
Sintaxe expressão.Wait(Time)
Parâmetros
Obrigatório Tipo de
Nome Descrição
Opcional dados
Comentários
O método Wait suspende toda a atividade do Microsoft Excel, podendo evitar que você efetue outras
operações em seu computador enquanto Wait está em efeito. Entretanto, os processos em segundo
plano, como impressão e recálculo, continuam.
Exemplo
newMinute = Minute(Now())
newSecond = Second(Now()) + 10
Application.Wait waitTime
End If
Apêndice 4
Propriedades do
Objeto
Workbooks
Para definir o valor de uma propriedade, coloque, após a referência a um objeto, um ponto, o nome da
propriedade, um sinal de igualdade (=) e o novo valor da propriedade.
Propriedade FullName
Retorna o nome do objeto, incluindo seu caminho no disco, na forma de uma sequência. Essa
propriedade é equivalente à propriedade Path, seguida pelo atual separador do sistema de arquivos, e
seguida pela propriedade Name.
'Exibe o caminho e o nome de arquivo de cada suplemento.
MsgBox a.FullName
Next a
MsgBox Workbooks(1).FullName
'ActiveWorkbook.FullName ou Workbooks("Lixo.xls").FullName
Propriedade Name
ActiveCell = Workbook(1).Name
Propriedade ProtectStructure
True se a ordem das planilhas na pasta de trabalho estiver protegida. Boolean de somente leitura.
Pag.: 308 Reprodução
Proibida Fone: 4121-6166
VBA para Excel
Sintaxe expressão.ProtectStructure
Exemplo
Este exemplo exibirá uma mensagem se a ordem das planilhas na pasta de trabalho ativa estiver
protegida.
If ActiveWorkbook.ProtectStructure = True Then
Chr(13) & _
End If
Propriedade Saved
True se nenhuma alteração tiver sido feita à pasta de trabalho especificada desde a última vez em que
foi salva. Boolean de leitura e gravação.
Você pode definir essa propriedade como True se desejar fechar uma pasta de trabalho modificada sem
ter que salvá-la ou ser avisado para salvá-la.
'Exibe uma mensagem se a pasta de trabalho ativa
End If
Propriedade Sheets
Objeto Application: Retorna uma coleção Sheets representando todas as planilhas na pasta de trabalho
ativa. Somente leitura.
Objeto Workbook: Retorna uma coleção Sheets representando todas as planilhas na pasta de trabalho
especificada. Somente leitura.
For i = 1 To Sheets.Count
Next i
Apêndice 5
Métodos do
Objeto Workbook
Método Activate
Ativa a primeira janela associada à pasta de trabalho. Isso não causa a execução de nenhuma macro
Ativar_auto ou Desativar_auto que possa estar anexada à pasta de trabalho (use o método
RunAutoMacros para executar essas macros).
Worksheets("Plan1").Activate 'ativa Plan1.
Worksheets("Plan1").Activate
Range("A1:C3").Select
Range("B2").Activate
Workbooks("Pasta4.XLS").Activate
Método Add
Cria uma nova pasta de trabalho, que se tornará a pasta de trabalho ativa.
Sintaxe expressão.Add(Template)
Parâmetros
Obrigatório Tipo de
Nome Descrição
Opcional dados
Determina como a nova pasta de trabalho será criada. Se este argumento for
uma cadeia de caracteres especificando o nome de um arquivo do Microsoft
Excel existente, a nova pasta de trabalho será criada com o arquivo
especificado como modelo. Se esse argumento for uma constante, a nova
pasta de trabalho conterá uma única planilha do tipo especificado. Pode ser
Template Opcional Variant
uma destas constantes XlWBATemplate: xlWBATChart,
xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet ou
xlWBATWorksheet. Se esse argumento for omitido, o Microsoft Excel criará
uma nova pasta de trabalho com algumas planilhas em branco (o número de
planilhas é definido pela propriedade SheetsInNewWorkbook).
Comentários: Quando o argumento Template especifica um arquivo, o nome do arquivo pode incluir
um caminho.
'cria uma nova pasta de trabalho.
Workbooks.Add
Método Close
Fecha o objeto.
Sintaxe 1 expressão.Close
expressão Obrigatória.
Valor Ação
True Salva as alterações na pasta de trabalho. Se ainda não houver um nome de arquivo
associado à pasta de trabalho, FileName será usado. Se FileName for omitido, o usuário
será solicitado a fornecer um nome de arquivo.
Omitido Exibe uma caixa de diálogo perguntando ao usuário se as alterações devem ser salvas.
FileName Variant opcional. As alterações são salvas sob este nome de arquivo.
RouteWorkbook Variant opcional. Se a pasta de trabalho não precisar ser encaminhada para o próximo
destinatário (se não tiver lista de circulação ou se já tiver sido encaminhada), este argumento será
ignorado. Caso contrário, o Microsoft Excel encaminhará a pasta de trabalho como mostrado na tabela
seguinte.
Valor Significado
Omitido Exibe uma caixa de diálogo perguntando ao usuário se a pasta de trabalho deve ser
enviada.
O fechamento de uma pasta de trabalho a partir do Visual Basic não causa a execução de macros
Auto_Fechar da pasta de trabalho. Use o método RunAutoMacros para executar as macros de
fechamento automático.
'Fecha Pasta1.xls e descarta quaisquer alterações
Workbooks("Pasta1.XLS").Close SaveChanges:=False
Fecha todas as pastas de trabalho abertas. Se houver alterações em alguma pasta de trabalho aberta, o
Microsoft Excel exibirá os avisos e caixas de diálogo apropriadas para salvamento das alterações.
Workbooks.Close
Método Open
Abre uma pasta de trabalho. Se a pasta de trabalho sendo aberta tiver quaisquer macros Auto_Open,
estas não serão executadas quando você abrir o arquivo a partir do Visual Basic. Se você desejar
executar a macro Auto_Open, você deverá usar o método RunAutoMacros.
Parâmetros
Todos os argumentos são do tipo Variant e Opcionais. Com exceção do nome CorruptLoad cujo tipo de
dado é XlCorruptLoad.
Nome Descrição
Especifica o modo pelo qual são atualizadas as referências externas (vínculos) no arquivo,
como a referência a um intervalo na pasta de trabalho Orçamento.xls nesta fórmula:
=SOMA([Orçamento.xls]Anual!C10:C25). Se esse argumento for omitido, o usuário será
solicitado a especificar como será feita a atualização dos vínculos. Para obter mais
UpdateLinks
informações sobre os valores usados por este parâmetro, consulte a seção Comentários.
Se o Microsoft Excel estiver abrindo um arquivo no formato WKS, WK1 ou WK3 e o
argumento UpdateLinks for 0, nenhum gráfico será criado; caso contrário, o Microsoft
Excel gerará gráficos a partir dos gráficos anexados ao arquivo.
Uma cadeia de caracteres que contém a senha Obrigatória para abrir uma pasta de
Password trabalho protegida. Se este argumento for omitido e a pasta de trabalho exigir uma
senha, o usuário será solicitado a fornecê-la.
Uma cadeia de caracteres que contém a senha Obrigatória para gravar em uma pasta de
WriteResPassword trabalho de gravação reservada. Se este argumento for omitido e a pasta de trabalho
exigir uma senha, o usuário será solicitado a fornecê-la.
True para que o Microsoft Excel não exiba a mensagem de recomendação somente
IgnoreReadOnlyRecommended leitura (se a pasta de trabalho tiver sido salva com a opção Recomendável Somente
Leitura).
Se o arquivo for um arquivo de texto, este argumento indicará qual a sua origem (para
que as páginas de código e o retorno de carro/alimentação de linha (CR/LF) possam ser
Origin mapeados corretamente). Pode ser uma destas constantes XlPlatform: xlMacintosh,
xlWindows ou xlMSDOS. Se esse argumento for omitido, o sistema operacional atual será
usado.
Nome Descrição
Se o arquivo for um arquivo de texto e o argumento Format for 6, este argumento será
uma cadeia de caracteres que especificará o caractere a ser usado como delimitador. Por
Delimiter
exemplo, use Chr(9) para tabulações, use "," para vírgulas, use ";" para ponto-e-vírgulas
ou use um caractere personalizado. Somente o primeiro caractere da cadeia é usado.
Se o arquivo for um suplemento do Microsoft Excel 4.0, este argumento será True para
abrir o suplemento como uma janela visível. Se esse argumento for False ou omitido, o
suplemento será aberto como oculto e não poderá deixar de ser oculto. Esta opção não
Editable
se aplica a suplementos criados no Microsoft Excel 5.0 ou posterior. Se o arquivo for um
modelo do Excel, True abrirá o modelo especificado para edição e False abrirá uma nova
pasta de trabalho baseada no modelo especificado. O valor padrão é False.
Se o arquivo não puder ser aberto em modo de leitura/gravação, este argumento será
True para adicionar o arquivo à lista de notificação de arquivos. O Microsoft Excel abrirá o
arquivo como somente leitura, pesquisará a lista de notificação de arquivos e avisará o
Notify
usuário quando o arquivo ficar disponível. Se esse argumento for False ou omitido,
nenhuma notificação será solicitada e qualquer tentativa de abrir um arquivo não
disponível falhará.
True para adicionar esta pasta de trabalho à lista de arquivos utilizados recentemente. O
AddToMru
valor padrão é False.
Comentários
Por padrão, as macros são habilitadas durante a abertura de arquivos por programação. Use a
propriedade AutomationSecurity para definir o modo de segurança de macro usado ao abrir arquivos
por programação.
Você pode especificar um destes valores no parâmetro UpdateLinks para determinar se as referências
externas (vínculos) serão atualizadas quando a pasta de trabalho for aberta:
Valor Significado
0 As referências externas (vínculos) não serão atualizadas quando a pasta de trabalho for aberta.
3 As referências externas (vínculos) serão atualizadas quando a pasta de trabalho for aberta.
Você pode especificar um destes valores no parâmetro Format para determinar o caractere delimitador
do arquivo:
Valor Delimitador
1 Tabulações
2 Vírgulas
3 Espaços
4 Ponto-e-vírgulas
5 Nada
Exemplo
Este exemplo abre a pasta de trabalho Analysis.xls e executa sua macro Auto_Open.
'Abre a pasta de trabalho Analysis.xls e,
Workbooks.Open "ANALYSIS.XLS"
ActiveWorkbook.RunAutoMacros xlAutoOpen
Workbooks.OpenFilename:="C:\Caminho\NomeDoArquivo.xls", password:="Senha"
Método Protect
Protege uma pasta de trabalho para que não possa ser modificada.
ActiveWorkbook.Protect Password:="Senha"
Método RunAutoMacros
Para código novo do Visual Basic, você deve usar os eventos Open, Close, Activate e Deactivate em vez
dessas macros.
Sintaxe expressão.RunAutoMacros(Which)
Which Obrigatório. As macros a serem executadas. Pode ser uma das seguintes constantes
XlRunAutoMacro:
Constante Descrição
Workbooks.Open "ANALYSIS.XLS"
ActiveWorkbook.RunAutoMacros xlAutoOpen
With ActiveWorkbook
.RunAutoMacros xlAutoClose
.Close
End With
Método Save
Salva alterações na pasta de trabalho especificada.
Este exemplo salva todas as pastas de trabalho ativas e então fecha o Microsoft Excel.
For Each w In Application.Workbooks
w.Save
Next w
Application.Quit
Método SaveAs
Salva as alterações da pasta de trabalho em um arquivo diferente.
Este exemplo cria uma nova pasta de trabalho, solicita um nome de arquivo ao usuário e, em seguida,
salva a pasta de trabalho.
Set NewBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
NewBook.SaveAs Filename:=fName
Método SaveCopyAs
Salva uma cópia da pasta de trabalho em um arquivo mas não modifica a pasta de trabalho aberta na
memória.
Método SendMail
expressão Obrigatória.
Subject Variant opcional. Especifica o assunto da mensagem. Se este argumento for omitido,
o nome do documento será usado.
ReturnReceipt Variant opcional. True para solicitar uma confirmação de recebimento. False para
não solicitar um recibo de retorno. O valor padrão é False.
'Envia a pasta de trabalho ativa para um único destinatário.
Método Unprotect
Remove a proteção de uma planilha ou pasta de trabalho. Este método não tem efeito se a planilha ou
pasta de trabalho não estiver protegida.
Sintaxe expressão.Unprotect(Password)
expressão Obrigatória.
Uma sequência que denote a senha (que pode usar maiúsculas e minúsculas) a ser
usada para desproteger a planilha ou pasta de trabalho. Se a planilha ou pasta de
trabalho não estiver protegida com uma senha, esse argumento será ignorado. Se
você omitir esse argumento para uma planilha que esteja prote-gida com uma senha,
você será solicitado a digitar a senha.
Se você omitir esse argumento para uma pasta de trabalho que esteja protegida com
uma senha, o método falhará.
Comentários
Se você esquecer a senha, você não poderá desproteger a planilha ou pasta de trabalho. É uma boa
ideia guardar em lugar seguro uma lista de suas senhas e dos nomes dos documentos correspondentes.
'remove a proteção da pasta de trabalho ativa.
ActiveWorkbook.Unprotect
Apêndice 6
Métodos
do Objeto
Worksheet
Um método é uma ação que um objeto pode executar. Por exemplo, Add é um método do objeto
Worksheet, pois adiciona uma nova planilha a uma pasta de trabalho.
Método Add
Before Variant opcional. Um objeto que especifica a planilha antes da qual a nova planilha será
adicionada.
After Variant opcional. Um objeto que especifica a planilha após a qual a nova planilha é
adicionada.
Type Variant opcional. O tipo da planilha. Pode ser uma das seguintes constantes
XlSheetType: xlWorksheet, xlExcel4MacroSheet ou xlExcel4IntlMacroSheet. O valor
padrão é xlWorksheet.
Comentários
Se Before e After forem omitidos, a nova planilha será inserida antes da planilha ativa.
'cria uma nova planilha e a insere antes da planilha ativa.
ActiveWorkbook.Worksheets.Add
Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
Método Copy
Sintaxe 1: Copia o objeto para a Área de transferência. Copia uma figura do ponto ou sequência
para a Área de transferência.
expressão.Copy
expressão Obrigatória. Uma expressão que retorne um objeto da lista Relativo a. Para copiar uma
folha de gráfico inteira, use a Sintaxe 3 com o objeto Chart. Para copiar somente a área
do gráfico, use a Sintaxe 1 com o objeto ChartArea.
Destination Variant opcional. Especifica o novo intervalo para o qual o intervalo especificado será
copiado. Se esse argumento for omitido, o Microsoft Excel copiará o intervalo para a
Área de transferência.
Before Sintaxe 3: Variant opcional. A planilha antes da qual a planilha copiada será colocada.
After Variant opcional. A planilha após a qual a planilha copiada será colocada.
Comentários
Se você não especificar Before ou After, o Microsoft Excel criará uma nova pasta de trabalho contendo a
planilha copiada.
Exemplos:
'copia Plan1, colocando a cópia depois de Plan3.
Worksheets("Plan1").Copy after:=Worksheets("Plan3")
Worksheets("Plan1").UsedRange.Copy
newSheet.Range("A1").PasteSpecial Paste:=xlValues
'copia as fórmulas das células A1:D4 de Plan1 nas células E5:H8 de Plan2.
Worksheets("Plan1").Range("A1:D4").Copy _
destination:=Worksheets("Plan2").Range("E5")
Método Delete
Exclui o objeto
Sintaxe 1 expressão.Delete
Sintaxe 2 expressão.Delete(Shift)
Shift Variant opcional. Usado somente com objetos Range. Especifica como deslocar células
para substituir as células excluídas. Pode ser uma das seguintes constan-tes
XlDeleteShiftDirection: xlShiftToLeft ou xlShiftUp. Se esse argumento for omitido, o
Microsoft Excel decidirá com base na forma do intervalo.
Comentários
Você pode excluir propriedades de documento personalizadas, mas não pode excluir uma propriedade
interna do documento.
Exemplos:
'exclui as células A1:D10 de Plan1 e desloca as células
Worksheets("Plan1").Range("A1:D10").Delete Shift:=xlShiftToLeft
Application.DisplayAlerts = False
Worksheets("Plan3").Delete
Application.DisplayAlerts = True
Worksheets("Plan1").Range("A1").Sort key1:=Worksheets("Plan1").Range("A1")
currentCell.EntireRow.Delete
End If
Loop
Método Move
Before Variant opcional. A planilha antes da qual a planilha movida será colocada.
After Variant opcional. A planilha após a qual a planilha movida será colocada.
Comentários
Se você não especificar Before ou After, o Microsoft Excel criará uma nova pasta de trabalho contendo a
planilha movida.
'move Sheet1 para depois de Sheet3 na pasta de trabalho ativa.
Worksheets("Sheet1").Move after:=Worksheets("Sheet3")
Método Select
Seleciona o objeto.
Sintaxe expressão.Select(Replace)
Replace Variant opcional (usado somente com planilhas). True para substituir a seleção atual
pelo objeto especificado. False para estender a seleção atual para incluir qualquer
objeto anteriormente selecionado e o objeto especificado.
Comentários
Para selecionar uma célula ou um intervalo de células, use o método Select. Para tornar uma única
célula a célula ativa, use o método Activate.
'seleciona as células A1:B3 de Plan1.
Worksheets("Plan1").Activate
Range("A1:B3").Select
Apêndice 7
Propriedades do
objeto Worksheet
Para definir o valor de uma propriedade, coloque, após a referência a um objeto, um ponto, o nome da
propriedade, um sinal de igualdade (=) e o novo valor da propriedade.
Propriedade Count
Retorna o número de objetos da coleção.
'exibe o número de colunas na seleção em Plan1.
Worksheets("Plan1").Activate
areaCount = Selection.Areas.Count
Else
For i = 1 To areaCount
MsgBox "Area " & i & " of the selection contains " & _
Next i
End If
n = Worksheets("Plan1").Range("A1").Characters.Count
Propriedade HPageBreaks
Retorna uma coleção HPageBreaks que representa as quebras de página horizontais da planilha.
Somente leitura.
Sintaxe expressão.HPageBreaks
Exemplo
Este exemplo exibe o número de quebras de página horizontais de área de impressão e de tela inteira.
cFull = cFull + 1
Else
cPartial = cPartial + 1
End If
Next
MsgBox cFull & " full-screen page breaks, " & cPartial & _
Propriedade Item
Sintaxe expressão.Item(Index)
Propriedade Visible
True se o objeto está visível. Para um gráfico ou planilha, essa propriedade pode ser definida como
xlVeryHidden. Isso oculta o objeto para que a única maneira de você torná-lo novamente visível seja
definindo essa propriedade como True (o usuário não pode tornar o objeto visível). Boolean ou Long de
leitura e gravação.
Comentários
A propriedade Visible para um item de tabela dinâmica é True quando o item está atualmente visível na
tabela.
Se você definir a propriedade Visible de um nome como False, o nome não aparecerá na caixa de
diálogo Definir nome.
'oculta Plan1.
Worksheets("Plan1").Visible = False
Worksheets("Plan1").Visible = True
sh.Visible = True
Next sh
'cria uma nova planilha e, em seguida, define sua propriedade Visible como
newSheet.Visible = xlVeryHidden
newSheet.Range("A1:D4").Formula = "=RAND()"
Propriedade VPageBreaks
cFull = cFull + 1
Else
cPartial = cPartial + 1
End If
Next
MsgBox cFull & " full-screen page breaks, " & cPartial & _
Propriedade EnableSelection
Comentários
Essa propriedade só funciona quando a planilha está protegida: xlNoSelection impede qualquer seleção
na planilha, xlUnlockedCells permite que apenas as células cuja propriedade Locked seja False sejam
selecionadas e xlNoRestrictions permite que qualquer célula seja selecionada.
With Worksheets(1)
.EnableSelection = xlNoSelection
End With
Propriedade ScrollArea
Retorna ou define o intervalo onde se permite rolagem, como uma referência de intervalo em estilo A1.
As células fora da área de rolagem não podem ser selecionadas. String de leitura e gravação.
Comentários
Defina essa propriedade com uma cadeia de caracteres vazia ("") para permitir seleção de células para
toda a planilha.
'define a área de rolagem para a planilha um.
Worksheets(1).ScrollArea = "a1:f10"
Propriedade ProtectContents
True se o conteúdo da planilha está protegido. Em um gráfico, isso protege o gráfico inteiro. Em uma
planilha, isso protege as células individuais. Boolean somente leitura.
Este exemplo exibe uma caixa de mensagem se o conteúdo de Sheet1 estiver protegido.
If Worksheets("Sheet1").ProtectContents = True Then
End If