Você está na página 1de 170

ÍNDICE

ÍNDICE .......................................................................................................................................... 2
INTRODUÇÃO .............................................................................................................................. 3
PROC, PROCV E PROCH ............................................................................................................ 3
Distribuição de Frequência.......................................................................... 6
FUNÇÕES DE DATA E HORA ..................................................................................................... 8
RÓTULOS ................................................................................................................................... 11
FUNÇÕES FINANCEIRAS ......................................................................................................... 15
DADOS ........................................................................................................................................ 23
Dados da WEB.......................................................................................... 25
Classificação ............................................................................................. 29
Auto Filtro .................................................................................................. 31
Filtragem personalizada ............................................................................ 34
Subtotais ................................................................................................... 36
Consolidação ............................................................................................ 37
TABELA DINÂMICA ................................................................................................................... 41
Gráficos Dinâmicos ....................................................................................... 44
Validação ...................................................................................................... 46
Controlar Alterações ................................................................................. 50
Validação com filtros ..................................................................................... 52
FUNÇÕES DE BANCOS DE DADOS ........................................................................................ 56
HISTOGRAMA ............................................................................................................................ 62
SOLVER ...................................................................................................................................... 68
TESTE DE HIPÓTESE ................................................................................................................ 74
Cenários ....................................................................................................... 74
Atingir Meta................................................................................................... 77
FORMULÁRIOS EM EXCEL ...................................................................................................... 79
MACROS ..................................................................................................................................... 93
Atribuindo botões que mostram as Macros................................................... 96
VBA – Visual Basic Application..................................................................... 98
PASTAS DE TRABALHOS COMPARTILHADAS ................................................................... 108
CONCLUSÃO ........................................................................................................................... 112
INTRODUÇÃO

O Excel é uma das melhores planilhas existentes no mercado. As planilhas


eletrônicas são programas que se assemelham a uma folha de trabalho, na
qual podemos colocar dados ou valores em forma de tabela e aproveitar a
grande capacidade de cálculo e armazenamento do computador para
conseguir efetuar trabalhos que, normalmente, seriam resolvidos com uma
calculadora, lápis e papel. Aqui nesta apostila o objetivo é aprimorar mais o seu
conhecimento nesta excelente ferramenta. Caso seja seu primeiro contato com
o Excel é aconselhável que baixe primeiro a versão básicado Excel.

Vamos iniciar nossos estudos com algumas funções mais elaboradas que esta
excelente ferramenta nos proporciona.

PROC, PROCV E PROCH


A função PROC, PROCH e PROCV permitem que se faça uma busca em sua
planilha e retorne na célula de acordo com os critérios selecionados.
Vamos nos apoiar para o nosso próximo exemplo na função PROCV
Sua sintaxe é a seguinte:
=PROCV() A função faz uma procura vertical em uma tabela de dados.
Busca o que A célula onde será digitado o dado que será procurado na tabela.
Tabela de Busca A região de células onde se encontra a tabela com os dados.
Coluna O número da coluna que tem o dado a ser recuperado
Monte a seguinte planilha
Temos então uma planilha base com as classes e seus respectivos valores, na
planilha ao lado, temos então o hóspede e classe escolhida, vamos então
procurar na primeira planilha o tipo de classe para que retorne o valor.
=PROCV(E3;A4:B8;2), Observe que é buscado o tipo da classe E3 no
intervalo da tabela base A4:B8 e retorna a segunda coluna representado pelo
número 2.

Para preencher as demais células, o cálculo é o mesmo, e neste caso temos


valores absolutos A4:B8 que são os valores que estão na primeira tabela.
=PROCV(E3;$A$4:$B$8;2)

Vamos agora a um exemplo usando o PROCH


Monte a seguinte planilha

Vamos usar o assistente de função. Clique sobre o botão na barra e depois

procure a função.
Clique em OK. Vamos agora preencher os campos das seguinte forma.

• valor_procurado: é a célula B10;


• matriz_tabela é o intervalo de A2:E8;
• num_linha: é 7, pois o intervalo começa na linha 2, e os valores a serem
retornados estão na linha 8 (Total do semestre);
• procurar_intervalo: é 0 "zero", pois queremos o valor exato da pesquisa.
Distribuição de Frequência
A distribuição de frequência é o número de repetições de um determinado valor
de uma variável. Sendo uma função formada pelos valores da variável e suas
respectivas frequências.
Vamos usar a função em uma planilha de boletim.

Vamos agora adicionar a função frequência para saber a situação dos alunos.
Selecione as três células que devem receber os valores (C11:C13).
Pelo Assistente de função chame a função FREQUÊNCIA.
Preencha conforme imagem.
Não clique em OK. Clique na barra de fórmulas e pressione
CTRL+SHIFT+ENTER.
Ele retorna o resultado e acrescenta chaves na função determinando assim a
matriz.

FUNÇÕES DE DATA E HORA


Podemos trabalhar com diversas funções que se baseiam na data e hora de
seu computador. As principais função de data e hora são
=HOJE( ) Retorna a data atual.
=MÊS(HOJE()) Retorna o mês atual
=ANO(HOJE()) Retorna o ano atual
=HORA(AGORA()) Retorna a hora atual
=MINUTO(AGORA()) Retorna o minuto atual
=SEGUNDO(AGORA()) Retorna o segundo atual
=AGORA( ) Retorna a data e à hora
=DIA.DA.SEMANA(HOJE()) Retorna o dia da semana em número
=DIAS360( ) Calcula o número de dias que há entre uma data inicial e uma
data final
Para exemplificar monte a seguinte planilha.

Em V.Diário, vamos calcular quantas horas foram trabalhadas durante cada


dia.
=B3-B2+B5-B4, pegamos a data de saída e subtraímos pela data de entrada
de manhã, com isso sabemos quantas horas foram trabalhadas pela manhã na
mesma função faço a subtração da saída no período da tarde pela entrada do
período da tarde e somo os dois períodos.
Repita o processo para todos os demais dias da semana, somente no sábado é
preciso apenas calcular a parte da manhã, ou seja, não precisa ser feito o
cálculo do período da tarde.

Para calcular o V. da hora que o funcionário recebe coloque um valor, no caso


adicione 15 e coloquei no formato Moeda. Vamos agora então calcular quanto
ele ganhou por dia, pois temos quantas horas ele trabalhou durante o dia e
sabemos o valor da hora. Como temos dois formatos de números precisamos
durante o cálculo fazer a conversão.
Para a segunda-feira o cálculo fica da seguinte forma:
=HORA(B6)*B7+MINUTO(B6)*B7/60.
Inicialmente utilizamos a função HORA e pegamos como referência de hora o
valor da célula B6, multiplicamos pelo valor que está em B7, essa parte calcula
somente à hora cheia então precisamos somar os minutos que pega a função
MINUTO e multiplica a quantidade de horas pelo valor da hora, como o valor é
para a hora dividimos ele então por 60
Após isso coloque o valor em formato Moeda.
Para os demais cálculos o V.Hora será igual há todos os dias então ele precisa
ser fixo para que o cálculo possa ser copiado, o número 60 por ser um número
não é muda.
=HORA(B6)*$B$7+MINUTO(B6)*$B$7/60
Para sabermos quantas horas o funcionário trabalhou na semana, faça a soma
de todos os dias trabalhados.

Ao observar atentamente o valor calculado ele mostra 20:40, porém nessa


semana o funcionário trabalhou mais de 40 horas, isso ocorre pois o cálculo de
horas zera ao chegar em 23:59:59, então preciso fazer com que o Excel
entenda que ele precisa continuar a contagem.
Clique na faixa do grupo número na ABA Inicio, na janela que se abre clique
na categoria Hora e escolha o formato 37:30:55 esse formato faz com que a
contagem continue.
Crie um novo campo abaixo da Tabela e coloque V. a receber e faça a soma
dos valores totais.

RÓTULOS

Podemos nomear os dados de uma planilha para que a escrita das fórmulas
seja feita de maneira mais simples. Os “NOMES” podem fazer referência a um
valor, a uma fórmula ou até mesmo a um conjunto de células. Na planilha
abaixo temos que calcular o volume de vários objetos com diferentes alturas.
Todos os objetos têm a mesma base, que é o resultado da multiplicação da
largura pelo comprimento.
Monte a planilha.

Para a data para que tenha sempre a data atual clique sobre a célula e coloque
a seguinte função.
Clique agora no valor da célula do dólar compra.
Clique na ABA fórmulas e depois em Definir Nome.

Defina um nome e se o rótulo será para somente esta pasta de trabalho.


Confirme a referência da célula.

Clique em OK.
Observe que agora ele não mostra mais a referência de sua célula e sim o
nome que você deu.

Repita o processo para o dólar valor de venda, euro compra e euro venda.
Para o valor unitário, selecione toda a faixa de valores e nomeie como unitário.
Para calcular os valores o processo é simples.
Clique na célula onde será feito o calculo de conversão do valor pelo dólar
compra e digite: = unitário, observe que o Excel já vai mostrar o rótulo.

Para confirmar o rótulo basta dar um duplo clique sobre o mesmo.

Repita o processo para todos os demais cálculos.


Formate as células de acordo com suas respectivas moedas.
Ao clicar em gerenciar nomes, você pode modificar, excluir os nomes de seus
rótulos.

FUNÇÕES FINANCEIRAS
Existe um grupo de funções do Excel que permitem cálculos financeiros. As
principais são
NPER- Retorna o número de períodos para investimento de acordo com
pagamentos constantes e periódicos e uma taxa de juros constante. A sintaxe
é =NPER(TAXA;PGTO;VP;VF;TIPO) onde:
• Taxa Necessário. A taxa de juros por período.
• Pgto. Necessário. O pagamento feito em cada período; não pode mudar
durante a vigência da anuidade. Geralmente, pgto contém o capital e os
juros, mas nenhuma outra tarifa ou taxas.
• Vp Necessário. O valor presente ou atual de uma série de pagamentos
futuros.
• Vf Opcional. O valor futuro, ou o saldo, que você deseja obter depois do
último pagamento. Se vf for omitido, será considerado 0 (o valor futuro
de um empréstimo, por exemplo, é 0).
• Tipo Opcional. O número 0 ou 1 e indica as datas de vencimento

TAXA - Retorna a taxa de juros por período de uma anuidade. TAXA é


calculado por iteração e pode ter zero ou mais soluções. Se os resultados
sucessivos de TAXA não convergirem para 0,0000001 depois de 20 iterações,
TAXA retornará o valor de erro #NÚM!.A sua sintaxe:
TAXA(nper;pgto;vp;vf;tipo;estimativa) onde:
• Nper Obrigatório. O número total de períodos de pagamento em uma
anuidade.
• Pgto Obrigatório. O pagamento feito em cada período e não pode
mudar durante a vigência da anuidade. Geralmente, pgto inclui o
principal e os juros e nenhuma outra taxa ou tributo. Se pgto for omitido,
você deverá incluir o argumento vf.
• Vp Obrigatório. O valor presente — o valor total correspondente ao
valor atual de uma série de pagamentos futuros.
• Vf Opcional. O valor futuro, ou o saldo, que você deseja obter depois do
último pagamento. Se vf for omitido, será considerado 0 (o valor futuro
de um empréstimo, por exemplo, é 0).
• Tipo Opcional. O número 0 ou 1 e indica as datas de vencimento

VP-Retorna o valor presente de um investimento. O valor presente é o valor


total correspondente ao valor atual de uma série de pagamentos futuros. Por
exemplo, quando você toma uma quantia de dinheiro emprestada, a quantia do
empréstimo é o valor presente para o concessor do empréstimo. Sua sintaxe é:
VP(taxa, nper, pgto, vf, tipo)
• Taxa Necessário. A taxa de juros por período. Por exemplo, se você
tiver um empréstimo para um automóvel com taxa de juros de 10% ano
e fizer pagamentos mensais, sua taxa de juros mensal será de 10%/12
ou 0,83%. Você deveria inserir 10%/12 ou 0,83%, ou 0,0083, na fórmula
como taxa.
• Nper Necessário. O número total de períodos de pagamento em uma
anuidade. Por exemplo, se você conseguir um empréstimo de carro de
quatro anos e fizer pagamentos mensais, seu empréstimo terá 4*12 (ou
48) períodos. Você deveria inserir 48 na fórmula para nper.
• Pgto Necessário. O pagamento feito em cada período e não pode
mudar durante a vigência da anuidade. Geralmente, pgto inclui o
principal e os juros e nenhuma outra taxa ou tributo. Por exemplo, os
pagamentos mensais de R$ 10.000 de um empréstimo de quatro anos
para um carro serão de R$ 263,33. Você deveria inserir -263,33 na
fórmula como pgto. Se pgto for omitido, você deverá incluir o argumento
vf.
• Vf Opcional. O valor futuro, ou o saldo, que você deseja obter depois do
último pagamento. Se vf for omitido, será considerado 0 (o valor futuro
de um empréstimo, por exemplo, é 0). Por exemplo, se você deseja
economizar R$ 50.000 para pagar um projeto especial em 18 anos,
então o valor futuro será de R$ 50.000. Você poderia então fazer uma
estimativa conservadora na taxa de juros e concluir quanto economizaria
por mês. Se vf for omitido, você deverá incluir o argumento pgto.
• Tipo Opcional. O número 0 ou 1 e indica as datas de vencimento

Vamos montar um exemplo da função VP


Monte a seguinte planilha Uma aplicação com duração de 12 meses e taxa de
4% ao mês rendeu um resgate de R$ 90.000,00. Desejamos saber qual foi o
valor investido.
Clique onde será colocado o valor de VP e abra o assistente de função.

Preencha os dados conforme adicionado na planilha.


Clique em OK e assim sabemos qual é o valor presente.
Mais um exemplo agora usando a função PGTO - Retorna o pagamento
periódico de uma anuidade de acordo com pagamentos constantes e com uma
taxa de juros constante. Sua sintaxe é: PGTO(taxa, nper, pv, fv, tipo)

Vamos usar uma função financeira para calcular o valor dos pagamentos de
um empréstimo. Neste caso, a taxa de juros e o número de pagamentos devem
estar expressos da mesma forma, ou seja, se os pagamentos forem mensais, a
taxa de juros também deverá ser.
No primeiro campo inserimos a taxa de juros, que neste exemplo é de 3% ao
mês.

No segundo inserimos o número de pagamentos.


O valor atual é o valor que será disponibilizado para o empréstimo.

O valor futuro é o saldo que deverá restar após serem efetuados todos os
pagamentos, neste caso zero.
No tipo de empréstimo “1” o primeiro pagamento é efetuado somente no final
do período, ou seja, depois de um mês. No tipo “0” o primeiro pagamento é
efetuado no mesmo ato do empréstimo.

Planilha de empréstimo - informando o tipo de empréstimo "1", primeiro


pagamento para o próximo mês.
O valor do campo “Pagamento” será calculado através da função financeira
“PAGAMENTO”. Vamos inseri-la.
Como argumentos, vamos indicar as respectivas células que acabamos de
preencher.
Observe o resultado:

Função PGTO - retornando o valor mensal a ser amortizado.

DADOS
O Excel possui uma ABA chamada Dados que permite importar dados de
outras fontes , ou trabalhar os dados de uma planilha do Excel.

O primeiro grupo dessa ABA permite importar dados de outras fontes.

Podemos importar dados de um banco de dados Access. Vamos importar os


dados do arquivo de Access básico.

Clique no botão Do Access.


Selecione o banco de dados a ser importado.

Clique em OK
Os dados serão importados para sua planilha.
Podemos trabalhar com dados disponíveis na Internet em nossas planilhas.
Clique na ABA Dados.

Para usar este recurso seu computador precisa estar conectado a


Internet.

Dados da WEB
Clique no segundo botão chamado da WEB. Será aberta uma janela como se
fosse um navegador.

Você pode digitar o endereço de seu site preferido que disponibilize conteudo
em tabelas.
Observe que ao localizar algo a ser importado ele mostra uma seta amarela.
Clique sobre a tabela a ser importada e depois clique na parte de baixo em
Importar.

Confirme a tela acima e clique em OK.

Podemos também importar dados RSS. Clique em outra célula depois clique no
botão da WEB.
Entrei no portal globo.com e ao descer a tela visualizei botão de RSS.
Clique sobre este botão.
Será mostrada a estrutura XML.

E clique em Importar.

Clique em OK.
Confirme a tela acima.

Apenas cuidado ao importar dados muito grandes, pois o tempo de importação


será longo e poderá travar o excel.

Classificação
Vamos agora trabalhar com o gerenciamento de dados criados no Excel.
Vamos utilizar para isso a planilha de Atletas.
Classificar uma lista de dados é muito fácil, e este recurso pode ser obtido pelo
botão Classificar e Filtrar na ABA Inicio, ou pelo grupo Classificar e Filtrar na
ABA Dados.

Vamos então selecionar os dados de nossa planilha que serão classificados.

Clique no botão Classificar.


Você precisa definir quais serão os critério de sua classificação, onde diz
Classificar por clique e escolha nome, depois clique no botão Adicionar Nível
e coloque Modalidade.

Antes de clicar em OK, verifique se está marcado a opção Meus dados


contêm cabeçalhos, pois selecionamos a linha de títulos em nossa planilha e
clique em OK.

Você pode mudar a ordem de classificação sempre que for necessário, basta
clicar no botão de Classificar.
Auto Filtro
Este é um recurso que permite listar somente os dados que você precisa
visualizar no momento em sua planilha. Com seus dados selecionado clique no
botão Filtro e observe que será adicionado junto a cada célula do cabeçalho da
planilha uma seta.

Estas setas permite visualizar somente os dados que te interessam na planilha,


por exemplo caso eu precise da relação de atletas do sexo feminino, basta eu
clicar na seta do cabeçalho sexo e marcar somente Feminino, que os demais
dados da planilha ficarão ocultos.
Posso ainda refinar mais a minha filtragem, caso precise saber dentro do sexo
feminino quantos atletas estão na categoria Profissional, eu faço um novo filtro
na coluna Categoria.

Observe que as colunas que estão com filtro possuem um ícone em forma de
funil no lugar da seta.
Para remover os filtros, basta clicar nos cabeçalhos com filtro e escolher a
opção selecionar tudo.
Você também pode personalizar seus filtros através da opção Filtros de Texto
e Filtro de número (quando conteúdo da célula for um número).
Dica rápida para filtrar diretamente na célula usando o Excel 2007/2010:
Após aplicar o filtro em sua tabela (em Dados, Filtro), clique com o botão direito
sobre o ítem que deseja filtrar e vá na opção Filtro. Veja:

Filtragem personalizada
Através da utilização dos filtros podemos acrescentar elementos gráficos a
nossa planilha.
Monte a seguinte planilha. Certifique-se de que cada célula contenha a sua
imagem.
Clique com o botão direito do mouse nas imagens, selecione tamanho e
propriedades depois propriedades, e marque a opção Mover e dimensionar
junto com as células.

Repita o processo para cada uma das imagens.


Selecione todas as células e clique na ABA Dados, Filtrar. Agora é só escolher
o programa e ter uma filtragem mais rica em informações.
Subtotais
Podemos agrupar nossos dados através de seus valores, vamos inicialmente
classificar nossa planilha pelo sexo dos atletas relacionado com a idade.

Depois clique no botão Subtotal.


Em A cada alteração em: coloque sexo e em Adicionar subtotal a deixe
marcado apenas Peso, depois clique em OK.
Observe na esquerda que é mostrado os níveis de visualização dos subtotais e
que ele faz um total a cada sequência do sexo dos atletas.
Para remover os subtotais, basta clicar no botão Subtotal e na janela que
aparece clique em Remover Todos.

Consolidação
Você pode resumir dados de um ou mais áreas de origem, consolidando-o e
criando uma tabela de consolidação. Essas áreas de origem podem estar na
mesma planilha que a tabela de consolidação, em planilhas diferentes na
mesma pasta de trabalho ou em diferentes pastas de trabalho.
Vamos ao nosso exemplo.
Crie uma Guia de Planilha com os dados, cada um em uma guia:
Crie mais uma sem cálculos
Nesta célula, clique a primeira célula vazia.
Na ABA Dados clique em Consolidar.

Clique no botão referência e selecione os dados da primeira planilha.

Clique novamente no botão Referência que será mostrada a janela.


Clique em Adicionar, Selecione agora na segunda planilha.
Clique novamente em Adicionar, repita o processo para a planilha 03.

Marque a opção Criar vínculos com dados de origem e clique em OK.


Observe que na esquerda você tem alguns sinais de mais, ao clicar sobre ele
será expandida a planilha e mostra os dados para se chegar ao resultado.

TABELA DINÂMICA
Tabela Dinâmica é uma tabela interativa que resume uma grande quantidade
de dados rapidamente, ou os combina de tabelas diferentes. É possível girar
suas linhas e colunas para ver resumos diferentes dos dados de origem, filtrar
os dados exibindo páginas diferentes ou exibir os detalhes das áreas de
interesse.
Vamos criar um tabela dinâmica baseada em uma nova planilha

Clique na ABA Inserir, depois clique no botão Tabela Dinâmica.

Será mostrada a janela de criação da Tabela Dinâmica, vamos adicionar ela


em uma nova planilha, clique em OK

A janela do Excel será modificada para o ambiente de Tabela Dinâmica.


Observe na direita que temos quatro campos para colocarmos nossos campos
que são mostrados na janela superior.
Conforme você vai marcando na direita ele monta na esquerda. Observe
também que o que está preenchido é Rótulo de linha e valores.
Observe que na planilha o Excel já começa a montar a planilha com os dados
escolhidos.

Adicione agora a Rótulos de Linha o campo Nome.


Adicione a Valores os campos Idade, Peso e Altura
Ao clicar por exemplo em um Nome ele fará o filtro e mostrara somente os
dados referentes a este nome

Você pode filtrar e apresentar valores dos campos sexo e Categoria, se


precisar pode mudar os campos de local na direita da tela, ou seja, você
apresenta os dados de acordo com a sua necessidade.

Gráficos Dinâmicos
Um gráfico dinâmico é um gráfico que pode ser atualizado dinamicamente, de
acordo com os parâmetros escolhidos pelo usuário. Vamos utilizar a planilha
criada em nosso último exemplo.
Selecione a planilha, clique em Inserir, Tabela Dinâmica, Gráfico Dinâmico.
Clique em OK. Vamos colocar conforme a imagem.

Observe que repeti os campos em Eixos e valores.


Observe que seu gráfico agora possibilita filtrar os dados pelo nome ou pela
propriedade.
Validação
Em uma planilha muitas vezes podemos obrigar ao usuário entrar com
informações corretas, este processo chama-se validação.
Em nossa planilha Relação de Produtos vamos validar que o campo de
entrada de quantidade somente aceite números.
Abra a planilha e clique na célula onde é digitado o valor a ser convertido.
Clique na ABA Dados e depois no botão Validação de Dados

Vamos colocar um aviso que o número não pode ser menor que 1.

Clique na guia Alerta de erro.


Preencha os campos conforme a imagem.
Clique em Ok
Teste sua célula, coloque um valor menor que 1

Vamos agora nesta mesma planilha definir que as células que possuem
cálculos não possam ser modificadas. Selecione todas as células que não
possuam cálculos e que poderão ter seus valores alterados.

Clique na ABA Página Inicial e depois abra o grupo Fonte. Dentro de Fonte
clique em Proteção.
Desmarque a opção Bloqueadas.
Agora clique na Aba Revisão no grupo Alterações clique em Proteger Planilha.

Você pode colocar uma senha de proteção. Esta opção é recomendável pois
para que se desproteja a planilha precise que a senha seja digitada. Mas
cuidado de anotá-la.
Clique em OK e tente mudar a planilha
Controlar Alterações
Este é um recurso muito interessante quando mais de uma pessoa altera a
planilha. Este comando vai permitir que se monitore as alterações feitas na
planilha.
Na ABA Revisão você terá a opção Controlar Alterações.

Você pode definir desde quando as alterações, por quem e se tiver alguma
célula ou grupo de células.
Clique em OK e salve a planilha.
Você pode aprovar e descartar alterações feitas por outros usuários. Com a
opção de controlar alterações habilitada, volte para o botão “Controlar
Alterações” e perceba que a opção “Aceitar/Rejeitar Alterações” estará
habilitado.
Ao alterar qualquer valor o mesmo será realçado.

Podemos definir se aceitamos ou não a alteração.


Clique no botão Aceitar/Rejeitar alterações.

Marque as opções que pretende analisar e clique em OK.

A célula que foi modificado fica selecionada e ele mostra um resumo da


mudança. Você pode aceitar ou rejeitar a alteração. Caso tenha mais de uma
alteração você pode definir a ação para todas.
Ao clicar em Aceitar ele altera o valor da célula e retira o aviso de mudança. Se
clicar em Rejeitar, ele volta ao valor antigo e retira o aviso.

Validação com filtros


Vamos criar uma validação com filtro, ou seja, depois que escolhermos o
estado na coluna de estados, na coluna de cidades só será possível escolher
cidades do estado escolhido.
Temos duas planilhas: Completa, onde temos a lista de siglas e cidades
completa, e uma lista de siglas, sem repetição de estados.

E temos a planilha: Validação_Filtro, onde definiremos os estados e


escolheremos as cidades.
Vamos nomear os intervalos, selecionaremos todas as siglas na coluna A e
definiremos o nome SG.

Selecionaremos todas as cidades na coluna B e definiremos o nome cidades.


Selecionaremos todas as siglas na coluna F e definiremos o nome siglas.

Na planilha Validação_Filtro, vamos criar as validações.


Selecionaremos o intervalo de Estados. E então na guia Dados – Validação
de Dados – Validação de Dados definiremos a validação.

Permitir lista, e a fonte é siglas.


Depois com o intervalo de cidades selecionado, criaremos outra validação. na
guia Dados – Validação de Dados – Validação de Dados permitiremos lista e
a em fonte digite a seguinte fórmula:

=DESLOC(cidades;CORRESP(A2;SG;0)-1;0;CONT.SE(SG;A2)-1)

Teremos como resultado a lista de siglas em Estados.


FUNÇÕES DE BANCOS DE DADOS
Embora pouco conhecidas as funções de Banco de dados são extremamente
úteis pois utilizam menos recursos que as funções matriciais e deixam as
planilhas mais leves.
As principais são:
BDContar: Conta as células contendo números em uma coluna de uma lista ou
de um banco de dados que corresponde às condições especificadas por você.
Sintaxe: BDCONTAR(banco_dados;campo;critérios)

• Banco_dados: é o intervalo de células que constitui a lista ou o banco de


dados. Um banco de dados é uma lista de dados relacionados na qual
as linhas de informações relacionadas são os registros e as colunas de
dados são os campos. A primeira linha da lista contém os rótulos de
cada coluna.
• Campo: indica a coluna que será usada na função. Digite o rótulo da
coluna entre aspas duplas, como "Idade" ou "Rendimento", ou um
número (sem aspas) que represente a posição da coluna dentro da lista:
1 para a primeira coluna, 2 para a segunda coluna e assim por diante.
• Critérios: é o intervalo de células que contém as condições
especificadas. Você pode usar qualquer intervalo para o argumento de
critérios, desde que ele inclua pelo menos um rótulo de coluna e ao
menos uma célula abaixo do rótulo de coluna em que você especificar
uma condição para a coluna.
BDMÁX: Retorna o maior número de uma coluna em uma lista ou banco de
dados que coincide com as condições especificadas por você. Sintaxe:
BDMÁX(banco_dados;campo;critérios)
• Banco_dados: é o intervalo de células que constitui a lista ou o banco de
dados. Um banco de dados é uma lista de dados relacionados na qual
as linhas de informações relacionadas são os registros e as colunas de
dados são os campos. A primeira linha da lista contém os rótulos de
cada coluna.
• Campo: indica a coluna que será usada na função. Digite o rótulo da
coluna entre aspas duplas, como "Idade" ou "Rendimento", ou um
número (sem aspas) que represente a posição da coluna dentro da lista:
1 para a primeira coluna, 2 para a segunda coluna e assim por diante.
• Critérios: é o intervalo de células que contém as condições
especificadas. Você pode usar qualquer intervalo para o argumento de
critérios, desde que ele inclua pelo menos um rótulo de coluna e ao
menos uma célula abaixo do rótulo de coluna em que você especificar
uma condição para a coluna.
BDMédia: Calcula a média dos valores em uma coluna de uma lista ou banco
de dados que corresponde às condições especificadas por você.
Sintaxe: BDMÉDIA(banco_dados;campo;critérios).
• Banco_dados: é o intervalo de células que constitui a lista ou o banco de
dados. Um banco de dados é uma lista de dados relacionados na qual
as linhas de informações relacionadas são os registros e as colunas de
dados são os campos. A primeira linha da lista contém os rótulos de
cada coluna.
• Campo: indica a coluna que será usada na função. Digite o rótulo da
coluna entre aspas duplas, como "Idade" ou "Rendimento", ou um
número (sem aspas) que represente a posição da coluna dentro da lista:
1 para a primeira coluna, 2 para a segunda coluna e assim por diante.
• Critérios: é o intervalo de células que contém as condições
especificadas. Você pode usar qualquer intervalo para o argumento de
critérios, desde que ele inclua pelo menos um rótulo de coluna e ao
menos uma célula abaixo do rótulo de coluna em que você especificar
uma condição para a coluna.
BDSOMA: Soma os números de uma coluna em uma lista ou banco de dados
que coincidem com as condições especificadas por você.
Sintaxe: BDSOMA(banco_dados;campo;critérios)
• Banco_dados: é o intervalo de células que constitui a lista ou o banco de
dados. Um banco de dados é uma lista de dados relacionados na qual
as linhas de informações relacionadas são os registros e as colunas de
dados são os campos. A primeira linha da lista contém os rótulos de
cada coluna.
• Campo: indica a coluna que será usada na função. Digite o rótulo da
coluna entre aspas duplas, como "Idade" ou "Rendimento", ou um
número (sem aspas) que represente a posição da coluna dentro da lista:
1 para a primeira coluna, 2 para a segunda coluna e assim por diante.
• Critérios: é o intervalo de células que contém as condições
especificadas. Você pode usar qualquer intervalo para o argumento de
critérios, desde que ele inclua pelo menos um rótulo de coluna e ao
menos uma célula abaixo do rótulo de coluna em que você especificar
uma condição para a coluna.
Vamos a alguns exemplos. Vamos usar a planilha que criamos para a nossa
tabela dinâmica. Insira algumas linhas acima dela e monte o seguinte
cabeçalho.

Vamos criar um sistema de contagem que obedecerá aos critérios


estabelecidos na linha 2
Para isso, selecionamos a célula E2, que fornecerá o resultado da contagem, e
a função BDCONTAR, da categoria banco de dados.
Esta função utiliza 3 argumentos. O primeiro é o intervalo de células que
constitui o banco de dados. Vamos selecionar então o intervalo A6:D13.

Como segundo argumento, podemos especificar um campo. No nosso caso,


todos os campos serão utilizados. Então vamos deixar este argumento em
branco.
Como último argumento, devemos indicar o intervalo de células que contém as
condições especificadas para a busca. Selecionamos, então, o intervalo A1:D2

Clique em OK.
Exemplo prático: para sabermos a quantidade de registros de pessoas com 35
ou mais anos que pesam menos de 90 kg, digitamos os critérios na segunda
linha, conforme mostrado abaixo.

Vamos agora montar um exemplo com a função BDSOMA.


Abra a planilha Relação de Produtos. Insira algumas linhas acima dela.
Defina alguns critérios como quantidade maior que 6 e valor unitário menor que
5.
Vamos ao cálculo.
Chame o assistente de função.
Para calcular o BDMEDIA, BDMAX o processo é semelhante.

HISTOGRAMA
O histograma é uma forma gráfica de apresentar a distribuição de frequências
de uma variável.
O histograma é um gráfico de barras verticais construído com os resultados da
tabela de frequências.
Primeiro precisamos deixar visível o suplemento Análise de Dados.
Clique na ABA arquivos e depois em opções. Dentre as opções disponíveis
clique em Suplementos.
Em Gerenciar verifique se está marcado a opção Suplementos do Excel e
clique em Ir.
Marque a opção Ferramentas de Análise, marque também as opções de
ferramentas de Análise VBA e Solver que usaremos mais a frente.
Crie uma planilha com alguns valores, vamos imaginar que sejam algumas
notas.

Vamos classificar em ordem Crescente


Assim sei a maior e menor nota. Com isso posso montar a minha planilha
auxiliar, respeitando esta faixa de valores

Com as faixas de valores criados clique na Ferramenta Análise de Dados.


Marque a opção Histograma.

Na janela que se abre primeiro precisamos selecionar o Intervalo de Entrada.


Os valores do intervalo de entrada serão as notas .

No intervalo de Bloco os valores serão os da segunda coluna da planilha


auxiliar que criamos.
Verifique se está marcado a opção Nova Planilha e clique em OK.

Com estes dados podemos gerar nosso gráfico.


Selecione os dados de frequência e monte o gráfico de colunas.
SOLVER
O Solver é um software para programação matemática integrado à planilha
eletrônica, resolvendo problemas de programação linear ou programação linear
inteira. Traduzindo agora: O Solver é uma ferramenta que permite você
resolver problemas de pequeno e médio portes, que visa chegar a uma
otimização no resultado.
Para habilitar o solver no Excel 2010 clique na ABA Arquivo e depois em
Opções.
Clique em Suplementos.
Será mostrada a opção Solver. Clique sobre ela e depois na parte de baixo em
IR.
Na janela que aparece clique em Solver e clique em OK.

A ferramenta ficará disponível na ABA Dados.


Monte a seguinte planilha.

Importante o Solver somente funciona com fórmulas, então os totais de


nossa planilha precisam ser feitos com fórmulas. No caso do total por produto
com multiplicação e o total geral com a função SOMA.
Nosso total deu R$2.210,00, porém a minha verba é de R$2.000,00, e como
não posso alterar o valor unitário, vou precisar alterar a quantidade.
Vamos usar então o solver para resolver esta situação.
Pela ABA Dados clique na ferramenta Solver.
Inicialmente definimos qual é o valor a ser ajustado. No caso a célula E9 (total).
Defina o valor máximo a ser gasto.
Agora precisamos definir que as células a serem modificadas sejam as da
quantidade.
Clique em resolver.
Será perguntado se deseja manter o cenário.
Clique em OK.

Será então modificado os valores na planilha.

TESTE DE HIPÓTESE
Cenários
Cenário é uma das ferramentas que o Excel possui para se trabalhar com
hipóteses.
Vamos imaginar a seguinte planilha.
Selecione as células onde calcularemos o cenário.
Clique na ABA Dados, Teste de Hipótese, Gerenciador de Cenários.

Clique em Adicionar.
Dê o nome de Metas.

Na proxima tela digite os valores desejados.


Clique em OK.

Agora na lista de cenários surgirá o nome do cenário criado. Para testá-lo


clique em mostrar.

Você pode criar diversos cenários e aplicá-los em sua planilha. Crie um


segundo cenário.
Clique em Teste de Hipóteses, Gerenciador de Cenários.
Clique em Resumir.Selecione uma célula e clique em OK.
Será feito um resumo do cenário.
Atingir Meta
O recurso Atingir Meta no Excel, tem por finalidade alterar o valor de uma
célula para que uma fórmula atinja determinado valor.

você tem uma prestação, sabe o quanto emprestou, em quantas parcelas, e o


quanto paga por parcela, porém gostaria de saber a taxa aplicada no seu
empréstimo.
Vamos montar a seguinte planilha.

Vamos calcular agora o valor do pagamento. Chame o assistente de função e


preencha com os seguintes dados.
A função ficará PGTO(B3/12;B4;-B2)

Apenas lembrando:
• Taxa: taxa de juros para o empréstimo.
• nper: número total de pagamentos pelo empréstimo.
• VP: valor principal, ou o valor emprestado.
• VF: valor futuro, ou o saldo que se deseja ter ao final dos períodos, se
for omitido será 0.
• Tipo: indica o vencimento das parcelas. 0 no final do período e 1 no
início do período
Vamos usar agora o comando Atingir Meta.
Clique na ABA Dados, Teste de Hipóteses, Atingir Meta.
Selecione o campo definir célula e coloque o campo do valor. Defina um valor
que se pretende atingir e Alternando Célula selecione a célula que se quer para
o valor desejado.

Clique em OK.

FORMULÁRIOS EM EXCEL
Nas versões 2007/2010 do Excel não se trabalham mais com barras de
ferramentas. Então para se criar formulários, é preciso primeiro dizer ao Excel
que se quer trabalhar com eles.
Clique no botão Office 2007 ou Opção Arquivo se for o 2010.
Clique em Opções.
No excel 2010 Na janela que aparece, marque a opção "Mostrar guia
Desenvolvedor na Faixa de Opções".
No 2010 clique em Personalizar Faixa de opções e marque a opção
Desenvolvedor.
Clique em OK.

Na dica acima aprendemos como mostrar a barra de formulário no Excel


2007/2010. Para as versões anteriores use a barra de ferramenta Formulários.
Vamos criar a seguinte planilha
A primeira ABA renomeie para Resumo de venda. E monte da seguinte forma.
Na planilha ao lado dê o nome de Dados e monte a seguinte estrutura.

Esta planilha contém 3 tabelas com áreas nomeadas que visam facilitar o
trabalho com os objetos de formulários do Excel. A primeira tabela indica o
fator referente às despesas de Frete e Seguro (intervalo de A2 até B5). A
segunda tabela indica o número de prestações e a taxa de juros para cada
parcela (intervalo de D2 até E15). A terceira tabela indica a lista de produtos e
o seu respectivo preço (intervalo de G2 até H10).

Vamos agora montar então nosso formulário.


Volte à planilha Resumo e desenhe uma Caixa de combinação na célula B2.
Clique com o botão direito do mouse nele e escolha Formatar Controle.
Adicione conforme imagem.
Na célula B3, vamos inserir uma função que irá pesquisar o valor do produto na
planilha Apoio, em uma área chamada Tabela. Para o nosso exemplo vamos
usar a função ÍNDICE da seguinte forma: =ÍNDICE(produto;B2;2).

Na célula C4, vamos inserir um controle que irá informar a quantidade de


produtos a serem adquiridos. Dessa forma insira um Controle giratório, usando
o botão direito sobre ele.

Clique com o botão direito sobre ele e depois em Formatar Controle.


Preencha da seguinte forma:
No exemplo fiz algumas modificações de ordem dos dados na planilha
para me facilitar os cálculos. Eliminei linhas vazias.
Na célula C6 adicione outro controle giratório com os seguintes valores.

Na célula B6, devemos inserir uma fórmula que irá exibir o valor da entrada em
Percentual. Dessa forma insira a seguinte fórmula: =C6/100
Em C7, desenhe um Barra de rolagem, usando o botão direito sobre ela.
Na célula B8 vamos inserir uma fórmula que faz o cálculo da taxa de juros, com
base no número de parcelas selecionada. =ÍNDICE(dados!D4:E15;B7;2).
Na célula B9 vamos inserir uma fórmula para exibir o valor da entrada, dessa
forma digite: =B5*B6.
Na célula B10, devemos inserir uma fórmula que, com base no valor da
entrada, Taxa de Juros, Número de parcela, Valor total e subtraindo a entrada
informada irá exibir o valor da parcela. Dessa forma digite a seguinte fórmula:
=SE(B6=1;0;PGTO(B8;B7;B5*(B6-1))).
Para finalizar devemos indicar o valor total da venda, de forma que na célula
B11, insira a seguinte fórmula: =B10*B7+B9

Formate a sua planilha da seguinte forma:

Na célula D3 insira uma Caixa de grupo e digite o seguinte título: Local da


Entrega.
Na caixa de grupo, adicione 3 botões e aplique os nomes conforme relação de
frete.

Selecione um dos botão e clique com o botão direito. Defina como célula
Destina a célula E10.
Na célula B5, vamos inserir uma fórmula que irá exibir o valor total da compra,
com base no local de entrega Dessa forma devemos inserir a fórmula:
=(B3*B4)*ÍNDICE(dados!A3:B5;E10;2).

Para que os números exibidos nas células C6 e E10 sejam ocultos, selecione
estas células e aplique o formato personalizado ;;; (três pontos e vírgulas) para
ocultar a apresentação das informações das células.
Salve e teste a sua planilha.

MACROS
Podemos também automatizar tarefa repetidas. A este recurso chamamos de
Macros. As macros são rotinas que utilizam o Visual Basic e que podem ser
criadas sem o conhecimento de programação mas, utilizam lógica.
Para podermos criar Macros no Excel o comando fica na ABA Exibição

Vamos criar uma macro que faça a classificação por sexo em nossa planilha de
atletas.
Abra a planilha.
Atenção: Ao iniciar a gravação de uma MACRO todo comando feito
será gravado, então planeje toda a ação antecipadamente.
No caso nós selecionaremos a planilha principal e faremos a seleção por sexo.
Selecione a planilha.

Clique no botão Macro, gravar nova macro.

Será mostrada uma janela, onde deve se colocar o nome da Macro, pode-se
atribuir a ela uma tecla de Atalho, a descrição da macro e se ela será atribuída
somente a esta pasta de trabalho ou se ela será associada a uma pasta de
macros. Mantenha a esta pasta de trabalho.
Ao clicar em OK, a Macro começara a ser gravada. Ao iniciar vá aé a ABA
Dados Classificar , escolha calssificação por sexo.

Após clique novamente em Exibição, Dados, parar gravação.

Para poder visualizar suas macros, clique no botão Macros, Exibir Macros.
Atribuindo botões que mostram as Macros
Para criar uma forma mais fácil para usarmos as macros, podemos criar botões
e adicionar a eles nossas Macros.

No exemplo de uso do formulário, nós habilitamos a barra de desenvolvedor,


vamos usá-la para criar nossos botões.
Clique na ABA Desenvolvedor.

Dentro do grupo Controles clique na opção Inserir, escolha botão.


Desenhe o botão, ao finalizar o desenho do botão, observe que será aberta a
tela de associar a Macro. Clique sobre a Macro que criamos.

Clique em OK.
Clique em OK.
Para testar Cassifique manualmente sua planilha por nome e depois clique no
botão e observe que será executada a Macro.

Repita o processo para as demais classificações: Nome, modalidade e


categoria.
VBA – Visual Basic Application
O Editor do Visual Basic é uma ferramenta poderosa que permite a você
estender os recursos e a versatilidade das macros para qualquer tarefa que
possa ser executada através de gravação.
Podemos por exemplo visualizar o código de nossas macros.
Clique no botão Macros.

Clique na Macro CLCategoria e escolha Editar.


Será mostrada a janela do Editor de VBA.
Observe que a estrutura de uma Macro inicia com o comando Sub e fecha com
End Sub.
Dentro deste bloco é apresentado o código para que seja possível efetuar a
Macro.
Vamos criar uma aplicação simples de saudação com VBA.
Na guia Desenvolvedor clique em Visual Basic.
Clique no Menu INSERIR > UserForm.

Será mostrada a janela dede seu formulário e a caixa de ferramentas.


Clique no comando CommandButonn e desenhe um botão na tela.
Dê um duplo clique no botão para que se abra a janela de código.

Observe que foi gerado o bloco Sub – End Sub. Observe que ele adiciona o
componente CommandButton1_Click, que identifica que ele funcionará através
de um clique no botão.
Vamos adicionar um código que exiba uma caixa de mensagem.
Adicione: MsgBox "Olá mundo do Excel".

Para rodar a sua aplicação clique no botão Play que aparece na barra de
ferramentas da janela.
O VBA é um capitulo a parte dentro do Excel que precisa de somente um
estudo a ele. Para entender todos seus comandos, funções, etc. Vamos para
entender um pouco mais desenvolver uma aplicação usando alguns recursos
do VBA.
Vamos montar um calendário. Em um novo arquivo do Excel, chame o editor
do Visual Basic.

Crie um formulário.
Pela caixa de propriedades vamos inserir em nosso formulário três
componentes Label e dois TextBox e um botão de comando.

Clique no Label 1 e depois na caixa de propriedades.


Neste Label mude o Caption para Exemplo e defina as propriedades de Fonte
como desejar.

No texbox alteraremos somente sua propriedade name que esta com o nome
de textbox1 para text_nome e a texbox2 para text_recebenome .
O mesmo iremos fazer para o botão de comando que na sua propriedade name
na qual esta com o nome de commandbutton1 iremos alterar para comando.
Selecione agora a janela do formulário. Basta clicar sobre ela.
Coloque o nome como Form_ Exemplo.

Vamos também dimensionar a altura e a largura. Estas são as propriedades


Height e Width.
Altere também os labels antes das caixas de texto.

Dê um duplo clique no botão e será aberto a janela de edição de código.


Acrescente o seguinte código.

Clique no botão para rodar a sua aplicação.

Digite um nome na primeira caixa e clique no botão. Observe que ela será
escrita na caixa de baixo.
O exemplo acima é apenas uma demonstração pequena do poder do VBA,
visto que sua abrangência é longa e complexa.

PASTAS DE TRABALHOS COMPARTILHADAS


Uma pasta de trabalho compartilhada permite que diversas pessoas a editem
simultaneamente. Isso é especialmente útil para gerenciar listas (lista: uma
série de linhas que contêm dados relacionados ou que você determina que
funcione como uma folha de dados, usando o comando Criar Lista.) que são
alteradas com frequência.
Por exemplo, se cada pessoa do seu grupo de trabalho lidar com diversos
projetos e precisar conhecer o status das outras pessoas, o grupo poderá usar
uma lista em uma pasta de trabalho compartilhada em que cada pessoa insere
e atualiza uma linha de informações sobre cada projeto.
Para ativar a pasta compartilhada clique no ABA Revisão e depois em
Compartilhar Pasta de Trabalho.
Marque a opção de compartilhamento.
Em avançadas você pode definir o que pode ou não ser alterado.
O seguintes recursos não poderão ser alterados após uma pasta de trabalho
ser compartilhada: células mescladas, formatos condicionais, validação de
dados, gráficos, imagens, objetos incluindo objetos de desenho, hiperlinks,
cenários, estruturas de tópicos, subtotais, tabelas de dados, relatórios da tabela
dinâmica, proteção de pasta de trabalho e planilha, e macros.
Ao clicar em OK para que você saiba que sua planilha esteja compartilhada,
observe que no título do arquivo aparece [compartilhado].
Observe dois usuários compartilhando a mesma planilha.
Para que seja possível marcar onde houve alterações. Cllique no botão realçar
alterações e marque as opções.

Conforme for modificando as células o excel colocar as marcações.


CONCLUSÃO
E Microsoft Excel é com certeza uma das aplicações mais utilizadas em todo o
planeta. É atualmente a planilha eletrônica dominante e especialistas dizem
que as pessoas que usam e bem o Excel não exploraram 10% de seu potencia.
É isso que o faz tão surpreendente, pois o limite dele é a necessidade do
usuário.
Com isso nosso curso é concluído, porém a utilização do Excel somente irá se
expandir conforme mais você utilizar e aprender com ele.
Obrigado!
Conteúdo
1 Introdução 8

2 Conceitos Básicos 8
2.1 O que é um Macro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Técnicas de construção dum Macro . . . . . . . . . . . . . . . . . . . . . 9
2.3 Gravação de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 A escrita de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5 O editor de VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6 Criação de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3 Variáveis e Tipos de Dados 14


3.1 Conceito de variável . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2 Criação das variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4 A operação de Atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.5 O uso de constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4 Como trabalhar com Objectos 19


4.1 Propriedades, Métodos e Eventos . . . . . . . . . . . . . . . . . . . . . . 20
4.1.1 Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1.2 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.3 Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2 Os objectos do Excel mais comuns . . . . . . . . . . . . . . . . . . . . . . 23
4.2.1 Como trabalhar com as propriedades dos objectos Excel . . . . . 23
4.2.2 Como aplicar métodos aos objectos . . . . . . . . . . . . . . . . . 24
4.3 Objectos gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3.1 MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3.2 InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.4 Botões de Comando . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.5 Rótulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.6 Caixas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.7 Botões de Opção . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3.8 Caixas de Verificação . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3.9 Quadros (Frames) . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3.10 Caixas de Listagem . . . . . . . . . . . . . . . . . . . . . . . . . . 32

5 Estruturas de controlo do programa 34


5.1 Estruturas de controlo condicional . . . . . . . . . . . . . . . . . . . . . . 34
5.1.1 If...Then...Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.1.2 If...Then . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.1.3 Estruturas condicionais embutidas . . . . . . . . . . . . . . . . . . 37
5.2 Estruturas de controlo repetitivo . . . . . . . . . . . . . . . . . . . . . . 38
5.2.1 Estruturas de Controlo Do...Loop . . . . . . . . . . . . . . . . . . 38
5.2.2 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . 40

3
5.2.3 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . 41
5.2.4 Estrutura de Controlo For..To..Next . . . . . . . . . . . . . . . . . 43
5.2.5 Estruturas de controlo repetitivo imbricadas . . . . . . . . . . . . 44
5.3 Variáveis indexadas - vectores e matrizes . . . . . . . . . . . . . . . . . . 46
5.3.1 Declaração de vectores . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.2 Processamento de vectores . . . . . . . . . . . . . . . . . . . . . . 48

6 Funções e Procedimentos 50
6.1 Exemplo de função criada pelo programador . . . . . . . . . . . . . . . . 51
6.2 Como aceder às funções standard do Excel . . . . . . . . . . . . . . . . . 52

7 Programação do Excel usando VBA 52


7.1 Trabalhar com objectos Workbook . . . . . . . . . . . . . . . . . . . . . . 53
7.2 Trabalhar com objectos Worksheet . . . . . . . . . . . . . . . . . . . . . 53
7.2.1 Propriedades de Worksheet . . . . . . . . . . . . . . . . . . . . . . 53
7.2.2 Métodos de Worksheet . . . . . . . . . . . . . . . . . . . . . . . . 54
7.3 Trabalhar com objectos Range . . . . . . . . . . . . . . . . . . . . . . . . 54

8 Adicionando uma interface gráfica 56


8.1 Instalação da Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
8.2 Instalação dos Controlos . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
8.3 Incorporação da Form na sub-rotina . . . . . . . . . . . . . . . . . . . . . 58
8.3.1 Como visualizar e terminar uma Form . . . . . . . . . . . . . . . 59
8.3.2 Tratamento de eventos através de Event Handlers . . . . . . . . . 59
8.3.3 Como recolher os resultados de uma Form . . . . . . . . . . . . . 60
8.3.4 Exemplo de aplicação . . . . . . . . . . . . . . . . . . . . . . . . . 60
8.4 Exemplo de aplicação mais elaborado . . . . . . . . . . . . . . . . . . . . 62

9 Notas finais 63

4
Lista de Figuras
1 Janela de invocação do ambiente de Gravação de Macros . . . . . . . . . 9
2 Janela de Gestão de Macros . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Barra de Ferramentas de VBA . . . . . . . . . . . . . . . . . . . . . . . . 10
4 Editor integrado do VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5 Criação de novo Módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6 Diferentes tipos de dados e o seu armazenamento em memória . . . . . . 15
7 Como forçar a declaração explícita automaticamente . . . . . . . . . . . 16
8 Uma Form e vários Controlos . . . . . . . . . . . . . . . . . . . . . . . . 19
9 Janela de Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
10 Lista de eventos disponíveis . . . . . . . . . . . . . . . . . . . . . . . . . 22
11 Objectos e Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
12 Exemplo de MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
13 Exemplo de InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
14 Vários optionButton agrupados numa frame . . . . . . . . . . . . . . . . 30
15 Vários checkBox agrupadas numa frame . . . . . . . . . . . . . . . . . . 31
16 Uma Frame agrupando três botões de comando . . . . . . . . . . . . . . 31
17 Exemplo de listBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
18 Estrutura de controlo condicional If...Then...Else . . . . . . . . . . . . . 34
19 Estrutura de controlo condicional If...Then . . . . . . . . . . . . . . . . 35
20 Estruturas de controlo condicional imbricadas . . . . . . . . . . . . . . . 37
21 Estrutura de controlo repetitivo Do...While . . . . . . . . . . . . . . . . 39
22 Estrutura de controlo repetitivo Do...Until . . . . . . . . . . . . . . . . 40
23 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . . . . . 41
24 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . . . . . 42
25 Exemplo de Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . . . . 45
26 Um vector é uma variável múltipla . . . . . . . . . . . . . . . . . . . . . 46
27 Um exemplo de vector de strings . . . . . . . . . . . . . . . . . . . . . . 47
28 Porquê usar ciclos para processar vectores? . . . . . . . . . . . . . . . . . 48
29 Funções como caixas pretas . . . . . . . . . . . . . . . . . . . . . . . . . 51
30 Utilização da função margemLucro numa fórmula . . . . . . . . . . . . . 52
31 Criação de uma Form no VBA . . . . . . . . . . . . . . . . . . . . . . . 57
32 A UserForm para Entrada Múltipla de Dados . . . . . . . . . . . . . . . 61
33 Objecto da classe Tabstrip . . . . . . . . . . . . . . . . . . . . . . . . . . 62

5
Lista de Tabelas
1 Tipos de dados suportados pelo VBA . . . . . . . . . . . . . . . . . . . . 17
2 Propriedades mais comuns dos objectos gráficos VBA . . . . . . . . . . . 20
3 Valores de configuração das características de uma Caixa de Mensagem . 26
4 Valores devolvidos por uma Caixa de Mensagem . . . . . . . . . . . . . . 27

6
Listings
1 VerificaValor - exemplo de função definida pelo utilizador . . . . . . . . . 12
2 verificaGama - exemplo de função definida pelo utilizador . . . . . . . . . 13
3 Exemplo de aplicação de If..Then..Else imbricados . . . . . . . . . . . . 38
4 FormataBordo - exemplo de sub-rotina usando For..Next . . . . . . . . . 44
5 Exemplo usando Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . 45
6 Exemplo de processamento de um vector . . . . . . . . . . . . . . . . . . 49
7 Outro exemplo de processamento de um vector . . . . . . . . . . . . . . . 49
8 Função margemLucro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
9 Sub-rotina InsereLinhas . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
10 Handler do objecto cmdFechar para o evento click . . . . . . . . . . . . 59
11 Exemplo de sub-rotina de invocação de uma UserForm . . . . . . . . . . 60
12 Exemplo de sub-rotina de inicialização de uma UserForm . . . . . . . . . 61
13 Handler do objecto cmdFechar para o evento Click . . . . . . . . . . . . 61
14 Sub-rotina de inicialização da UserForm . . . . . . . . . . . . . . . . . . 62
15 Handler associado ao objecto Tabstrip1 para o evento Change . . . . . . 63

7
1 Introdução
Este texto tem como objectivo apoiar o ensino das técnicas de programação de compu-
tadores, utilizando, como ambiente de aplicação, programas como o gestor de folhas de
cálculo Excel.
Destina-se assim aos alunos que já possuem alguns conhecimentos da utilização e
funcionamento desta aplicação. Concretamente, presume-se que estão já familiarizados
com os conceitos de folha de cálculo, de livro de trabalho, de fórmulas e funções standard.
A linguagem de programação que vai ser utilizada será o VBA (Visual Basic for
Applications). É uma linguagem que permite acrescentar capacidades adicionais a certo
tipo de aplicações informáticas, concretamente as pertencentes ao Microsoft Office, entre
as quais o Excel e o Word. Permite ainda automatizar a realização de muitas tarefas
rotineiras nessas aplicações.
Como o próprio nome indica, trata-se duma adaptação da linguagem genérica de
programação Visual Basic de modo a poder ser utilizada no ambiente específico das
aplicações Office.

2 Conceitos Básicos
O VBA constitui uma ferramenta poderosa nas mãos de programadores experimentados
mas pode, ao mesmo tempo, ser muito útil a qualquer utilizador, mesmo inexperiente.
De facto, no dia a dia da utilização destas aplicações, defrontamo-nos com a neces-
sidade de repetir a mesma tarefa várias vezes ao dia ou, de em certas ocasiões, ter que
repetir uma determinada tarefa uma série de vezes de seguida. Seja escrever ou formatar
um certo texto, seja executar uma série de comandos ou escolher opções de menus, seja
ainda realizar a formatação complexa de um documento, são inúmeras as ocasiões em
que dava jeito poder automatizar essas tarefas repetitivas.
É aqui que entra o VBA, permitindo a construção daquilo que se designa vulgarmente
por macros.

2.1 O que é um Macro?


Um macro contem uma lista das instruções a realizar para executar uma determinada
tarefa. No fundo, é um programa escrito em VBA, que indica a uma aplicação como o
Excel quais os passos a dar para atingir um objectivo específico. Pode-se dizer que um
macro não é mais que uma descrição formalizada das tarefas que se pretende automatizar.
Os macros incluem instruções que interagem com elementos da aplicação. Por exem-
plo, quando, numa aplicação Office se pretende fechar uma janela, pode-se seleccionar a
opção de menu Close. Um macro escrito em VBA, usará a seguinte instrução para obter
o mesmo efeito:
ActiveWindow.Close
Existem duas formas alternativas de criar um macro mas a forma como ele é criado
não muda o seu conteúdo, continuando a ser um contentor de uma lista de instruções a
realizar pela aplicação em que está instalado.

8
2.2 Técnicas de construção dum Macro
Se bem que um macro seja um programa em VBA, nem sempre é necessário escrevê-lo de
forma explícita, ou seja, escrevendo especificamente as instruções VBA que o compõem.
Sobretudo quando os macros são simples, é muitas vezes mais prático criá-los de forma
automática, gravando a sequência de passos que ele deverá executar na aplicação.
Esta forma de criar um macro corresponde a mostrar ao computador o que fazer
para conseguir obter o resultado pretendido. O utilizador indica ao programa que se
vai entrar num modo de gravação do macro e inicia a execução da sequência de acções
que normalmente teria que executar. Quando chega ao fim dessa sequência, indica ao
programa que a gravação terminou. Após ter atribuído a essa sequência uma combinação
de teclas especial, esse macro estará pronto a ser executado, substituindo assim o conjunto
de acções que anteriormente seriam necessárias. Tudo se passa como se estivéssemos a
ensinar a aplicação pelo exemplo.
Se se investigar, no entanto, o conteúdo desse macro, verificar-se-á que ele é composto
precisamente por instruções escritas em VBA, sendo que a cada acção ou comando da
aplicação corresponderá uma instrução (ou conjunto de instruções) específica do macro.
A forma alternativa de construir um macro será assim introduzir essas instruções num
editor de texto apropriado. É essa, de facto, a forma de criar um macro quando o seu
âmbito é algo não trivial.

2.3 Gravação de um Macro


Quando uma dada operação envolvendo uma série de acções deva ser utilizada frequen-
temente faz sentido tentar automatizar a sua execução.
Para gravar um macro que seja capaz de efectuar essas acções, haverá que invocar o
modo de gravação de macros, mediante o Menu "Tools/Macros/Record a New Macro"
(em Excel), o que fará aparecer a janela descrita da Figura 1. Nela se pode especificar o
nome do macro, a localização em que será armazenado, uma descrição das suas funções
e ainda a combinação de teclas (Shortcut key) que será utilizada para arrancar com o
macro, uma vez este construído.

Figura 1: Janela de invocação do ambiente de Gravação de Macros

9
Figura 2: Janela de Gestão de Macros

Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar
o processo de gravação e dever-se-á dar início à execução das acções que o macro vai
substituir. Quando se tiver executado a última acção a incluir no macro, basta dar a
indicação de que a gravação terminou.
Uma vez tal realizado, esse macro passará a estar disponível mediante a invocação
da combinação de teclas especificada anteriormente (no caso da Figura 1 na página pre-
cedente, seria Ctrl+Shft+M) e realizará, de forma automática, exactamente a mesma
sequência de acções que tínhamos realizado manualmente.
Em alternativa, mediante a combinação de teclas ALT-F8, pode ser accionada a janela
de Gestão de Macros (Figura 2), onde, entre outras acções, pode ser escolhido o macro a
ser executado.
Para facilitar o acesso às facilidades de gravação e edição de macros, será conveniente
tornar visível de forma permanente a barra de ferramentas de Visual Basic (Figura 3).
No Excel, isto poderá fazer-se mediante a opção de Menu "View/Toolbars/Visual Basic".

Figura 3: Barra de Ferramentas de VBA

2.4 A escrita de um Macro


Ensinar pelo exemplo ao Excel como fazer as coisas é um método expedito de construir
um macro, mas tem as suas limitações. Já que um macro não é mais que um programa

10
escrito em VBA, porque não tratá-lo como tal e aceder ao seu código, alterando-o de
forma a melhorar a sua eficiência ou a corrigir problemas. E já agora, porque não criá-los
de raiz, aproveitando todo o poder duma linguagem como o VBA?

2.5 O editor de VBA


Para aceder ao editor especializado de Visual Basic (Figura 4), que se encontra integrado
no próprio Excel, basta utilizar o icone adequado na barra de ferramentas ou usar direc-
tamente a combinação de teclas ALT-F11. Tornando a premir esta combinação de teclas,
voltaremos à nossa folha de cálculo. A este editor especializado é também dado o nome de
Integrated Development Environment (IDE) ou Ambiente de Desenvolvimento Integrado
e é semelhante à aplicação autónoma usada para o desenvolvimento de programas em
Visual Basic.

Figura 4: Editor integrado do VBA

Do lado esquerdo na Figura 4 podem-se ver duas janelas, a primeira das quais é
designada por Explorador de Projectos e que serve para mostrar o conteúdo do projecto
VBA actual. Um projecto em VBA inclui um ficheiro duma aplicação Office (como, por
exemplo, uma folha de cálculo do Excel) e todos os ficheiros VBA associados, incluindo
os próprios macros e eventuais user forms (janelas de interface próprias utilizadas pelos

11
Figura 5: Criação de novo Módulo

macros1 ).
Para poder começar a escrever macros usando o VBA é necessário criar um módulo
que o possa albergar, o que é conseguido usando a opção de menu "Insert/Module".
Como consequência, para além do novo módulo aparecer referido na janela do Explora-
dor de Projectos, será criada uma janela nova onde será possível escrever o código que
constitui o novo macro. Se já existir algum módulo criado, bastará seleccionar o módulo
pretendido no explorador de projectos, posicionar o cursor na janela correspondente a
esse módulo, numa área fora de qualquer macro já existente, e seleccionar a opção de
menu "Insert/Procedure". Aparecerá uma janela própria (Figura 5) onde será possível
dar o nome ao novo procedimento (o conjunto de instruções que constituirá o macro),
especificar o tipo de macro que vai ser construído (função ou procedimento2 ) e qual o
âmbito da sua utilização (privada ou pública, ou seja, limitada ou não ao ficheiro actual).

2.6 Criação de um Macro


Está na hora de construir o primeiro macro em VBA. Suponhamos que se pretende criar
um macro que verifique se o valor presente numa determinada célula é superior a um
dado limite e que, caso seja, disso notifique o utilizador. A sub-rotina em que esse macro
deverá assentar poderá ter o seguinte conteúdo:
Listing 1: VerificaValor - exemplo de função definida pelo utilizador
1 Public Sub v e r i f i c a V a l o r ( )
2 I f C e l l s ( 2 , 2 ) > 100 Then
3 MsgBox " Valor ␣maximo␣ e x c e d i d o ! "
4 End I f
5 End Sub
1
Sobre o assunto, ver Secção 8.
2
A distinção entre funções e procedimentos (ou sub-rotinas) será abordada mais à frente.

12
Não nos vamos de momento preocupar com os detalhes do código que constitui o
macro. Basta verificar que, em 1o lugar, é constituído por uma linha de cabeçalho que
especifica o tipo de macro (neste caso, uma sub-rotina (Sub) ou procedimento) e o seu
nome (verificaValor). O corpo do macro é composto pela estrutura de controle condici-
onal (If...Then 3 ) que vai verificar se o conteúdo da célula B24 é ou não maior que o valor
200. Caso essa condição seja verdadeira, o macro apresentará uma mensagem no ecran
dizendo que o valor máximo foi excedido. Finalmente, o macro é terminado com uma
linha contendo "End Sub".
O que este simples macro faz, portanto, é verificar o conteúdo de uma célula específica
da folha de cálculo e avisar o utilizador caso o valor nela contido ultrapassar um valor
pré-determinado. Sempre que for necessário fazer esta verificação, bastará invocar a
combinação de teclas que tenha sido associada a este macro.
É verdade que sta verificação poderia ter sido realizada colocando numa célula uma
fórmula contendo a função standard do Excel IF. Mas suponhamos agora que se pretende
algo mais complicado, por exemplo, fazer essa verificação num conjunto de células e
apenas desencadear o alarme caso mais do que duas dessas células ultrapassem o limite
estabelecido. A sub-rotina modificada poderia ser algo como:
Listing 2: verificaGama - exemplo de função definida pelo utilizador
1 Public Sub v e r i f i c a G a m a ( )
2 Dim i As Integer , c As Integer
3 c = 0
4 For i = 1 To 5
5 I f C e l l s ( i , 3 ) > 100 Then
6 c = c + 1
7 End I f
8 Next
9 I f c > 2 Then
10 MsgBox c & "␣ v a l o r e s ␣ s u p e r i o r e s ␣ ao ␣ l i m i t e ! "
11 End I f
12 End Sub

A verificação é agora repetida em todas as células de C1 a C5 graças aos serviços


da estrutura de controlo repetitivo For...To...Next 5 que executará 5 vezes as instruções
contidas nas linhas 5 a 7. Para além de verificar o conteúdo da célula em análise, é ainda
actualizado um contador, baseado na variável c (ver linha 6), sempre que o valor contido
nessa célula ultrapasse o limite. Só quando o valor desse contador for maior que 2 será
gerada a mensagem de alarme.
Estaremos já em posição de perceber a utilidade de construir os macros usando di-
rectamente o VBA. Não seria trivial resolver este problema usando apenas fórmulas e
certamente impossível executando comandos e seleccionando menus do Excel.
A um macro criado usando directamente o VBA pode também ser associada uma
combinação de teclas que facilite o seu acesso. Isso pode ser feito através do botão
3
Ver Secção 5.1.2 na página 35.
4
Cells(2,2) refere-se à célula B2 (2a coluna, 2a linha)
5
Ver Secção 5.2.4 na página 43.

13
Options na Janela de Gestão de Macros, invocada mediante ALT-F8.

3 Variáveis e Tipos de Dados


A informação processada por um macro pode ser de diferente natureza e existir em di-
ferentes formatos. Genericamente um programa pode utilizar, entre outras, informação
numérica e informação chamada alfa-numérica, ou seja texto. A linguagem VBA conse-
gue lidar com informação de diversos tipos, que detalharemos adiante na Secção 3.3 na
página 16.

3.1 Conceito de variável


Uma variável é uma localização de memória em que a informação pode ser guardada de
modo a ser usada por um macro. Cada variável é caracterizada pelo seu nome e pelo seu
tipo, ou seja, o tipo de dados que pode armazenar. O conteúdo de uma variável pode
mudar durante a execução do macro. Existem algumas regras governando a escolha do
nome duma variável:

1. Deve obrigatoriamente começar por uma letra;

2. Não pode conter espaços nem caracteres como vírgulas ou pontos;

3. Não pode exceder 255 caracteres;

4. Não pode ser igual a uma palavra reservada para o VBA.

O tipo da variável especifica qual o tipo de dados que pode conter. Uma variável de um
determinado tipo não está preparada para armazenar dados de um tipo diferente. A razão
para este facto é que o espaço necessário para armazenar diferentes tipos de dados não é
o mesmo. Enquanto um inteiro simples pode ser guardado em 2 bytes de memória 6 , para
guardar um número real podem ser necessários 8 bytes (ou mesmo mais, dependendo da
precisão requerida). A Figura 6 na página seguinte ilustra graficamente esta realidade.

3.2 Criação das variáveis


Ao acto de criação de variáveis chama-se declaração. Criar uma variável envolve dar-lhe
um nome e reservar em memória o espaço necessário para que ela possa guardar o tipo de
dados para o qual está a ser criada. O acto de declarar a variável informa o VBA àcerca
do nome pelo qual ela será conhecida assim como qual o tipo de dados que ela deverá
estar preparada para receber.
Como é óbvio, nenhuma variável pode ser utilizada antes de ser criada. A declaração
deve, pois, preceder a sua utilização. Desde que se siga esta regra, é possível inserir
declarações em qualquer ponto do macro. No entanto, é boa prática agrupar todas as
6
Para armazenar números que podem variar entre -32768 e 32767, ou seja 65536 valores diferentes, há
necessidade de dispor de 16 unidades básicas de informação (bits), ou seja dois bytes (1 byte = 8 bits).
De facto, se cada bit apenas pode representar um valor binário (0 ou 1), 16 bits poderão representar até
216 = 65536 valores diferentes.

14
Figura 6: Diferentes tipos de dados e o seu armazenamento em memória

declarações necessárias num bloco a colocar no início, para mais fácil manutenção do
programa.
Em VBA, existem duas formas de declaração de variáveis: explícita e implícita. A
declaração explícita exige a utilização da instrução específica
Dim ... As (Dimensionar ... Como).
Por exemplo, a instrução
Dim Preço As Integer
cria (declara) uma variável com o nome Preço e do tipo Integer, ou seja, dimensio-
nada para receber dados do tipo integer (inteiro simples7 ).
A declaração implícita resume-se a utilizar pela primeira vez uma variável sem qual-
quer declaração explícita prévia, dando-lhe um nome e atribuindo-lhe um valor. O VBA
criará automaticamente a variável do tipo pretendido.
Esta segunda forma de declarar variáveis tem, a despeito da sua simplicidade, um
problema grave: é possível, por distracção, criar uma variável nova indesejada, quando o
que se pretendia era apenas escrever o nome de uma variável já existente. Suponha, por
exemplo, que havia criado uma variável "Distancia" mediante a instrução8 :
7
A discussão dos vários tipos de dados suportados pelo VBA será feita na Secção 3.3 na próxima
página.
8
Como se verá na secção 3.4 na página 17, esta instrução guarda na variável "Distancia"o valor 1260

15
Distancia=1260
Como é a primeira vez que o VBA encontra esta palavra ("Distancia"), partirá do
princípio que se trata de uma variável ainda por declarar e tratará de a criar, substituindo-
se ao programador. Dar-lhe-á o nome "Distancia" e dimensiona-la-á de forma a poder
guardar inteiros simples, já que é essa a utilização sugerida na instrução.
Agora suponha que adiante no programa, por engano, escrevia "Distncia" ao referir-se
à variável em causa. O VBA não emitirá nenhum alerta, já que aceitou tranquilamente
"Distncia" como uma nova variável. A forma mais prudente de lidar com declarações de
variáveis é, pois, utilizar apenas declarações explícitas, e instruir o VBA para não aceitar
declarações implícitas, gerando uma mensagem de erro apropriada. Para tal, deverá ser
acrescentada a instrução Option Explicit no início do módulo contendo o macro.

Figura 7: Como forçar a declaração explícita automaticamente

Se se pretender que seja esse o comportamento automático do VBA em todos os mó-


dulos, deverá seleccionar-se no Editor do VBA a opção "Require Variable Declaration"no
sub-menu Options do menu Tools.

3.3 Tipos de Dados


Como já vimos, um macro deverá poder lidar com diferentes tipos de dados. A lingua-
gem VBA suporta, entre outros, o tratamento dos seguintes tipos de dados descritos na
Tabela 1 na próxima página
Quando declaramos variáveis dever-se-á, em princípio, especificar qual o tipo de dados
que ela irá suportar. No entanto, em VBA é possível omitir a especificação do tipo de
dados na declaração de variáveis. O VBA criará uma variável do tipo Variant capaz de
armazenar qualquer tipo de dados. O que, à partida, parece uma boa ideia acaba por
não o ser porque, entre outros motivos, implica um gasto excessivo de memória e torna
a execução dos macros mais lenta. Será, portanto, de evitar, na medida do possível.

16
Tipo Descrição
Integer Inteiro simples, usado para representar inteiros entre -32768 e 32767
Long Inteiro longo, ou seja, compreendido entre -2.147.483.648 e
2.147.483.647
Single Real representado com precisão simples, com valores negativos compre-
endidos entre cerca de -3,4E38 e -1,4E-45 e valores positivos entre cerca
de 1,4E-45 e 3,4E38
Double Real representado com precisão dupla, usado para representar números
reais muito maiores ou muito mais pequenos que com o tipo single
String Usado para representar texto (informação alfanumérica como letras,
algarismos e símbolos especiais); strings são representadas entre aspas
Boolean Usado para representar valores lógicos (True ou False)
Date Usado para representar datas ou valores de tempo; são representados
entre caracteres #
Object Serve para guardar referências a objectos

Tabela 1: Tipos de dados suportados pelo VBA

3.4 A operação de Atribuição


A operação de Atribuição permite guardar um dado numa variável, ou seja, atribuir-lhe
um valor. A sintaxe utilizada por esta operação é a seguinte:
Variável = Valor
O resultado da operação será, portanto, o de guardar Valor em Variável. Valor
pode ser um valor constante ou o conteúdo de outra variável. Neste caso, a atribuição
consistirá na cópia do conteúdo de uma variável para outra do mesmo tipo. A instrução
seguinte copia o valor contido na variável idade para a variável temp (partimos do
princípio que ambas são do tipo integer ):
temp = idade
Pode ainda ser atribuído a um variável o resultado de uma expressão ou o valor
devolvido por uma função. Atente-se nos seguintes exemplos:
total = peso1 + peso2
resultado = sqrt(2+peso)
No 1o exemplo, o VBA resolverá em primeiro lugar a expressão à direita do operador
de atribuição (=), somando os conteúdos das variáveis peso1 e peso2, após o que copiará
esse resultado para a variável total.
No 2o exemplo, a expressão à direita é composta por uma função standard do VBA
(sqrt()). Esta função calcula a raiz quadrada do valor ou expressão que se encontrar
dentro dos seus parêntesis. Assim sendo, o VBA calculará em 1o lugar o resultado da
expressão 2 + peso, fornecerá esse valor à função sqrt(), após o que copiará o valor
fornecido por essa função para a variável resultado.
É importante que se perceba que a operação de atribuição é uma operação destrutiva.
Se a variável contiver já um valor, uma operação subsequente de atribuição sobre essa

17
variável, substituirá o valor nela contido pelo novo valor. Convem, assim, lembrar que
nesta operação o fluxo da informação se faz sempre da direita para a esquerda e não o
contrário.
Há ainda que ter em atenção o facto de que não é normalmente aconselhável atribuir
um valor de um dado tipo a uma variável de tipo diferente. Os resultados podem ser a
perda de informação ou o mau funcionamento do programa. O VBA poderá gerar uma
mensagem de erro mas tal nem sempre acontece, podendo produzir-se comportamentos
anómalos difíceis de detectar e corrigir.

3.5 O uso de constantes


Uma constante consiste num nome que é dado a um valor numérico ou a uma cadeia de
caracteres, e que pode ser usado dentro do programa na vez desses valores. Funciona
como uma espécie de sinónimo. A utilização de constantes em substituição dos valores
que representa justifica-se pelo seguinte facto: se um dado valor constante fôr utilizado
muitas vezes ao longo dum programa, caso ocorra a necessidade de o modificar, seremos
forçados a corrigir manualmente todas as ocorrências desse valor, correndo, além disso, o
risco de nos enganarmos. Se, ao invés, for definida uma constante com esse valor, bastará
modificar essa definição inicial para que tal mudança automaticamente se repercuta em
todas as ocorrências dessa constante no decurso do programa. A sintaxe da definição de
constantes é a seguinte:
Const Nome As tipo = expressão
Por expressão entende-se um valor numérico, uma cadeia de caracteres, ou uma ex-
pressão cujo resultado seja um destes tipos de valores.
Caso, por exemplo, seja necessário usar ao longo de um macro um mesmo factor em
vários cálculos, faz sentido definir esse factor como constante e usar o seu nome em vez
dele:
Const Factor as Single = 1.347
Sempre que seja subsequentemente necessário utilizar este factor numa expressão,
usar-se-á Factor em vez de 1.347.

18
4 Como trabalhar com Objectos
Para que uma macro possa manipular o ambiente da aplicação, seja modificando a forma-
tação de um documento, modificando opções da aplicação ou introduzindo dados numa
gama de células, vai ser preciso interagir com Objectos. Genericamente, pode dizer-se que
um objecto é algo que pode ser visto, tocado, sentido. Em VBA, considera-se um objecto
tudo aquilo que pode ser visto e que pode ser manipulado de alguma forma.
Quer o documento, quer uma célula ou gama de células, quer a própria aplicação
são considerados, para os efeitos de programação em VBA, como sendo objectos. Mas
podem ainda existir outros objectos, nomeadamente aqueles que permitem construir uma
interface gráfica específica do macro. A esses objectos gráficos chamamos controlos e são
colocados em janelas especiais chamadas forms.
Na Figura 8 podem ser observados vários objectos instalados numa form: uma caixa
de texto, dois botões de comando, vários rótulos ou etiquetas e uma caixa de verificação.
Através deles é possível o macro interagir com o utilizador. Veremos em detalhe mais à
frente para que servem e como utilizar estes diferentes objectos.

Figura 8: Uma Form e vários Controlos

Os objectos podem ser manipulados de várias formas:


• podemos mudar as suas propriedades, que traduzem características próprias dos
objectos;
• podemos aplicar um método a um objecto, ou seja, executar uma acção sobre ele;
• podemos especificar uma sub-rotina que será executada sempre que um determinado
evento ocorra nesse objecto.
Vamos agora utilizar a analogia para introduzir estes conceitos. Consideremos um
automóvel:
• As suas "propriedades" são características físicas como o modelo, o peso ou a cilin-
drada;

19
• Os seus "métodos" especificam o que pode ser feito com ele: acelerar, travar, mudar
de direcção, etc;

• Os seus "eventos" são ocorrências que provocarão respostas automáticas por parte
do automóvel, como seja, um alarme que dispara (resposta) caso desliguemos o
carro com as luzes ligadas (evento).

4.1 Propriedades, Métodos e Eventos


Vamos, de seguida, aprofundar estes conceitos de propriedades, métodos e eventos.

4.1.1 Propriedades
As propriedades de um objecto são as suas características físicas. Como na vida real, cada
objecto possui características próprias ou propriedades, que podem ser quantificadas ou
especificadas, como sejam as suas dimensões ou o tipo de letra que usa. A cada objecto
está associada uma lista de propriedades a que é possível atribuir valores, determinando
a sua aparência, localização e outros detalhes. Pode-se então dizer que as propriedades
de um objecto definem a forma como ele se apresenta ou se comporta.
Diversos objectos podem partilhar a mesma propriedade. Essa propriedade, no en-
tanto, pode afectar esses objectos de forma diferente.

Caption Define o texto a afixar na barra de título das forms, da legenda


(“caption”) dos botões de comando, ou nos rótulos (“label”)
Name Define o nome pelo qual o objecto é identificado
Left Define o afastamento entre uma “form” e o limite esquerdo do ecrã
ou entre um controlo e o limite esquerdo da form
Top Define o afastamento entre uma “form” e o topo do ecrã ou entre um
controlo e o topo da “form”
Height Define a altura do objecto
Width Define a largura do objecto
Font Especifica qual o tipo de letra a usar nos controlos
Visible Permite controlar o aparecimento de um dado objecto

Tabela 2: Propriedades mais comuns dos objectos gráficos VBA

Já vimos que quer os elementos do Excel como folhas de cálculo ou próprio docu-
mento, quer elementos constituintes de interfaces gráficas que os macros possam utilizar,
são considerados objectos. Na Tabela 2 são descritas algumas das propriedades mais
importantes e que são comuns à maior parte dos objectos gráficos.
Os valores que as propriedades de um dado objecto tomam podem ser consultados ou
modificados usando a janela de propriedades (Figura 9 na página seguinte). Nessa janela
aparece a lista de propriedades do objecto que estiver nesse momento seleccionado . Nela
pode observar, entre outras, algumas das propriedades referidas na lista acima (Caption,
Height e Font) e os respectivos valores no momento.

20
Figura 9: Janela de Propriedades

4.1.2 Métodos
Os métodos traduzem acções que um macro pode realizar sobre os objectos. Por exem-
plo, aplicar o método Save ao objecto ActiveDocument implica desencadear o processo
de salvaguardar o conteúdo do documento activo num determinado ficheiro. Aplicar o
método Clear a um objecto da classe ListBox terá como consequência a eliminação de
todas as linhas nele contidas. A cada classe de objectos é possível aplicar um determinado
conjunto de métodos.
Para vermos como um método é aplicado a um objecto, vamos considerar o objecto
Worksheet, que representa uma folha de cálculo do Excel. Se pretendermos que o nosso
macro mova essa folha para uma nova posição dentro do Livro de Trabalho (Workbook ),
ele deverá aplicar o método Move a esse objecto, usando a seguinte sintaxe:
Worksheet.Move([Before][, After])
Exemplificando, se quisermos que o macro desloque a folha de cálculo "Dados 2009"para
a posição imediatamente a seguir à folha "Dados 2008", o comando a inserir no macro
será:
Worksheets("Dados 2009").Move Before:=Worksheets("Dados 2008")
Como veremos mais à frente, o objecto Worksheet é definido como um elemento do
conjunto de folhas de cálculo contidas no Livro de Trabalho. Este conjunto de folhas é
representado por Worksheets(). Assim sendo, Worksheets("Dados 2009") refere-se à folha
de cálculo com o nome "Dados 2009".

4.1.3 Eventos
Os eventos são acções que, uma vez exercidas sobre um objecto, implicam a possibilidade
de ocorrer uma resposta automática por parte dele. Basicamente, um evento é algo que
acontece a um objecto. Por exemplo, a abertura de uma folha de um livro de trabalho
(workbook ) em Excel é um evento. A inserção de uma nova folha no livro de trabalho é

21
outro exemplo de evento.
Para que um objecto possa reagir a um dado evento deverá existir, previamente pro-
gramado, um procedimento especial, chamado event handler, que vai especificar o que
fazer caso esse evento ocorra. Sem isso, o objecto detectará esse acontecimento mas não
saberá o que fazer. Nenhuma resposta será produzida.

Figura 10: Lista de eventos disponíveis

Na Figura 10 pode ver-se a janela de escrita de código de macros. Na parte de cima,


à direita, pode ser acedida a lista de eventos disponíveis para o objecto Worksheet 9 .
Seleccionando um dos eventos, será possível construir o procedimento event handler que
permita ao objecto Worksheet reagir a esse evento. O cabeçalho e o delimitador final são
criados automaticamente pelo editor do VBA, sendo da responsabilidade do programador
a inclusão das instruções necessárias. Na figura são referidos vários eventos que podem
ocorrer no objecto Worksheet, tais como o Activate que ocorre sempre que uma folha
de cálculo se torna activa, ou o Change que é desencadeado por qualquer alteração ao
seu conteúdo. Assim sendo, um mesmo objecto, por exemplo, a Worksheet pode estar
preparada para reagir a diferentes eventos, desde que possua event handlers específicos
para esses eventos.
Para tentar esclarecer melhor o conceito de evento e a questão de como organizar
a resposta do objecto a um evento, vamos apresentar um exemplo utilizando apenas
objectos gráficos dispostos numa form. Repare-se na Figura 11 na página seguinte: o que
se pretende aqui é um macro capaz de verificar se um dado número inteiro, introduzido
pelo utilizador usando a interface descrita na figura, é ou não um número primo. Parte-
se do princípio que todos sabem o que é um número primo e não nos vamos agora
debruçar sobre os detalhes do código que o event handler deverá conter para produzir o
efeito desejado. Preocupemo-nos, de momento, apenas com as interacções entre as várias
entidades que intervêm no processo.
Como é visível na Figura 11 na próxima página, existem vários objectos (chamados
controlos) na interface. Entre eles, têm particular interesse para esta discussão a caixa de
texto txt1, o rótulo lbl2 e o botão de comando command1. Quando o utilizador pretende
utilizar o macro, uma vez este invocado, deverá introduzir o número a testar em txt1 e
pressionar ("clicar") o botão command1. Quando isso acontece, diz-se que ocorreu um
evento click no botão command1. Se esse botão não dispuser de nenhum event handler
para lidar com esse tipo de evento, nada se passará. No entanto, se se tiver previamente
9
Isto porque as diferentes classes de objectos não são necessariamente sensíveis aos mesmos tipos de
eventos.

22
Figura 11: Objectos e Eventos

associado a esse objecto (command1 ) um event handler adequado, o objecto será já capaz
de responder ao evento e produzir o resultado desejado. Neste caso, esse resultado deverá
ser efectuar os cálculos necessários para concluir se o número introduzido é ou não primo
e apresentar essa conclusão no rótulo lbl2.

4.2 Os objectos do Excel mais comuns


Já vimos que um documento Word ou Excel é, em si mesmo, um objecto. Se bem que não
lhe possamos tocar, podemos claramente vê-lo e interagir com ele de múltiplas formas, seja
alterando o conteúdo de células (no caso do Excel), seja mudando formatos ou inserindo
linhas e colunas. Por sua vez, todos estes elementos são, eles também, objectos. Nas
aplicações Office, os objectos estão organizados de forma hierárquica. O objecto mais
geral é o Application, e dentro dele existem múltiplos objectos de nível progressivamente
inferior.

4.2.1 Como trabalhar com as propriedades dos objectos Excel


Como já vimos, os objectos possuem características próprias, chamadas propriedades. A
sintaxe genérica para nos referirmos a uma propriedade de um objecto é a seguinte:

23
Objecto.Propriedade
Se nos quisermos referir, por exemplo, à propriedade ActiveWindow do objecto Ap-
plication, procederemos do seguinte modo:
Application.ActiveWindow
A propriedade ActiveWindow refere-se à janela da aplicação com que estamos, de
momento, a trabalhar. No caso do Excel, podemos ainda referirmo-nos, por exemplo, à
propriedade ActiveSheet para designar a folha de cálculo em que se está a trabalhar ou a
ActiveCell para nos referirmos à célula actualmente seleccionada.
Se pretendermos, por exemplo, especificar o tipo de letra da célula activa, usaremos
a seguinte descrição de objecto:
Application.ActiveWindow.ActiveCell.Font.Name
Na prática, quando nos estamos a referir a uma propriedade da janela activa da
aplicação como seja a ActiveCell, não precisamos de referir que pertence à ActiveWindow
e à Application. Podemos omitir esses detalhes e apenas escrever:
ActiveCell.Font.Name
Se quisermos utilizar esta propriedade para mudar o tipo de letra da célula activa,
utilizaremos então uma instrução como a seguinte10 :
ActiveCell.Font.Name = "Helvetica"
Se, ao contrário, quisermos obter o valor de uma dada propriedade, a instrução a usar
será do tipo:
variavel = Objecto.Propriedade
Para obtermos, por exemplo, o conteúdo da célula activa da folha de cálculo, a ins-
trução correcta seria:
conteudo = ActiveCell.Value
Estaremos, assim, a usar a propriedade Value do objecto ActiveCell. Nessa proprie-
dade encontra-se armazenado o conteúdo da célula.

4.2.2 Como aplicar métodos aos objectos


Vimos na Secção 4.1.2 na página 21, que os métodos de uma classe de objectos descrevem
as acções que podemos executar sobre eles ou, por outras palavras, aquilo que podemos
fazer com eles. A sintaxe usada para aplicar um método a um objecto é similar à usada
para trabalhar com as suas prorpiedades:
Objecto.Método
Um exemplo da aplicação de um método a um objecto, usando esta sintaxe, é o
seguinte:
10
Trata-se de uma operação de atribuição, descrita na Secção 3.4 na página 17

24
Worksheets("Leituras").Activate
Estamos aqui a aplicar o método Activate ao objecto Worksheets("Leituras"), o
que tem como consequência que essa folha de cálculo se tornará activa.
No entanto, muitas vezes, os métodos exigem informação adicional para poderem
executar o seu trabalho. Essa informação adicional será fornecida através de argumentos,
inseridos a seguir ao nome do método aplicado:
Objecto.Método (argumento1, argumento2. ...)
O seguinte exemplo abre um Livro de Trabalho pré-existente com o nome "Dados.xls":
Workbooks.Open("Dados.xls")
Muitas vezes, os argumentos que se podem fornecer a um método são opcionais. Por
exemplo, a instrução abaixo adiciona (insere) uma nova folha de cálculo imediatamente
antes da folha com o nome "Dados_Jan":
Worksheets.Add Before:=Worksheets("Dados_Jan")
No entanto, caso seja omitido o argumento Before, a nova folha será inserida antes da
folha de cálculo activa. É esse o comportamento por defeito do método Add.

4.3 Objectos gráficos


Vão agora ser apresentados de forma mais sistemática alguns dos objectos e facilidades
necessários para realizar interfaces gráficas simples. Essas interfaces vão permitir que
os macros tenham uma interacção directa com o utilizador, requerendo e fornecendo
informação.
A forma mais simples de o macro interagir com o utilizador é através de duas funções:
MsgBox e InputBox.

4.3.1 MsgBox
A função MsgBox permite apresentar no ecran uma Caixa de Mensagem (Msg Box ).
Trata-se de uma pequena janela contendo um mensagem, pelo menos um botão de co-
mando e eventualmente um pequeno desenho (ícone) ilustrativo do tipo de mensagem.
Na Figura 12 encontra-se um exemplo de uma destas janelas.

Figura 12: Exemplo de MsgBox

25
Uma Caixa de Mensagem destina-se a apresentar ao utilizador uma mensagem com
informação relevante, sejam avisos, resultados, perguntas ou sugestões. Uma janela deste
tipo tem um comportamento peculiar: enquanto não for premido um botão, não será
possível qualquer outra interacção com o computador, já que essa janela tomou o controlo.
O utilizador é assim obrigado a atender à mensagem apresentada.
A sintaxe da função MsgBox é a seguinte:
MsgBox(Mensagem, Características, Título)
Em que os argumentos são:
Mensagem Texto a apresentar (máximo de 1024 caracteres)
Características Valor numérico que especifica o número de botões, o tipo do
ícone e o botão de defeito (com o “focus”), obtido pela soma
de três valores parciais.
Título Conteúdo da barra de título da janela (opcional)
O 2o argumento será calculado usando os valores da Tabela 3:

Botões de Comando Ícone Botão com o “focus”


0 - OK 0 - Nenhum 0 - 1o Botão
1 - OK, Cancel 16 - Mensagem Crítica 256 - 2o Botão
2 - Abort, Retry, Ignore 32 - Mensagem de Aviso 1 512 - 3a Botão
3 - Yes, No, Cancel 48 - Mensagem de Aviso 2
4 - Yes, No 64 - Mensagem de Informação
5 - Retry, Cancel

Tabela 3: Valores de configuração das características de uma Caixa de Mensagem

Assim, para obter a MsBox da Figura 12 na página anterior o valor a utilizar para
o parâmetro características seria obtido somando 3 valores, um de cada coluna da
Tabela 3, cada um deles especificando uma das características (Botões de Comando,
Ícone e qual o botão com o "focus"11 ):
1 + 16 + 0 = 17
A MsgBox serve então para apresentar uma mensagem ao utilizador. No entanto,
permite também recolher informação. Quando a caixa de mensagem apresenta mais
do que um botão, está-se a pedir ao utilizador que escolha uma de entre duas ou três
alternativas. Dependendo de qual o botão premido pelo utilizador, assim o valor numérico
devolvido pela função MsgBox será um de entre 7 valores possíveis, descritos na Tabela 4
na página seguinte.
De notar que caso a tecla ESC (Escape) seja premida o valor devolvido será 2, a que
corresponde o botão Cancel (o que indica que as duas acções são equivalentes).
Claro que quando se pretende aproveitar o valor devolvido pela função MsgBox será
necessário usá-la com a seguinte sintaxe:
11
O botão com o "focus" ou botão de defeito é aquele que será accionado automáticamente caso o
utilizador prima a tecla Enter ou Return.

26
Constante Valor Botão seleccionado
vbOK 1 OK
vbCancel 2 Cancel
vbAbort 3 Abort
vbRetry 4 Retry
vbIgnore 5 Ignore
vbYes 6 Yes
vbNo 7 No

Tabela 4: Valores devolvidos por uma Caixa de Mensagem

Variável = MsgBox(Mensagem, Características, Título)


Desta maneira, o valor devolvido pela função será guardado (atribuído) em Variável,
podendo depois ser avaliado por instruções seguintes.

4.3.2 InputBox
A função InputBox permite apresentar ao utilizador uma mensagem com uma questão,
recolhendo ao mesmo tempo uma string contendo a sua resposta. Assim, ao contrário
da função MsgBox (Secção 4.3.1 na página 25), esta função produz um resultado do tipo
string e não do tipo integer.

Figura 13: Exemplo de InputBox

Como pode ser visto na Figura 13, esta função cria um objecto composto (uma Caixa
de Entrada) incluindo um caixa de texto, dois botões12 e um rótulo dentro de uma
pequena janela.
A sua sintaxe é
Variável = InputBox (mensagem, título, valor_de_defeito, xpos, ypos)
Em que os argumentos são:
12
Ao contrário da MsgBox, neste caso os dois botões são fixos. Por outro lado, a tecla ESC tem o
mesmo comportamento.

27
Mensagem Texto da mensagem a afixar na Caixa de Entrada (máximo
de 1024 caracteres)
Título Conteúdo da barra de título da janela (opcional)
valor_de_defeito Texto a colocar à partida na caixa de texto da Caixa de En-
trada (opcional)
xpos e ypos Coordenadas da “Input Box” relativamente aos bordos es-
querdo e superior do ecrã (opcionais)

4.3.3 Forms
Como vimos no início da Secção 4 na página 19, uma interface gráfica (em terminolo-
gia VBA, uma DialogBox ) é construída dispondo os objectos adequados (genericamente
designados por controlos) sobre uma janela especial, a form. Efectivamente uma form é
utilizada como um contentor para outros objectos gráficos. Um objecto da classe User-
Form pode ser criado no Editor do VBA através do Menu "Insert/User Form". Esse
processo será visto em detalhe na Secção 8 na página 56.
A seguir são apresentadas algumas das principais propriedades que podem ser confi-
guradas numa Form:

• Name - especifica o nome pelo qual a Form será identificada

• Caption - especifica o título que figura no topo da Form

• BackColor - permite seleccionar a cor do fundo

• Enabled - controla a utilização da Form pelo utilizador

• ShowModal - permite alterar o comportamento da Form de modo a controlar o


acesso à aplicação enquanto a Form estiver activa

• Font - controla o tipo e tamanho da letra utilizada

• Height - especifica a altura da Form

• Width - especifica a largura da Form

Nas próximas secções, referiremos com algum detalhe os controlos de uso mais comum
na construção de dialogBoxes em VBA. Estes são os objectos que mais frequentemente
são colocados numa form.

4.3.4 Botões de Comando


Um botão de comando (objecto commandButton), como o próprio nome sugere, é uti-
lizado para permitir ao utilizador dar ordens (comandos) ao programa. Como se pode
verificar na Figura 11 na página 23, é a este tipo de controlos que normalmente se asso-
ciam as sub-rotinas que permitem responder a eventos como o clicar de um rato.
As propriedades normalmente referidas em relação a esta classe de objectos são as que
controlam as dimensões (Height e Width) e a propriedade Caption que permite especificar
o texto afixado.

28
A instrução seguinte serve de exemplo de como alterar programaticamente o estado
de um botão de comando:
cmdArranque.Enabled = True
O que fizemos com a instrução acima foi atribuir o valor booleano (lógico) True à pro-
priedade Enabled 13 do botão de comando cmdArranque. Estamos, assim, a tratar uma
propriedade como sendo uma variável. De facto, uma propriedade pode ser considerada
como uma variável especial.

4.3.5 Rótulos
Os rótulos, também designados por etiquetas (label ) são usados para apresentar texto
na interface. Mais uma vez, a propriedade mais utilizada é a propriedade Caption, que
permite especificar o texto a apresentar. Este controlo é usado não só para apresentar
informação estática, que é escolhida na fase de concepção da interface, como também
informação dinâmica, como seja a apresentação de resultados:
lblResultado.Caption = "O valor total é 235 metros"
A instrução acima atribui à propriedade Caption do rótulo lblResultado a string "O
valor total é 235 metros", o que vai ter como consequência a sua afixação na interface.

4.3.6 Caixas de Texto


As caixas de texto (objecto TextBox ) são uma classe de controlos muito versáteis que
permitem a introdução pelo utilizador de diversos tipos de informação: texto, valores
numéricos e, no caso do Excel, referências a células e mesmo fórmulas.
Algumas das suas propriedades mais importantes são:

• Text - Permite obter ou alterar o texto contido no objecto.

• MaxLenght - Especifica o tamanho máximo do texto (em caracteres) que o utili-


zador pode introduzir.

• MultiLine - Permite escolher entre autorizar ou não a inserção de várias linhas.

Enquanto que os rótulos (Label ) são utilizados pelo programa para aparesentar infor-
mação ao utilizador, já as caixas de texto (Text Box ) são maioritáriamente usadas para
permitir a leitura de informação pelo programa.
13
Esta propriedade permite controlar o acesso do utilizador ao botão de comando.

29
Funções Val e Str
A linguagem Visual Basic dispõe de um grande número de funções pré-definidas.
Duas delas, relacionadas com "strings", são particularmente úteis para lidar com
objectos da classeTextBox :
Função Descrição
Val() Retorna como valor numérico um número contido dentro duma string
Str() Retorna uma string representando um número
Vamos supor que um macro precisa de calcular o peso total à custa de dois valo-
res introduzidos pelo utilizador através de duas TextBox. A tentação seria usar a
instrução:
pesoTotal = txt1.Text + txt2.Text
No entanto, o que a propriedade Text das TextBox contem é apenas texto, ainda
que contendo algarismos. Para extrair a informação numérica de dentro do texto,
haverá que utilizar a função Val():
pesoTotal = Val(txt1.Text) + Val(txt2.Text)

4.3.7 Botões de Opção


Estes objectos permitem ao utilizador efectuar escolhas entre diversas alternativas. São
compostos pelo botão propriamente dito (de forma circular) e um pequeno texto que o
acompanha, controlado pela propriedade Caption do objecto.

Figura 14: Vários optionButton agrupados numa frame

Os botões de opção são geralmente agrupados em conjuntos de dois ou mais, estando


interligados entre si, já que, ao mesmo tempo, só é possível existir um botão seleccionado
dentro do mesmo grupo de botões de opção. Encontram-se muitas vezes inseridos em
frames (Secção 4.3.9 na página seguinte).
Para além da propriedade Caption, outra propriedade importante dos botões de opção
é a propriedade Value, que pode assumir o valor “True” ou “False” conforme o botão se
encontre ou não seleccionado.

30
4.3.8 Caixas de Verificação
Estes objectos comportam-se de forma semelhante à dos botões de opção mas, neste caso,
é possível encontrar vários controlos deste tipo activados simultaneamente na mesma
form, visto que tais objectos funcionam de forma independente (isto é, não se encontram
relacionados entre si).

Figura 15: Vários checkBox agrupadas numa frame

Possuem também uma propriedade Value que, neste caso, pode apresentar os seguintes
valores:
0 não activada
1 activada
2 não disponível
O texto a inserir junto de cada caixa de verificação deve ser especificado mediante a
propriedade Caption.

4.3.9 Quadros (Frames)


Tais objectos destinam-se a agrupar outros objectos (controlos). São usados muitas vezes
para organizar um dado conjunto de botões de opção (Secção 4.3.7 na página precedente),
tornando-os independentes de outros botões de opção eventualmente existentes na mesma
form.

Figura 16: Uma Frame agrupando três botões de comando

É importante criar o quadro antes de aí inserir os controlos. Se o controlo fôr criado


antes do quadro, não será possível deslocá-lo para dentro do quadro após este ter sido
criado.

31
Uma vez inserido um objecto dentro do quadro, esse quadro passa a constituir o
“contentor” desse objecto. Quer isto dizer que a sua localização passa a ser definida não
em relação à form mas em relação ao quadro que o contem.
Outra utilidade dos quadros é servir de “moldura” a um dado conjunto de controlos, de
modo a melhorar a aparência e a organização da form em que estão inseridos, agrupando
os diversos controlos de acordo com as suas funcionalidades.

4.3.10 Caixas de Listagem


Este objecto serve para apresentar listas e permite que o utilizador escolha uma ou mais
opções dentro de uma dada lista. Esta lista é apresentada numa caixa própria (com uma
barra de deslocamento vertical à direita, no caso de a lista ser mais extensa que o número
de linhas disponível na caixa).

Figura 17: Exemplo de listBox

Os elementos da lista podem ser especificados à partida usando a propriedade List,


ou ser acrescentados durante a execução do programa mediante o método AddItem:
listbox.AddItem elemento
ou
listbox.AddItem elemento, posição
em que
elemento é o novo elemento a acrescentar à lista
posição refere-se à posição na lista em o elemento vai ser inserido
Na primeira variante acima o elemento será inserido a seguir à última linha preen-
chida.
A remoção de um elemento da lista pode ser feita mediante o método RemoveItem:
Listbox.RemoveItem posição
As propriedades mais relevantes desta classe de objectos são:

32
ListCount permite conhecer em qualquer momento o número de elemen-
tos contidos na lista
Sorted permite especificar se a lista é ou não apresentada de maneira
ordenada
ColumnCount especifica qual o número de colunas em que a lista é apresen-
tada
ColumnHeads controla os cabeçalhos das colunas
MultiSelect permite controlar a forma de selecção de elementos na lista:
0 - só é possível seleccionar um elemento
1 - é possível seleccionar vários elementos simultaneamente,
pressionando cada elemento
2 - é possível seleccionar vários elementos simultaneamente,
usando a tecla Ctrl
ListIndex fornece ou especifica qual o índice do item actualmente selec-
cionado (ou –1 caso nenhum esteja). Sintaxe:
objecto.ListIndex [= indice]
List permite aceder aos elementos duma lista, quer para os ler,
quer para os modificar. Sintaxe:
objecto.List(indice) [= string]
Text permite obter o elemento actualmente seleccionado. Sintaxe:
variavel = objecto.Text
RowSource no Excel, especifica qual a gama de células onde estará a in-
formação a incluir na lista, ou seja, a fonte dos dados a apre-
sentar.
Na especificação de sintaxe, os parêntesis rectos indicam que o seu conteúdo é opcional.
No caso das propriedades ListIndex e List descritas acima, a versão curta destina-se a ser
usada do lado direito de uma operação de atribuição, enquanto que na versão completa
o que se pretende é atribuir um valor à propriedade.
Existe uma variante da ListBox, chamada ComboBox, que combina uma TextBox com
uma ListBox. O utilizador pode introduzir um item na TextBox ou seleccioná-lo na lista
que, estando normalmente escondida, só aparecerá quando se clica num ícone próprio. É
normalmente utilizado quando se pretende dar a possibilidade de escolher um elemento
de uma lista mas sem ocupar muito espaço na form.

4.4 Interface gráfica sem uma Form


É possível criar uma interface gráfica para um macro sem ter que usar um form onde se
instalem os diferentes controlos. Nesse caso, os controlos serão instalados directamente
na própria folha de cálculo, numa área reservada para o efeito. Um exemplo pode ser
observado na Figura ?? na página ??.

33
5 Estruturas de controlo do programa
Um macro é um programa escrito na linguagem VBA. Vamos agora começar a analizar
mais em detalhe a estrutura de um programa. Um programa é composto por um conjunto
de instruções, cada uma delas executando uma tarefa específica. A sequência de instruções
levará à solução do problema que o programa se propõe resolver. Mas essa sequência não
tem que ser necessariamente linear, i.e., composta por uma lista de instruções que serão
realizadas uma após outra, de forma imutável. Isso tornaria o programa inflexível, incapaz
de se adaptar às circunstâncias ou aos diferentes desejos do utilizador.
Já foi introduzida na Secção 3.4 na página 17 a noção de operação de atribuição. Com
essa operação podemos criar instruções simples, mediante as quais é possível copiar valores
entre variáveis, ou armazenar resultados do cálculo de expressões. Mas um programa
flexível não poderá ser construído apenas com instruções desse tipo. É preciso dispor
de instruções que permitam alterar o fluxo do programa. Para tal vamos introduzir
estruturas de controlo que possibilitam a alteração desse fluxo.

5.1 Estruturas de controlo condicional


Uma estrutura de controlo fundamental é a estrutura condicional, ou de selecção. Usando
esta estrutura, as instruções podem ser executadas condicionalmente. Se uma dada con-
dição fôr verdadeira, será executada uma dada sequência de instruções. Se fôr falsa, uma
sequência diferente será escolhida.

5.1.1 If...Then...Else

Figura 18: Estrutura de controlo condicional If...Then...Else

34
A Figura 18 na página 34 descreve a estrutura condicional If...Then...Else. Como o
seu nome sugere, esta estrutura está baseada no teste de uma condição. Se essa condição
fôr verdadeira, desencadeará a execução das instruções representadas na figura por Bloco
de Instruções1. Em caso contrário, será executada o Bloco de Instruções 2.
A sintaxe desta estrutura é:
1 I f c o n d i c a o Then
2 [ instrucoes ]
3 Else
4 [ instrucoes alternativas ]
5 End I f
Quando a condição é verdadeira serão executadas as instruções delimitadas por Then
e Else. Em caso contrário, será executado o bloco alternativo de instruções.
A condição pode consistir numa comparação ou outra operação lógica, ou ainda em
qualquer expressão de que resulte um valor numérico: um valor não nulo será interpretado
como Verdadeiro, enquanto um valor nulo será considerado como Falso.
A condição é, portanto, uma expressão booleana (lógica). Uma expressão booleana
representa um valor booleano, TRUE (verdadeiro) ou FALSE (falso) e pode ser cons-
tituída por uma variável, uma função ou uma combinação destas entidades através de
operadores.

5.1.2 If...Then

Figura 19: Estrutura de controlo condicional If...Then

Quando numa estrutura condicional não existe qualquer acção a executar quando a

35
condição seja falsa, usa-se uma variante simplificada, a If...Then. O seu diagrama está
descrito na Figura 19 na página 35. A sua sintaxe será então:
1 I f c o n d i c a o Then
2 [ instrucoes ]
3 End I f
Nesta 2a variante, quando a acção a realizar no caso a condição ser verdadeira puder ser
executada com apenas uma instrução, é possível utilizar a seguinte sintaxe simplificada,
sem o delimitador End If :
If condicao Then instrucao

Expressões lógicas
As expressões lógicas, utilizadas nas condições das estruturas de controlo, são cons-
truídas utilizando operadores lógicos específicos. A linguagem VBA prevê os seguin-
tes operadores lógicos, utilizáveis em expressões:
Operador Descrição
> Maior que
< Menor que
= Igualdade
<= Menor ou igual
>= Maior ou igual
<> Desigualdade
And E
Or Ou
Not Negação
Dos primeiros seis operadores não haverá muito a dizer. Já do And e do Or haverá
alguns detalhes a esclarecer:
AND
Sintaxe: Expr1 And Expr2

• Se Expr1 e Expr2 forem ambas verdadeiras, a expressão será verdadeira

• Basta que quer Expr1 quer Expr2 seja falsa, para a expressão ser falsa

OR
Sintaxe: Expr1 Or Expr2

• Se Expr1 e Expr2 forem ambas falsas, a expressão será falsa.

• Basta que quer Expr1 quer Expr2 seja verdadeira, para a expressão ser ver-
dadeira

36
5.1.3 Estruturas condicionais embutidas
É possível imbricar estruturas condicionais dentro de outras estruturas condicionais, per-
mitindo, assim, a construção de estruturas de controlo mais complexas. Para inserir uma
estrutura condicional dentro de outra, é utilizada a palavra reservada ElseIf.
A sintaxe desta estrutura é:
1 I f c o n d i c a o 1 Then
2 Accao1
3 E l s e I f c o n d i c a o 2 Then
4 Accao2
5 E l s e I f c o n d i c a o 3 Then
6 ...
7 Else
8 AccaoN
9 EndIf
Esta estrutura condicional permite a selecção de uma entre várias alternativas mu-
tuamente exclusivas. As instruções que se seguem à palavra reservada Else (aqui re-
presentadas por "AcçãoN") serão executadas apenas se nenhuma das condições se tiver
verificado.

Figura 20: Estruturas de controlo condicional imbricadas

Na Figura 20 na página anterior pode-se ver o fluxograma de uma estrutura imbricada


com quatro vias alternativas. A Acção 1 é executada caso a 1a condição seja verdadeira.
A Acção 3 será executada caso a Condição 3 for verdadeira e as duas anteriores falsas.
A Acção 4 será executada caso todas as quatro condições se tiverem verificado falsas.

37
Chama-se a esta acção, a acção por defeito, ou seja, aquilo que se faz quando todo o resto
falha.
É muito importante que se compreenda que estamos aqui a tratar de verdadeiras alter-
nativas, i.e., mútuamente exclusivas. Cada vez que uma estrutura deste tipo é executada,
só uma das acções será efectuada.
O exemplo seguinte traduz uma situação em que o programa, confrontado com a
necessidade de classificar uma nota numérica, pode escolher uma de entre seis notas
qualitativas diferentes. Só uma estrutura condicional imbricada lhe permitirá resolver o
problema.
Listing 3: Exemplo de aplicação de If..Then..Else imbricados
1 I f ( nota < 0 ) Or ( nota > 20 ) Then
2 r e s u l t a d o = "Nota␣ I n v a l i d a ! "
3 E l s e I f nota < 6 Then
4 r e s u l t a d o = "Mau"
5 E l s e I f nota < 10 Then
6 r e s u l t a d o = " Mediocre "
7 E l s e I f nota < 14 Then
8 resultado = " Suficiente "
9 E l s e I f nota < 17 Then
10 r e s u l t a d o = "Bom"
11 Else
12 r e s u l t a d o = " Muito ␣Bom"
13 End I f

É possível imbricar um qualquer número de blocos ElseIf dentro de uma dada estru-
tura condicional.

5.2 Estruturas de controlo repetitivo


Como vimos, as estruturas de controlo condicional permitem alterar o fluxo do pro-
grama, ou seja, executar diferentes sequências de instruções conforme as circunstâncias
do momento. As estruturas de controlo repetitivo (também conhecidas por ciclos)
permitem repetir um dado conjunto de instruções o número de vezes que fôr necessário.
Existem diversas variantes de ciclos, diferindo umas das outras pela forma como é
controlada a execução das instruções contidas no corpo do ciclo. Genericamente, pode-se
dizer que uma estrutura de controlo repetitiva (ou ciclo) assegura a execução repetida de
um dado conjunto de instruções dependendo do resultado do teste de uma determinada
condição de funcionamento. De facto, como veremos, também os ciclos dependem da
verificação de uma condição, normalmente de forma explícita, noutros casos implicita-
mente.

5.2.1 Estruturas de Controlo Do...Loop


Estão disponíveis quatro variantes deste ciclo: Do...While e Do...Until, ambas com teste
da condição no princípio ou no fim. Vejamos em detalhe as diversas variantes. O fluxo-

38
grama da primeira encontra-se na Figura 21:

Figura 21: Estrutura de controlo repetitivo Do...While

Analizando esse fluxograma, pode-se observar que tudo roda à volta do teste a uma
condição, descrita como condição de funcionamento. Se a condição for verdadeira
na altura em que o teste é realizado, as instruções que compõem o chamado corpo do
ciclo serão executadas, após o que novo teste à condição será efectuado. Enquanto a
condição se verificar ser verdadeira, o programa não sairá deste ciclo. Na 1a vez em que
a condição se mostrar falsa, o ciclo terminará e o programa poderá continuar com as
instruções seguintes.
Chama-se corpo do ciclo ao conjunto de instruções que serão executadas em cada
iteração (repetição) do ciclo. Esse conjunto pode incluir qualquer número de instruções
e de qualquer tipo, mesmo outras estruturas repetitivas. Neste último caso, etaremos
perante o que se designa por ciclos imbricados ou embutidos, que serão tratados em
detalhe na Secção 5.2.5 na página 44.
A sintaxe em VBA desta estrutura de controle é a seguinte:
1 Do While c o n d i c a o
2 [ instrucoes ]
3 Loop
A segunda variante é muito semelhante à primeira. A grande diferença diz respeito à
condição de controle. Neste caso, temos a chamada condição de termo (ou de fim) o
que faz com que o ciclo funcione enquanto a condição for falsa ou, por outras palavras,
até que a condição de termo seja verdadeira (Figura 22).
A sintaxe da variante Do...Until será então:
1 Do
2 [ instrucoes ]
3 Loop U n t i l c o n d i c a o
Como se pode deduzir do atrás dito, é possível transformar uma estrutura Do...While
numa Do...Until desde que se substitua a palavra While pela Until e se negue a condição
de controlo. Escolher uma ou outra estrutura de controlo depende, no fundo, do jeito

39
Figura 22: Estrutura de controlo repetitivo Do...Until

do programador e, sobretudo quando se usam condições múltiplas, da forma como a


expressão lógica traduz com maior ou menor facilidade a condição em linguagem corrente.

5.2.2 Ciclos controlados por contador


Usando como base estas duas estruturas de controlo repetitivo é possível construir dois
tipos de ciclos: ciclos controlados por um contador e ciclos controlados por aquilo que
se designa como sentinela. Comecemos pelos primeiro.
Um ciclo controlado por contador baseado na estrutura Do..While pode assumir a
seguinte forma genérica:
1 contador = v a l o r _ i n i c i a l
2 Do While c o n t a d o r <= v a l o r _ f i n a l
3 ’ Corpo do C i c l o
4 contador = contador + 1
5 Loop
Decorrendo do que vimos na secção anterior, torna-se claro que é igualmente possível
construir este ciclo usando a estrutura Do..Until.
Há que ter em conta as seguintes questões na construção de um ciclo controlado por
contador usando as estruturas de controlo Do...While ou Do...Until :

• Inicializar a variável contadora

• Especificar a condição de funcionamento do ciclo

• Incluir no corpo do ciclo uma instrução que incremente ou decremente a variável


contadora.

Quando se usam estas estruturas, ao contrário do que se passa com a estrutura de


controlo repetitivo For...To...Next, a analizar na Secção 5.2.4 na página 43, é da respon-
sabilidade do programador assegurar-se de que tais acções são correctamente executadas

40
Figura 23: Ciclos controlados por contador

conforme está espelhado no diagrama de fluxo representado na Figura 23 na página pre-


cedente.
Um último aspecto a observar é o seguinte: só é viável construir um ciclo controlado
por contador quando é possível conhecer à partida o número de vezes que ele vai funcionar
ou, por outras palavras, o número de repetições necessárias. Isso nem sempre é possível.
Nesses casos, a alternativa será usar ciclos controlados por sentinela.

5.2.3 Ciclos controlados por sentinela


Quando não é possível conhecer antecipadamente o número de vezes que o ciclo deverá
ser executado é necessário usar uma técnica diferente: ciclos controlados por sentinela.
Por sentinela deve entender-se um valor limite que assinala o fim de uma dada sequência
de valores, mas que não esteja incluído nesse conjunto de valores.

41
Exemplo
Se o utilizador estiver a introduzir os dados referentes a um conjunto de alunos
identificados pelos seus números de matrícula, a introdução de um número com
menos de 6 dígitos (no caso do ISEP) como, por exemplo, o valor 1, permitirá
indicar ao programa que a presente sequência de introdução de dados deve
terminar. Seria esse, neste caso, o valor sentinela escolhido.

Figura 24: Ciclos controlados por sentinela

A selecção do valor sentinela é da responsabilidade do programador, devendo ser


escolhido fora do intervalo possível de valores a introduzir, podendo ainda, ter-se em
atenção a eventual ocorrência de valores fora desse intervalo que possam resultar de
algum eventual erro de digitação. O valor sentinela escolhido não deve pois ser passível
de facilmente ocorrer por mero acidente.
Conforme pode ser observado na Figura 24 na página anterior um ciclo controlado
por sentinela deverá ser precedido da leitura de um elemento da sequência de valores a
introduzir. As leituras dos restantes valores dessa sequência serão efectuadas dentro do

42
corpo do ciclo, um em cada iteração. Essa leitura deverá, no entanto, ser feita no fim do
corpo do ciclo, após o processameento do valor anteriormente lido. Neste tipo de ciclos, a
leitura e o processamento de cada valor lido andam desfasados de uma iteração do ciclo.
No caso de se usar a estrutura Do..While, o ciclo funcionará enquanto o valor lido for
diferente do valor sentinela escolhido.
O exemplo apresentado acima, poderia ser codificado pelo segmento de programa
seguinte:
1 num = InputBox ( " D i g i t e ␣o␣numero" , "ISEP␣−␣ M a t r i c u l a s " )
2 Do While numero <> 1
3 I f numero <> 1 Then l s t b o x 1 . AddItem num
4 num = InputBox ( " D i g i t e ␣o␣numero" , "ISEP␣−␣ M a t r i c u l a s " )
5 Loop
Geralmente o valor sentinela é um valor preciso. Existem casos, porém, em que a
sentinela pode ser qualquer valor dentro de uma determinada gama, por exemplo, todos
os números negativos. Um exemplo de um ciclo controlado por uma sentinela com estas
características é apresentado na Secção 5.2.5 na próxima página.

5.2.4 Estrutura de Controlo For..To..Next


Este ciclo permite repetir um dado conjunto de instruções um número pré-determinado de
vezes. Como vimos na secção anterior, nem sempre é possível saber de antemão quantas
vezes as instruções contidas no corpo do ciclo devem ser repetidas. Nesse caso, deverão
ser utilizadas as estruturas de controlo repetitivo estudadas na Secção 5.2.1 na página 38.
A sintaxe da estrutura For..To..Next é:
1 For c o n t a d o r = v a l o r _ i n i c i a l To v a l o r _ f i n a l
2 [ instrucoes ]
3 Next
Esta estrutura baseia-se na existência dum contador que incrementa automaticamente
o conteúdo da variável contador, chamada variável de controlo do ciclo, cada vez
que o ciclo funciona, isto é, cada vez que as instruções contidas no corpo do ciclo são
executadas. No início, contador vai conter o valor inicial e após valorfinal - valor
inicial iterações atingirá o valor final. Nesse momento o ciclo terminará.
A inicialização da variável contadora, o seu incremento/decremento e a verificação da
condição de funcionamento do ciclo (contador <= fim) é da responsabilidade da própria
estrutura de controlo. O programador deve, apenas, especificar qual o valor de início e
de fim (ou, de forma indirecta, o número de vezes que o ciclo vai funcionar) e quais as
instruções que o ciclo vai repetir (o corpo do ciclo).
O conteúdo da variável de controlo do ciclo pode ser utilizado por instruções contidas
no corpo do ciclo, mas não deve, sob pretexto algum, ser modificado por estas instruções,
sob pena de se perder o controlo do funcionamento do ciclo.
A estrutura de controlo verifica no início de cada iteração (repetição) do ciclo se a
condição de funcionamento do ciclo é ainda verdadeira. Caso seja falsa, o ciclo terminará,
e o programa passará a executar as instruções que se lhe seguem.
Pode ainda ser utilizada a seguinte sintaxe alternativa:

43
1 For c o n t a d o r = v a l o r _ i n i c i a l To v a l o r _ f i n a l Step p a s s o
2 [ instrucoes ]
3 Next
A diferença está na utilização da palavra Step após a especificação do valor final. A
sua inclusão é opcional: caso se pretenda que o conteúdo da variável de controlo seja
incrementada uma unidade de cada vez, é desnecessário especificar o passo. Em caso
contrário, Step passo permitirá incrementar o valor de variável de um valor diferente da
unidade (positivo ou negativo).
Caso o valor de passo seja positivo a variável contadora será incrementada. Se pre-
tendermos, no entanto, efectuar um decremento, deverá ser utilizado um valor negativo
para passo. Obviamente, nesse caso, a condição implícita de funcionamento do ciclo
passará a ser contador >= fim.
Repara-se que nesta estrutura de controlo, ao contrário das estudadas anteriormente,
o incremento ou decremento da variável de controle do ciclo é automático. Outro aspecto
interessante é que a condição de funcionamento do ciclo é implícita. Ela existe e é
verificada mas não é especificada de forma explícita pelo programador, apenas de forma
indirecta ao fixarem-se os valores inicial e final da variável de contagem.
Existe ainda em VBA uma estrutura de controlo que é uma variante da For..To..Next
e que opera numa colecção de objectos. Uma colecção é um conjunto de objectos idênticos,
pertencentes à mesma classe, e que são referenciáveis mediante um índice. Por exemplo,
um Workbook é constituído por um conjunto de objectos da classe Worksheet 14 .
A sintaxe desta estrutura é a seguinte:
1 For Each elemento In C o l e c c a o
2 [ instrucoes ]
3 Next
O bloco de instruções será aplicada a cada elemento da colecção de objectos em causa.
A seguir é apresentado um exemplo de sub-rotina, utilizando esta estrutura de controlo:
Listing 4: FormataBordo - exemplo de sub-rotina usando For..Next
1 Public Sub FormataBordo ( )
2 Dim c e l l O b j e c t As Range
3 For Each c e l l O b j e c t In S e l e c t i o n
4 c e l l O b j e c t . BorderAround C o l o r I n d e x :=3 , Weight := x l T h i c k
5 Next
6 End Sub

É criada a variável cellObject para guardar um objecto do tipo Range (que representa
uma gama de células - assunto tratado na Secção 7.3). O ciclo For Each...Next aplica
o método BorderAround a cada uma das células contidas na gama representada por
cellObject. Com os argumentos fornecidos no exemplo, este método formata o bordo
dessas células a vermelho e uma linha grossa.
14
Por sua vez, um workbook é também um objecto. Um objecto pode assim ser ele próprio uma
colecção de objectos.

44
5.2.5 Estruturas de controlo repetitivo imbricadas
Foi dito anteriormente que o corpo de um ciclo era constituído pelo conjunto de instruções
que o ciclo irá executar repetidamente. Foi também dito que nesse conjunto de instruções
se poderia incluir qualquer tipo de instruções, mesmo constituindo outras estruturas de
controlo repetitivo. Destes ciclos se diz que se encontram imbricados um dentro do
outro.
Considere-se o problema de calcular uma série de factoriais de números inteiros. O
cálculo de um factorial é realizado efectuando uma sucessão de multiplicações. Será
necessário usar um ciclo para o efeito. Por sua vez, se pretendermos repetir esse cálculo
um certo número de vezes, teremos também que usar um ciclo. Teremos assim um
ciclo, chamemos-lhe exterior, que se encarrega de produzir uma sequência de factoriais
e cujo corpo inclui por sua vez um ciclo, dito interior, que é responsável pelo cálculo de
cada factorial. O diagrama de fluxo da Figura 25 na página precedente representa esta
realidade. O código necessário para traduzir esse diagrama é o seguinte:
Listing 5: Exemplo usando Ciclos Imbricados
1 num = InputBox ( " I n t r o d u z a ␣um␣ i n t e i r o ␣ p o s i t i v o " )
2 Do U n t i l num < 0
3 factorial = 1
4 contador = 1
5 Do U n t i l c o n t a d o r > num
6 f a c t o r i a l = f a c t o r i a l ∗ contador
7 c o n t a d o r = c o n t a d o r +1
8 Loop
9 num = InputBox ( " I n t r o d u z a ␣um␣ i n t e i r o ␣ p o s i t i v o " )
10 Loop

O ciclo exterior é controlado por uma sentinela, no caso qualquer valor inteiro não
positivo. É um exemplo de sentinela constituído não por um valor específico mas por
uma gama de valores possíveis. O ciclo interior é calaramente controlado por contador,
funcionando tantas vezes quantas o valor do inteiro cujo factorial se pretende calcular.

5.3 Variáveis indexadas - vectores e matrizes


Até agora, temos trabalhado essencialmente com variáveis que podemos classificar como
individuais (isto é, cada variável podendo conter ao mesmo tempo apenas um só valor).
Como essas variáveis não podem conter simultaneamente mais que um dado, a atribuição
de um novo valor a essa variável implica a destruição do valor anteriormente nela contido.
Mediante a utilização de um novo tipo de variáveis, as variáveis do tipo Array (Vector),
passa a ser possível armazenar na mesma variável múltiplos valores desde que sejam do
mesmo tipo. Estamos, portanto, a utilizar agora variáveis que se podem classificar como
variáveis múltiplas. Na Figura 26 na página anterior podemos observar representações
de uma variável simples do tipo integer e de uma variável múltipla (um vector uni-
dimensional) contendo valores inteiros. Cada elemento do vector é identificado por um
valor numérico específico.

45
Figura 25: Exemplo de Ciclos Imbricados

Um vector é uma lista ordenada de variáveis simples do mesmo tipo. Pode também ser
visto como um conjunto de variáveis simples agrupadas. Todos as variáveis membros desse
vector partilham o mesmo nome (o nome do vector). São identificadas individualmente
mediante o valor dum índice, que determina qual a sua posição dentro do vector. É por
isso que estas variáveis são conhecidas por variáveis indexadas.
Os valores do índice devem obrigatoriamente ser do tipo Integer. O primeiro valor do
índice é zero15 .
Um elemento de um vector é identificado utilizando o nome do vector seguido do valor
do índice dentro de parêntesis
nome_vector(indice)
Exemplos:
var_Multipla(3) 4o elemento do vector ‘var_Multipla’
var_Multipla(7) 8o e último elemento do vector ‘var_Multipla’
notas(14) 15o elemento do vector ‘notas’
nomes(0) 1o elemento do vector ‘nomes’
15
É possível forçar que os índices dos vectores comecem do valor 1 usando a directiva Option Base 1.

46
Figura 26: Um vector é uma variável múltipla

Figura 27: Um exemplo de vector de strings

Os elementos de um vector não têm que ser inteiros, nem sequer valores numéricos.
Na Figura 27 na página precedente é representado um vector contendo strings (texto).
Considerando o vector como armazenado os nomes dos membros de uma equipa de fu-
tebol, os sucessivos valores do índice podem ser vistos como os correspondentes números
das suas camisolas. Note-se que estamos, neste caso, a forçar os valores do índice a iniciar
em 1.

5.3.1 Declaração de vectores


Como qualquer outra variável, uma variável do tipo Array deve também ser declarada
(criada) antes de poder ser usada. Para tal, deve ser usada a instrução Dim, que reserva
espaço em memória suficiente para armazenar o número previsto de elementos do vector
16
. Uma das formas de utilizar a instrução Dim para declarar vectores é a seguinte:
Dim nome_vector(num_elementos) As Tipo
Exemplos:
Dim var_Multipla(8) As Integer
16
Adicionalmente, a instrução Dim atribui valores iniciais a todos os elementos do vector (zeros no
caso de vectores numéricos e strings nulas no caso de vectores alfa-numéricos).

47
Dim notas(30) As Single
Dim nomes(100) As String
Nota: num_elementos não se refere ao valor máximo que a variável índice pode
assumir (7, no caso do vector var_Multipla) mas sim ao número de elementos do
vector (8, neste caso). Por este processo, a declaração do limite inferior faz-se de forma
implícita: por defeito assume-se como limite inferior do índice o valor zero (ou 1 se tal
for especificado mediante a instrução Option Base 1 ).
Uma forma alternativa de utilizar a instrução Dim para declarar vectores implica a
utilização da palavra reservada To, permitindo especificar o menor e o maior valor que o
índice pode assumir:
Dim nome_vector(menorIndice To maiorIndice) As Tipo
Exemplos:
Dim numeros(100 To 200) As Double
Dim valores(-100 to 100) As Single

5.3.2 Processamento de vectores


Sendo um vector uma variável múltipla composta de elementos do mesmo tipo agrupados
na mesma estrutura, a forma mais adequada de executar uma mesma acção sobre uma
parte ou a totalidade dos seus elementos é utilizar uma estrutura de controlo repetitivo
ou ciclo.
Para perceber de forma mais clara o porquê da afirmação contida no parágrafo an-
terior, observe-se o problema descrito na Figura 28 na página anterior e atente-se nas
diferentes soluções propostas.
Quando confrontado com o problema de armazenar e actualizar a informação relativa
ao preço de 100 produtos, um programador poderia ser tentado a criar 100 variáveis
individuais para guardar cada um desses preços. Isso, no entanto, obrigá-lo-ia a incluir
no seu programa 100 instruções Dim para criar outras tantas variáveis individuais. Por
outro lado, quando necessitasse de actualizar os preços em, por exemplo, 5%, teria que
inserir 100 instruções do tipo preçoN = preçoN * 1,05.
Do atrás exposto facilmente se verificará que esta solução não tem qualquer exequi-
bilidade prática. Analizemos então a solução alternativa usando uma variável indexada:
em vez de 100 variáveis individuais teremos apenas um vector de 100 elementos, cada ele-
mento capaz de armazenar o preço de um produto. Consequentemente, teremos apenas
uma instrução Dim, no caso, algo como Dim preços As single. E quando necessitar
de actualizar os preços, como o vector é uma variável múltipla indexada, haverá apenas
que construir um ciclo que percorra automáticamente o vector, actualizando cada um dos
seus elementos.

Listing 6: Exemplo de processamento de um vector


1 Private Sub cmdGo_Click ( )
2 Dim v e c t o r S q r ( 1 0 0 ) As Double
3 Dim i As Integer

48
Figura 28: Porquê usar ciclos para processar vectores?

4 Dim r e s As S i n g l e
5 l s t T a b e l a . Clear
6 For i = 0 To txtMaior
7 r e s = Sqr ( i )
8 vectorSqr ( i ) = res
9 l s t T a b e l a . AddItem Format( r e s , " 0 . 0 0 0 " )
10 Next i
11 End Sub

O programa descrito na Listagem 6 na página precedente permite calcular e apresentar


sob a forma de uma tabela as raízes quadradas de todos os números inteiros compreendidos
entre 0 e um dado limite superior a especificar pelo utilizador na TextBox txtMaior (a
largura do intervalo não deve exceder 100, visto ser esta a dimensão do vector). Os valores
calculados são armazenados num vector para eventual futura utilização.

Listing 7: Outro exemplo de processamento de um vector


1 Private Sub cmdGo_Click ( )
2 Dim v e c t o r ( 1 0 0 ) As Double
3 Dim i As Integer
4 Dim i n d i c e As Integer
5 Dim r e s As S i n g l e
6 Dim l i n h a As String
7 l s t T a b e l a . Clear
8 indice = 0

49
9 For i = txtMenor To txtMaior
10 r e s = Sqr ( i )
11 vector ( indice ) = res
12 l i n h a = Format( Str ( i ) , "##0" ) + "␣−␣" + _
13 Format( v e c t o r ( i n d i c e ) , " 0 0 0 . 0 0 0 " )
14 l s t T a b e l a . AddItem l i n h a
15 indice = indice + 1
16 Next i
17 End Sub

Na variante desta sub-rotina, contida no exemplo descrito na Listagem 7 na página


anterior, é possível especificar também o limite inferior do intervalo, para além de se
demonstrarem algumas técnicas de formatação da saída de dados.
De notar que na primeira versão do programa se usou a mesma variável i para controlar
o ciclo For e para armazenar os valores dos índices do vector. Tal aconteceu porque foi
possível estabelecer naquele caso uma correspondência directa entre os valores da variável
de controlo do ciclo i e os valores do índice que controla as posições dos elementos do
vector.
Já na segunda variante do programa tal não era possível, visto que a variável de con-
trolo do ciclo iria conter valores (desde o limite inferior ao limite superior do intervalo) que
não deveriam corresponder às posições do vector em que o armazenamento dos resultados
se iria efectuar.
Em qualquer das variantes apresentadas, o processamento dos elementos do vector
consistiu em operações de escrita (de atribuição) que modificaram o seu valor. É igual-
mente possível efectuar operações de leitura sobre todos ou parte dos elementos dum
vector. Neste caso, como é óbvio, a variável do tipo Array deverá encontrar-se do lado
direito de uma operação de atribuição:
var = vector(indice)
A instrução acima copia o conteúdo de vector na posição índice para a variável var.

6 Funções e Procedimentos
As sub-rotinas descritas nos exemplos que têm sido apresentados destinam-se a executar
tarefas. Por exemplo, as rotinas descritas na Secção 2.6 na página 12 têm como objectivo
a monitorização dos valores contidos em determinadas células da folha de cálculo. Este
tipo de sub-rotinas é designado por procedimentos. Destinam-se a realizar tarefas e não
devolvem qualquer resultado.
No entanto, não é possível utilizar estes procedimentos em fórmulas duma folha de
cálculo, ao contrário do que acontece com as funções standard disponíveis no Excel, como
seja a função If referida atrás, ou a função Sum, que calcula a soma do conteúdo numérico
das várias células contidas numa dada gama. Isso acontece porque, para poderem ser
utilizadas em fórmulas, elas terão que ser estruturadas como funções, e comportarem-se
de maneira idêntica à das funções standard.
Uma função, seja ela pré-existente no Excel, ou criada pelo utilizador, deve poder

50
receber a informação de que necessita, e de conseguir devolver o resultado do seu trabalho,
de modo a esse resultado poder ser utilizado na fórmula ou expressão que a utilize. Para
tal, tem que possuir uma estrutura definida pela sintaxe seguinte:
1 Function Nome ( argumento1 , argumento2 , . . . )
2 ’ L i s t a de i n s t r u c o e s
3 Nome = r e s u l t a d o
4 End Function
Repare-se que para além das diferenças óbvias no cabeçalho e no delimitador final em
relação às sub-rotinas estudadas atrás, verifica-se o seguinte:
1. A seguir ao nome da função e entre parênteses encontra-se uma lista de argumen-
tos, através dos quais a função vai receber as informações essenciais à realização do seu
trabalho.
2. O resultado dos cálculos efectuados será entregue à fórmula ou expressão que
invocou a função, depositando-o no seu próprio nome, como se este fosse uma variável.
Atentemos na seguinte fórmula:
= 10 * sin(angulo)
Para calcular a fórmula, ir-se-á multiplicar por 10 o resultado fornecido pela função
standard sin. Esta, por sua vez, para poder fornecer o resultado deverá ter recebido a
informação de qual o ângulo (neste caso em radianos) de que se quer calcular o seno.
Quando a função termina o seu trabalho, deixará o resultado do seu cálculo no lugar que
ocupava na fórmula.

Figura 29: Funções como caixas pretas

Para o utilizador da função, não interessa conhecer o seu funcionamento interno, mas
apenas qual a informação que lhe tem que fornecer e qual o tipo de resultado esperado.
Assim sendo, pode dizer-se que do ponto de vista do utilizador da função, ela se comporta
como uma caixa preta, à qual é fornecida informação e que, com base nela, produz um
resultado (Figura 29 na página anterior).

51
6.1 Exemplo de função criada pelo programador
Vamos agora criar uma função que permita calcular a margem de lucro percentual de um
determinado produto sabendo o seu custo e o seu preço de venda. Supõe-se que esses
dados se encontrarão previamente armazenados em duas células da folha de cálculo. Uma
solução possível será a seguinte:
Listing 8: Função margemLucro
1 Public Function margemLucro ( venda , c u s t o )
2 margemLucro = ( venda − c u s t o ) / venda
3 End Function

Observe-se que esta função possui dois parâmetros de entrada, venda e custo, através
dos quais receberá os dados correspondentes. Note-se ainda que o resultado da expressão
que calcula a margem de lucro é atribuído directamente ao próprio nome da função. É
esse o processo pelo qual uma função consegue fornecer o resultado do seu trabalho à
entidade que a invocou.
Esta função poderá ser utilizada em qualquer fórmula contida numa célula da folha de
cálculo, das mesma maneira que qualquer das funções pré-existentes o seria. Um exemplo
de uma fórmula utilizando esta função seria a descrita na Figura 30.

Figura 30: Utilização da função margemLucro numa fórmula

A fórmula, que pode ser consultada na barra de fórmulas da imagem apresentada na


Figura 30 na página 52, contem referências às células D3 e D2, em que estão contidos,
respectivamente, o preço de venda e o custo do produto. Quando a função é invocada,
cópias do conteúdo destas duas células são passadas à função. Esta recebe-os através
dos parâmetros de entrada respectivos, venda e custo. O resultado do seu cálculo será
deixado na fórmula, quando a função termina o seu trabalho.

6.2 Como aceder às funções standard do Excel


Se bem que o VBA possua várias dezenas de funções pré-definidas, é muito conveniente
poder utilizar num macro qualquer uma das centenas de funções standard oferecidas pelo
Excel. Para poder aceder a elas a partir do VBA é necessário utilizar a propriedade
WorsheetFunction do objecto Application 17 . Por exemplo, para, num macro, calcular o
17
Claro que só as funções do Excel que não se encontram duplicadas no VBA podem ser acedidas por
meio da propriedade WorsheetFunction.

52
valor médio de uma gama de células (identificada pelo nome "Dados") poderia ser usada
a seguinte instrução:
med = Application.WorksheetFunction.Average(Range("Dados"))
Esta instrução permite aceder à função standard Average do Excel, à qual é fornecido
um objecto do tipo Range, representando a gama de células descritas sob o nome "Dados".

7 Programação do Excel usando VBA


Nesta secção vamos aprender a trabalhar com os objectos do Excel mais comuns: o Work-
book (Livro de trabalho), a Worksheet (Folha de cálculo) e o Range (gama de células). São
objectos que pertencem, por sua vez, ao objecto principal que é a Application (Aplicação,
neste caso, o próprio Excel).

7.1 Trabalhar com objectos Workbook


Usando estes objectos, o VBA pode criar novos livros de trabalho, abrir ou fechar exis-
tentes, entre outras acções possíveis. Para especificar qual o livro de trabalho com que
queremos trabalhar podemos fazê-lo de três maneiras diferentes:

• Usando o objecto Workbooks que representa o conjunto dos ficheiros Excel abertos
naquele momento (Workbooks(Nome));

• Usando o objecto ActiveWorkbook que representa o ficheiro com que se está de


momento a trabalhar;

• Usando o objecto ThisWorkbook que representa o ficheiro em que o próprio pro-


grama em VBA (e não o utilizador) está a operar.

Para abrir um Livro de Trabalho aplica-se o método Open ao objecto Workbooks:


Sintaxe:
Workbooks.Open Nome_do_ficheiro

Exemplo:
Workbooks.Open "C : \Documentos\Excel\Dados.xls"
Os métodos Save e Close são utilizados de forma similar para salvaguardar o conteúdo
dum ficheiro e para o fechar, respectivamente.

7.2 Trabalhar com objectos Worksheet


Normalmente um livro de trabalho possui mais do que uma folha de cálculo (é normal-
mente criado logo à partida com três). Para escolher qual a folha de cálculo com que se
pretende trabalhar usa-se o objecto Worksheets especificando um índice ou o nome da
folha de cálculo em causa, conforme se exemplifica a seguir:
Worksheets(2)

53
Worksheets("Custos")

7.2.1 Propriedades de Worksheet


Nesta secção são referidas algumas das suas propriedades mais úteis:

• Worksheet.Name - permite mudar ou obter o nome da folha de cálculo. O exemplo


abaixo muda o nome de "Folha 1" para "Medidas":

Worksheets("Folha 1").Name = "Medidas"

• Worksheet.StandardWidth - permite especificar a largura standard das colunas duma


folha de cálculo.

7.2.2 Métodos de Worksheet


Eis alguns dos métodos normalmente aplicados a este tipo de objectos:

• Worksheet.Activate - torna activa a folha de cálculo especificada18 . O exemplo


seguinte torna activa a folha de cálculo "Custos" do livro de trabalho "Dados 2007":

Workbook("Dados 2007").Worksheets("Custos").Activate

• Worksheet.Copy - copia a folha de cálculo especificada para outra posição dentro


do livro de trabalho.

Sintaxe:
Worksheet.Copy [Position]

O argumento Position é opcional e pode ter o valor Before ou After indicando a


posição onde a cópia será inserida. Caso o argumento não seja incluído, a cópia
será inserida num novo livro de trabalho.

Exemplo:
Worksheets(2).Copy After:=Worksheets(3)

O exemplo anterior faz uma cópia da 2a folha de cálculo e insere-a a seguir à 3a .


O método Move usa uma sintaxe idêntica para mover uma determinada folha de
cálculo para outra posição.

• Worksheet.Delete - permite eliminar a folha de cálculo especificada.


18
A folha de cálculo activa é aquela que está visível no momento.

54
• Worksheet.Add - permite acrescentar uma nova folha de cálculo ao livro de trabalho.

Sintaxe:
Worksheet.Add [Position]

Também aqui o argumento Position é opcional. Se for omitido, a nova folha de


cálculo será inserida imediatamente antes da folha activa.
Exemplo:
Worksheets.Add After:=Worksheets("Medidas")

7.3 Trabalhar com objectos Range


Um objecto do tipo Range pode representar uma simples célula, um conjunto de células,
uma linha ou uma coluna. Não existe em VBA um objecto específico para representar
uma célula individual.
Para nos referirmos a uma célula ou gama de células podemos aplicar o método Range
ao objecto Worksheet usando uma de duas sintaxes possíveis:
Sintaxe 1:
Worksheet.Range(Nome)
Sintaxe 2:
Worksheet.Range(Celula1, Celula2)
A 1a sintaxe usa nomes de gamas pré-definidos19 , enquanto que a 2a utiliza as re-
ferências das células que definem os dois vértices opostos da área rectangular contendo
as células que se quer especificar. Caso se omita Worksheet em qualquer das sintaxes
anteriores, o VBA pressupõe que se trata da folha de cálculo activa naquele momento.
Exemplos:
Range("C5").Value = 100
Range("D1","D10").Value = 0
Worksheets(3).Range("Dados").ClearContents
O 1o exemplo guarda o valor 100 na célula C5. O 2o exemplo atribui o valor zero
a todas as células da gama D1 a D10. Nestes dois exemplos é utilizada a propriedade
Value dos objectos Range que permite conhecer ou modificar o seu valor. No 3o exemplo
limpa-se o conteúdo das células da gama "Dados" da 3a folha de cálculo, mediante a
aplicação do método ClearContents.
Caso queiramos identificar apenas uma célula podemos também utilizar o método
Cells.
Sintaxe:
Objecto.Cells(Linha,Coluna)
19
Atribuídos em Excel usando o Menu "Insert/Name/Define".

55
Na sintaxe acima, a entidadeObjecto pode ser um objecto Worksheet ou Range. A sua
omissão, leva o VBA a partir do princípio que se trata da folha de cálculo activa. Linha
e Coluna são valores numéricos indicando qual a linha e qual a coluna na intersecção das
quais a célula se encontra20 . Veja-se o seguinte exemplo:
1 For c o l u n a = 2 To 13
2 C e l l s ( 2 , Coluna ) . Value = "Mes␣" & c o l u n a − 1
3 Next
O exemplo acima usa um ciclo For...To para preencher todas as células da gama C2 a
C13 com o texto "Mês X" em que X é o no do mês. É usado o operador de concatenação
de strings & para efectuar a colagem.
Caso se pretenda identificar uma linha ou coluna completa, podem ser utilizados os
métodos Rows e Columns.
Sintaxe:
Objecto.Rows(Indice)
Objecto.Columns(Indice)
Para ilustrar a utilização do método Rows atente-se no seguinte exemplo de sub-
rotina21 :
Listing 9: Sub-rotina InsereLinhas
1 Sub I n s e r e L i n h a s ( gama As Range , num As Integer )
2 Dim num_linhas As Integer , u l t i m a _ l i n h a As Integer
3 Dim i As Integer
4 With gama
5 num_linhas = . Rows . Count
6 u l t i m a _ l i n h a = . Rows ( num_linhas ) . Row
7 For i = 1 To num
8 . Rows ( u l t i m a _ l i n h a + i ) . I n s e r t
9 Next
10 End With
11 End Sub

Esta sub-rotina recebe como argumentos uma gama de células (um objecto do tipo
Range) e um inteiro especificando o número de linhas a inserir abaixo da última linha
dessa gama. A estrutura With...End...With é muito prática porque permite executar
um conjunto de instruções sobre um determinado objecto, neste caso qualquer objecto
Range que a sub-rotina receba como argumento. Dentro da estrutura With...End...With
omite-se qualquer referência a esse objecto, usando-se apenas os seus métodos e propri-
edades. Assim, .Rows.Count refere-se ao número total de linhas da gama especificada
e .Rows(num_linhas).Row fornece-nos o índice da última linha dessa gama. O ciclo
For...To repete num vezes a aplicação do método Insert à ultima linha da gama.
Para testar a sub-rotina InsereLinhas, use-se a seguinte rotina de teste:
20
Se o objecto for do tipo Range, os argumentos Linha e Coluna referir-se-ão à linha e à coluna dentro
da gama de células especificada.
21
Adaptado de um exemplo contido em [1].

56
1 Sub i n s e r e T e s t e ( )
2 I n s e r e L i n h a s Worksheets ( 3 ) . Range ( "Dados" ) , 3
3 End Sub
Apresentamos outro exemplo, agora referido ao método Columns:
Columns(5).ColumnWidth = 15
Aplicando o método Columns ao objecto Columns(5) (a coluna de índice 5, ou seja,
a coluna E) o efeito obtido é a mudança da sua largura para 15.

8 Adicionando uma interface gráfica


O acesso aos macros faz-se, conforme referido na Secção 2.3, mediante a combinação de
teclas ALT-F8. Pode ainda associar-se a um macro uma combinação de teclas especial
que permite accioná-lo directamente. No entanto, em muitos casos, é mais conveniente
poder interagir com o macro através de uma interface própria, concebida especialmente
para ele. Usam-se para o efeito objectos gráficos como Dialog Boxes (Caixas de Diálogo)
desenhadas à medida, que são versões mais desenvolvidas das já conhecidas Input Boxes
e Message Boxes.
Vamos nesta secção ver como construir as nossas próprias Dialog Boxes usando ob-
jectos da classe UserForm e como as integrar numa aplicação em VBA.

8.1 Instalação da Form


Uma Form é uma janela, em si mesma um objecto, utilizada como um contentor para
outros objectos gráficos (ver Secção 4.3.3 na página 28). Pode-se criar um objecto da
classe UserForm no Editor do VBA através do Menu "Insert/User Form".
Na Figura 31 na página anterior pode-se ver uma Form vazia e uma caixa de fer-
ramentas (Toolbox ) contendo os vários controlos (objectos gráficos) disponíveis para a
construção da interface. Pode ainda ver-se no canto inferior esquerdo a Janela de Propri-
edades, através da qual é possível manipular várias características da Form (como, aliás,
de qualquer controlo que esteja seleccionado). A seguir são apresentadas algumas das
principais propriedades que podem ser configuradas numa Form:
• Name - especifica o nome pelo qual a Form será identificada
• Caption - especifica o título que figura no topo da Form
• BackColor - permite seleccionar a cor do fundo
• Enabled - controla a utilização da Form pelo utilizador
• ShowModal - permite alterar o comportamento da Form de modo a controlar o
acesso à aplicação enquanto a Form estiver activa
• Font - controla o tipo e tamanho da letra utilizada
• Height - especifica a altura da Form
• Width - especifica a largura da Form

57
Figura 31: Criação de uma Form no VBA

8.2 Instalação dos Controlos


Usando a Caixa de Ferramentas Toolbox, é possível escolher e instalar os controlos na
Form. Para o efeito, basta accionar o símbolo do controlo pretendido e desenhá-lo com
o rato na Form. A seguir, quer agindo directamente sobre o controlo, quer utilizando a
Janela de Propriedades, podem-se fazer os ajustes necessários das suas características. Se
bem que cada classe de controlos possua a sua lista específica de propriedades, existem
algumas propriedades importantes que são comuns à maioria delas:

• Name - especifica o nome pelo qual o controlo será identificado no programa

• Caption - especifica o texto apresentado pelo controlo

• BackColor - permite seleccionar a cor do fundo

• Enabled - controla a utilização do objecto pelo utilizador da interface

• Height - especifica a altura do controlo

• Width - especifica a sua largura

• Visible - especifica se o controlo está ou não visível

58
Conforme referido na Secção 4.3 na página 25 no ambiente de desenvolvimento do
VBA encontram-se disponíveis diversos tipos de controlos: botões de comando (Command
Buttons), etiquetas (Labels), caixas de texto (Text Boxes), quadros (Frames), botões de
opção (Option Buttons), caixas de verificação (Check Boxes) e caixas de listagem (List
Boxes), entre outros.

8.3 Incorporação da Form na sub-rotina


Nesta fase há três aspectos a considerar:

1. Visualização da Form

2. Tratamento dos eventos que ocorram enquanto a Form estiver visível

3. Processamento dos resultados fornecidos pela Form

O 2o ponto, referente ao tratamento dos eventos, foi já discutido anteriormente. Os


restantes serão tratados nas secções seguintes.

8.3.1 Como visualizar e terminar uma Form


Para visualizar a UserForm usa-se o método Show :
1 Exemplo :
2 MinhaForm . Show
Se, em alternativa, se pretender arrancar com a Form mas sem a visualizar nesse
momento, usa-se a instrução Load :
1 Exemplo :
2 Load MinhaForm
Quando se pretender tornar a Form visível, aplicar-se-á então o método Show.
Após a sua utilização, quando uma Form deixar de ser necessária, deve-se utilizar a
instrução Unload para a desactivar:
1 Exemplo :
2 Unload Me
No entanto, desactivar uma Form através da instrução Unload não implica que esta
deixe de estar em memória. Para garantir a sua efectiva remoção, que se traduzirá na
geração do evento Terminate, haverá que se usar a seguinte técnica:
1 Exemplo :
2 Set MinhaForm = Nothing

8.3.2 Tratamento de eventos através de Event Handlers


Este tema foi já introduzido na Secção 4.1.3 na página 21. Pelo menos um Event Handler
deve ser associado a um controlo instalado na form. Vamos agora considerar o exemplo de
Event Handler utilizando a instrução Unload Me e associado a um controlo (normalmente

59
um botão de comando) presente na Form. Nesta instrução, a palavra Me indica ao VBA
que a Form a desactivar será aquela a que o Event Handler diz respeito.
Um exemplo de um Event Handler que termine uma Form pode ser:
Listing 10: Handler do objecto cmdFechar para o evento click
1 Private Sub cmdFechar_Click ( )
2 Dim op As Integer
3 op = MsgBox( " S a i r ? ( Yes/No) " , vbYesNo + vbQuestion )
4 I f op = vbYes Then
5 Unload Me
6 End I f
7 End Sub

A sub-rotina acima vai especificar a reacção do botão de comando cmdFechar ao


evento Click, neste caso apresentar uma Msg Box que confirme a intenção do utilizador
de fechar a Form. O tratamento de qualquer evento a ocorrer na Form, ou em qualquer
dos controlos nela presentes, deverá basear-se num Event Handler que defina a resposta
adequada.
Outro evento importante é o Change que ocorre sempre que se altera o conteúdo de
objectos como as Text Box. Na Secção 8.4 na página 63 encontra-se um exemplo de um
Event Handler associado a este tipo de evento.

8.3.3 Como recolher os resultados de uma Form


Uma UserForm é muitas vezes utilizada para pedir informação ao utilizador. Nesse caso,
será necessário recolher os dados introduzidos ou as opções seleccionadas nos controlos
apropriados.
Para tal é preciso aceder às propriedades Value dos diversos controlos existentes na
Form e copiar os seus valores actuais para células da folha de cálculo.
O conteúdo da propriedade Value nas principais classes de controlos encontra-se re-
sumida na seguinte tabela:

Classe Conteúdo
CheckBox True ou False conforme esteja ou não activada
OptionButton True ou False conforme esteja ou não activada
ListBox A posição da linha seleccionada
TextBox O conteúdo da TextBox (pode-se também usar a propriedade Text)
TabStrip Um inteiro indicando qual a Tab que está activa
Note-se que nas List Boxes em VBA a 1a linha tem a posição 1, ao contrário do que
se passa em Visual Basic, em que começa na posição 0.

8.3.4 Exemplo de aplicação


Vamos finalmente aplicar estes conceitos e técnicas na construção e integração de uma
UserForm (descrita na Figura 32 na página seguinte) que permita a introdução conjunta

60
dos dados de um aluno (Nome, Número e Curso) sem necessidade de recorrer a três Input
Boxes separadas.
Esta UserForm conterá duas Text Boxes para inserção do Nome e Número do aluno e
uma Combo Box para selecção do seu Curso. Uma Combo Box é um controlo semelhante
a uma List Box em que a lista está normalmente invisível, só aparecendo quando o campo
superior é activado. Aplicam-se-lhe os mesmos métodos da classe ListBox.
Listing 11: Exemplo de sub-rotina de invocação de uma UserForm
1 Public Sub testUserFormInput ( )
2 usrFrmInput . Show
3 Set usrFrmInput = Nothing
4 End Sub

O macro da Listagem 11 na página 60 chama a UserForm com o nome usrFrmInput e


remove-a de memória quando ela termine o seu trabalho. Para facilitar a sua invocação,
é conveniente associar ao macro uma combinação de teclas específica, usando uma das
técnicas já aprendidas (ver parte final da Secção 2.6).

Listing 12: Exemplo de sub-rotina de inicialização de uma UserForm


1 Private Sub U s e r F o r m _ I n i t i a l i z e ( )
2 cmbCursos . AddItem " C i v i l "
3 cmbCursos . AddItem " I n f o r m a t i c a "
4 cmbCursos . AddItem " E l e c t r o t e c n i a "
5 cmbCursos . AddItem " G e o t e c n i a "
6 cmbCursos . AddItem " Quimica "
7 cmbCursos . AddItem " I n s t r u m e n t a c a o ␣ Medica "
8 End Sub

Figura 32: A UserForm para Entrada Múltipla de Dados

61
Esta sub-rotina especial, que é executada automaticamente quando a UserForm ar-
ranca, trata de inicializar a Combo Box "cmbCursos" com os nomes dos diferentes cursos
da escola.
Listing 13: Handler do objecto cmdFechar para o evento Click
1 Private Sub cmdFechar_Click ( )
2 With Worksheets ( 4 )
3 . [ H5 ] = txtNome . Value
4 . [ I 5 ] = txtNum . Value
5 . [ J5 ] = cmbCursos . Text
6 End With
7 Unload Me
8 End Sub

Este Event Handler está associado ao botão cmdFechar e é chamado quando sobre
ele ocorre o evento Click. Antes de fechar a UserForm usando Unload, copia o conteúdo
das duas Text Box e o da linha seleccionada da Combo Box para três células contíguas
da folha de cálculo.

8.4 Exemplo de aplicação mais elaborado


Neste exemplo mais elaborado vamos introduzir o controlo Tabstrip existente no VBA.
Este objecto permite a apresentação de diferentes conjuntos de valores mediante a selecção
de diferentes separadores ("tabs"). Na Figura 33 na página 62 pode-se encontrar um
exemplo de um objecto deste tipo.

Figura 33: Objecto da classe Tabstrip

Numa Tabstrip é usual inserirem-se outros controlos, um pouco como se faria numa
mini-Form ou num quadro. No exemplo da figura, encontram-se três TextBox.
Conforme referido na Secção 4.1, para que um controlo possa reagir a acções pro-
vocadas pelo utilizador, como o "clicar" do rato, é preciso que o programador crie sub-

62
programas especiais, chamados Event Handlers e que esses sub-programas sejam associ-
ados aos controlos respectivos.
Vamos apresentar dois exemplos de Event Handlers, sub-programas que permitem
especificar o comportamento de controlos em face de certos eventos. Em 1o lugar,
apresentar-se-á o Event Handler da form "UserForm2" para o evento Initialize, que ocorre
quando a form é criada após o arranque do programa:
Listing 14: Sub-rotina de inicialização da UserForm
1 Private Sub U s e r F o r m _ I n i t i a l i z e ( )
2 With TabStrip1
3 . Tabs ( 0 ) . Caption = " C i v i l "
4 . Tabs ( 1 ) . Caption = " I n f o r m a t i c a "
5 . Tabs .Add " E l e c t r o t e c n i a "
6 End With
7 With Worksheets ( 4 )
8 txtNumAlunos . Text = . [ D5 ]
9 txtPercAprov . Text = . [ D6 ] ∗ 100
10 txtMedia . Text = . [ D7 ]
11 End With
12 End Sub

Este procedimento vai inicializar os dois separadores do controlo Tabstrip1 com que
ele é criado por defeito, mudando-lhe os nomes para "Civil" e "Informática". De seguida,
acrescenta um terceiro separador e dá-lhe o nome "Electrotecnia". Por fim, são atribuídos
a cada uma das TextBox contidas na Tabstrip1 os conteúdos das três células da folha de
cálculo referentes ao curso referente ao 1o separador.
O próximo procedimento é o Event Handler do controlo Tabstrip1 para o evento
Change que ocorre sempre que alguma alteração ocorre nesse controlo, concretamente,
uma mudança de separador activo.
Listing 15: Handler associado ao objecto Tabstrip1 para o evento Change
1 Private Sub TabStrip1_Change ( )
2 Dim v As Integer
3 With Worksheets ( 4 )
4 v = TabStrip1 . Value
5 I f v = 0 Then
6 txtNumAlunos = . [ D5 ]
7 txtPercAprov = . [ D6 ] ∗ 100
8 txtMedia = . [ D7 ]
9 E l s e I f v = 1 Then
10 txtNumAlunos = . [ E5 ]
11 txtPercAprov = . [ E6 ] ∗ 100
12 txtMedia = . [ E7 ]
13 Else
14 txtNumAlunos = . [ F5 ]
15 txtPercAprov = . [ F6 ] ∗ 100

63
16 txtMedia = . [ F7 ]
17 End I f
18 End With
19 End Sub

A propriedade Value dos objectos Tabstrip contem um valor numérico inteiro que
traduz qual o separador que está activo. Em função do valor recolhido na variável v, a
estrutura condicional imbricada If...Then...Else irá escolher o conjunto de valores corres-
pondente.

9 Notas finais
Parte da estrutura e alguns dos exemplos apresentados foram inspirados no livro de Paul
McFreddies[1]. Foram ainda reutilizados e adaptados materiais contidos na Sebenta de
Introdução à Computação da minha autoria[2].

Referências
[1] Paul McFredies. VBA for the Microsoft Office System, QUE.

[2] António Silva. Sebenta de Introdução à Computação - Visual Basic, ISEP.

64

Você também pode gostar