Académique Documents
Professionnel Documents
Culture Documents
A ligação da Unidade Central de Processamento com o mundo exterior (ou seja, você) é
feita através dos Dispositivos de Entrada e Saída: a tela do computador, o teclado,
impressoras, o mouse, auto-falantes, câmeras e microfones para programas multimídia,
scanners, etc.
A tradução das instruções de uma linguagem de alto nível para a linguagem de máquina
pode ser feita de duas maneiras diferentes:
Exercícios
1. Inserir a seguinte planilha de gastos pessoais:
A B C D E F
1 Gastos Cinema Almoço Gasolina Cônjuge Teatro
2 285 10 20 35 200 20
• no disco;
• em disquete;
• movendo o arquivo do disco para o disquete.
Assim, os dados que podemos inserir numa planilha podem ser dos seguintes tipos:
1. texto;
2. valores numéricos;
3. fórmulas.
1. um duplo clique com o mouse nesta célula, que aciona um cursor que indica
que podemos editar o seu conteúdo;
2. a tecla F2 no teclado, que produz o mesmo efeito do duplo clique com o
mouse;
3. um clique com o mouse sobre o campo de edição no topo da planilha, que
aciona um cursor no campo de edição e permite editar o conteúdo da célula a
partir do campo de edição.
As Fórmulas se distinguem das células de texto e de números por serem iniciadas pelo
símbolo `='. Por exemplo, uma célula contendo a expressão =3 + 4 é uma fórmula, que
se avaliada produz o resultado esperado (ou seja o valor numérico 7); já uma célula
contendo apenas a expressão 3+4 (sem o símbolo `=') é sómente um texto composto por
três caracteres: ``3'', ``+'' e ``4''.
Após o término da edição de uma fórmula, não obtemos a cadeia de caracteres que foi
digitada, mas sim o valor computado a partir dela. Por exemplo, após digitarmos = 3 * 5
+ (7 - 2)obtemos o valor 20. No entanto, a cadeia de caracteres que define a fórmula (ou
seja, ``= 3 * 5 + (7 - 2)'') aparece no campo de edição no topo da planilha.
Cada célula na planilha possui um nome. O nome da célula é dado no formato ``batalha
naval'': cada coluna da planilha é nomeada com uma letra, e cada linha é nomeada com
um número. Por exemplo, a célula que se encontra terceira linha da coluna D é a célula
D3.
Nas fórmulas, em qualquer lugar em que podemos inserir um número numa expressão
aritmética podemos também inserir uma referência a uma célula. Por exemplo, suponha
que queiramos que na terceira linha da planilha a terceira célula seja a soma da primeira
com a segunda. Para isso, escrevemos:
A B C
1
2
3 7 3 =A3+B3
Quando trabalhamos com tabelas, muitas vezes queremos repetir em todas as linhas
uma mesma operação. Por exemplo, se tivermos uma tabela com quatro linhas e
quisermos que a terceira coluna seja sempre a soma das duas primeiras, basta escrever a
fórmula na primeira linha e copiá-la para as outras linhas.
A título de ilustração, vamos supor que temos uma tabela com valores de Capital Inicial
($) e Taxa de Juros Mensal (%) e desejamos calcular o Capital Final, a juros simples, no
final de 6 meses. A fórmula para o Capital Final é Cf = Ci * (1 + n * i/100), onde Ci é
dado na primeira coluna, i é dado na segunda coluna e n é sempre igual a 6. Começamos
com a tabela:
A B C
1 Capital Inicial Ci Taxa de Juros i Capital Final Cf
2 100,00 2,00 =A2*(1+6*(B2/100))
3 100,00 3,00
4 200,00 2,50
5 200,00 3,50
A B C
1 Capital Inicial Ci Taxa de Juros i Capital Final Cf
2 100,00 2,00 =A2*(1+6*(B2/100))
3 100,00 3,00 =A3*(1+6*(B3/100))
4 200,00 2,50 =A4*(1+6*(B4/100))
5 200,00 3,50 =A5*(1+6*(B5/100))
como . Isso significa que todas as fórmulas geradas usariam o valor da célula B2,
Exercícios
1. Insira numa planilha a tabela de juros simples vista acima.
2. Crie uma outra planilha igual à primeira, só que desta vez usando juros compostos. A
fórmula para juros compostos é Cf = Ci * (1 + i )n, onde:
C/5 = (F - 32)/ 9
1. números;
2. referências a células;
3. expressões aritméticas quaisquer.
A B C
1 1000 25 =JurosSimples(A1; B1; 6)
A B C
1 1000 25 =JurosSimples(A1/2; B1+10; 6)
Uma chamada a função pode ocorrer em uma fórmula exatamente nos mesmos lugares
em que podem ocorrer números ou referências a células. Muitas vezes, como nos
exemplos acima, a fórmula contém apenas a chamada da função. Suponhamos agora
que nós temos a função de nome INT que recebe como parâmetro um número e retorna
a parte inteira do número. Por exemplo, na situação abaixo a fórmula deve retornar o
valor 5, resultado da soma da parte inteira de 2,5 com 3.
A B
1 2,5 =INT(A1)+3
As funções no Excel são divididas em dois tipos:
2. funções programadas: estas funções não existem ``dentro'' do Excel e nós precisamos
criá-las. Ou seja, precisamos programar a função para que depois possamos usá-la
numa planilha (ou numa outra função). Por exemplo, a função JurosSimples acima não
existe pré-definida e se quisermos usá-la precisaremos programá-la. Boa parte dos
próximos capítulos será dedicada a ensinar como se programa uma função. Vamos
agora começar a examinar os ingredientes necessários para a construção de uma função.
O primeiro passo necessário para construir uma função é criar um Módulo. Toda função
que definirmos deverá estar dentro de um módulo. Para criarmos um módulo no Excel
basta ativarmos o menu Inserir|Macro|Módulo (nas versões mais recentes do Excel
este procedimento pode ser diferente). Uma vez criado, o módulo passa a ser parte
integrante do documento, da mesma forma que as várias planilhas que compõem o
documento, e vai ser salvo e aberto junto com o documento.
Um módulo, tal como uma planilha, também possui um nome, que fica localizado na
aba na parte inferior da janela do Excel. Dentro do módulo podemos definir uma ou
mais funções. Todas as funções definidas nos módulos podem ser chamadas de qualquer
planilha do mesmo documento.
1. o cabeçalho: informa que estamos definindo uma função, qual o seu nome, quais são
seus parâmetros e que tipo de valor a função retorna.
2. o corpo da função: é a parte que define qual a computação que deverá ser processada
quando a função for chamada.
3. o término da função: indica que terminou a definição da função.
Uma outra função poderá ser definida logo em seguida. O formato genérico de uma
função é o seguinte:
X=0
X=1
Até aqui já utilizamos dois tipos de dados: números inteiros (Integer) e reais (Double).
Mais adiante também encontraremos o tipo String, que é o tipo de dados das variáveis
que armazenam texto. Também encontraremos o tipo Boolean, que é um tipo de dados
que possui apenas 2 dois valores: TRUE e FALSE.
Exercícios
1. Faça uma função CMparaPOL que recebe uma medida em centímetros e a devolve
em polegadas, onde 1 polegada = 2,54 cm. Faça também a função inversa POLparaCM,
que converte de polegadas para centímetros.
(c):Invente valores para as três primeiras colunas que gerem os três tipos de
determinante. Insira uma sexta coluna que, no caso de discriminante nulo,
calcula esta raiz única, que será igual a -b/2a.
Comandos de Seleção (IF-THEN e IF-
THEN-ELSE)
Os comandos IF-THEN e IF-THEN-ELSE permitem selecionar quais os comandos que
serão executados dependendo de uma condição.
If Condição Then
Comando 1
Comando N
End If
Comando N+1
If Condição Then
Comando 1
Comando N
Else
Comando N+1
Comando N+M
End If
Comando N+M+1
'Declaracoes
Dim Taxa As Double
Dim Acrescimo As Double
• = (igual a)
• < (menor que)
• > (maior que)
• <= (menor ou igual a)
• >= (maior ou igual a)
• <> (diferente)
• AND (conjunção)
• OR (disjunção)
• NOT (negação)
Por exemplos, uma expressão condicional que testa se uma variável X está entre os
Se quisermos verificar se Y NÃO está entre MIN e MAX, podemos fazê-lo de duas
formas: ou .
Retomando o exemplo dos juros progressivos, se a conta contiver um saldo inferior a
R$10.000,00 então o banco pagará juros mensais de 2%. Para cada R$5.000,00
adicionais acima de R$10.000,00 o banco pagará 0,5% a mais, até atingir a taxa limite
de 4%. A função TaxaProgressiva3 fica:
Exercícios
1. Considere a seguinte classificação de consumidores, baseada na percentagem do
salário gasto com itens da cesta básica:
Esbanjador até 25% (inclusive)
Gastador entre 25% e 53% (inclusive)
Comedido entre 53% e 75% (inclusive)
Essencial entre 75% e 95% (inclusive)
(a) Fazer um programa ClassificaConsumo, que recebe um número de 0 a 100
(real), representando a percentagem do salário gasta por uma família com itens
da cesta básica, e retorna uma cadeia (string), contendo a classificação
correspondente.
(b) Fazer uma planilha com duas colunas. Na primeira, a percentagem do salário
gasta por uma família com itens da cesta básica, que deve ir variando de 0 a
100% em intervalos de 10%. A segunda coluna contém a classificação.
(c) O que acontece com 100%?
2.Na vida real, as fronteiras de classificação são menos definidas. Suponha que nós
tenhamos a seguinte classificação, ``com buracos'':
Esbanjador até 20%
Gastador entre 25% e 45%
Comedido entre 53% e 75%
Essencial entre 80% e 95%
(a) Fazer um programa ClassificaConsumo2 tal que, se algum percentagem for
fornecida que não é coberta pelos intervalos acima, o programa deve fornecer a
cadeia "INDEFINIDO".
(b) Fazer uma planilha semelhante à do exercício anterior.
O comando básico de iteração (embora não seja o único comando capaz de iterar) é o
comando DO WHILE-LOOP. Este comando possui o seguinte formato:
Do While Condição
Comando 1
Comando N
Loop
Comando N+1
Desta forma, a condição de entrada controla quantas vezes a iteração será repetida.
Enquanto ela permanecer verdadeira, o interior da malha será repetido. Pode ser que ela
nunca fique falsa; isso quer dizer que o programa não pára nunca, e é um programa
defeituoso. Portanto, bastante cuidado com o uso da iteração.
Por exemplo, vejamos o programa elevadoa(X,Y) que calcula XY. A idéia básica é
multiplicar o número X por ele mesmo Y vezes, ou seja:
O valor 1 aparece como um valor inicial e, obviamente, não influencia o resultado final.
Além disso, a presença do número 1 no cáculo garante que o resultado seja correto
mesmo quando Y = 0, pois nesse caso X0 = 1:
Vamos estudar o caso agora de juros compostos com uma taxa de juros que varia
progressivamente com o tempo, em incrementos fixos. Por exemplo, podemos ter uma
taxa de juros inicial de 2% e incrementos de 0.1% mensais: no primeiro mês a taxa de
juros será de 2%, no segundo será 2,1%, etc. até o décimo-primeiro mês, quando será de
3%. Um dado capital inicial deverá sofrer juros compostos (acumulados) onde a taxa
mensal varia progressivamente. Uma função que calcula o capital acumulado ao final de
vários meses é a seguinte:
'Malha principal
Do While mes <= NMeses
'Calcula o capital no final do mês corrente
CapAtual = CapAtual * (1 + TaxaAtual / 100)
'Próximo mês
mes = mes + 1
'Calcula a taxa do próximo mês
TaxaAtual = TaxaAtual + IncrTaxaMensal
Loop
'Retorno da função
JurosProgr = CapAtual
'Capital ao fim de NMeses
End Function
Exercícios
1. Fazer um programa que calcule a soma dos N primeiros números inteiros: 1 + 2 + 3 +
... + N
Fazer uma planilha que testa este programa para valores de N= 1, 5, 10, 15, 25
2. Fazer uma função S(N) que calcule a seguinte soma para N termos:
Fazer uma planilha que testa este programa para valores de N= 1, 5, 10, 15, 25.
3. Dados dois inteiros positivos N e P, escreva uma função que calcula a combinação de
N sobre P:
Note que tanto o numerador quando o denominador possuem P fatores. A
retornar 1 se .
4.
(a) Fazer uma função PA(N,A1,R) que calcula o N-ésimo termo de uma
progressão aritmética de termo inicial A1 e razão R. Lembre-se de que Ai = R +
Ai-1.
(b) Fazer uma função PG(N,A1,R) que calcula o N-ésimo termo de uma
progressão geométrica de termo inicial A1 e razão R. Lembre-se de que Ai = R *
Ai-1.
Subrotinas, Macros, Entrada e Saída de
dados
Até agora vimos apenas programas no formato função. Funções possuem as seguintes
propriedades:
• Para acioná-las, podemos inserir uma chamada dentro de uma fórmula de uma
planilha. No entanto, não sabemos (ou não temos como) chamar uma função
``de fora'' da planilha.
• A única forma de passar dados para uma função é através dos parâmetros de
entrada (veremos mais adiante que isso pode ser relaxado um pouco, mas, de
qualquer forma, os dados obtidos por uma função vão sempre se originar da
planilha).
• A única forma de uma função passar dados de volta para a planilha é através de
um (único) valor ao final da computação.
Vamos agora ver uma forma de ativar programas de maneira independente de uma
planilha, obter informações de ``fora'' da planilha e poder não retornar nenhum valor, e
comunicar resultados ao usuário por meio de janelas.
End Sub
Subrotinas diferem de funções por não retornarem um valor. Por isso, não associamos
um tipo de dados às subrotinas. Tampouco podemos utilizar o nome da subrotina como
variável.
Uma classe especial de subrotinas que nos é muito interessante é a classe de subrotinas
em que a lista de parâmetros é vazia. Neste caso, a subrotina é chamada de macro e
pode ser ativada de forma independente da planilha.
Mas se não há passagem de parâmetros nem retorno de valor, como passar e receber
dados de uma macro? Para isso, o código da macro precisa acionar comandos de
entrada e saída, que gerarão janelas de comunicação através das quais se fará a
passagem da informação. Se quisermos entrar com algum dado, deveremos inserir na
subrotina uma chamada à função via InputBox, da seguinte maneira:
Deveremos preencher o campo em branco e então clicar no botão (ou apertar ENTER).
O String digitado no campo será atribuído à variavel Texto, que deverá, portanto, ser
do tipo String.
que terá o efeito de primeiro mostrar uma janela de diálogo cujo valor preenchido
deverá ser o número de produtos, e em seguida uma outra caixa de diálogo que deverá
ser preenchida com o preço do primeiro produto.
Além de solicitar dados ao usuário, uma macro pode exibir alguma informação, por
exemplo o resultado de alguma computação. Esta comunicação pode ser feita na forma
de uma janela que mostra o texto ao usuário e um botão de OK que o usuário pode
clicar ao terminar de ler a mensagem.
Vejamos por exemplo a macro SomaNum que nos solicita 4 valores (representando por
exemplo preços de vários produtos para um pedido de compra) e calcula a sua soma:
Sub SomaNum()
Dim Soma As Double
Dim Cont As Integer
Dim Valor As Double
'Inicialização
Soma = 0
Cont = 0
Valor = 0 '(Desnecessário, apenas ajuda a entender o programa)
Do While Cont < 4
'Le novo valor, convertendo-o para Double
Valor = CDbl(InputBox(``Entre com o valor ''))
'Atualiza a soma
Soma = Soma + Valor
'Prepara a próxima iteração
Cont = Cont + 1
Loop
'Apresenta resposta
MsgBox (``A soma é: '' & Soma)
End Sub
Esta macro pode ser ``embelezada'' de forma a não ficar presa a um número fixo de
valores nos solicitando, no início da execução, qual o número desejado de valores.
Também podemos ``embelezar'' a solicitação dos valores, indicando a posição na
seqüência de cada valor. Desta forma, criamos SomaNum1:
Sub SomaNum1()
Dim Soma As Double
Dim Cont As Integer
Dim Valor As Double
Dim N As Integer
'Inicialização
Soma = 0
Cont = 0
Valor = 0 'Desnecessário
N = CInt(InputBox(``Número de valores a serem somados: ''))
Do While Cont < N
'Le novo valor, convertendo-o para Double
Valor = CDbl(InputBox(``Entre com o valor '' & (Cont + 1)))
'Atualiza a soma
Soma = Soma + Valor
'Prepara a próxima iteração
Cont = Cont + 1
Loop
'Apresenta resposta
MsgBox (``A soma dos '' & N & `` valores é: '' & Soma)
End Sub
Podemos sofisticar ainda mais este programa, nos liberando de dizer no início quantos
valores iremos entrar. Podemos assumir que todos os valores são positivos e assim, ao
entrarmos um número negativo, estaremos encerrando a seqüência de preços. Assim,
criamos SomaNum2:
Sub SomaNum2()
'Calcula a soma até encontrar um número menor ou igual a 0.
Dim Soma As Double
Dim Valor As Double
'Inicialização
Soma = 0
Valor = CDbl(InputBox(``Entre com um valor.'' & Chr(13) & ``[Valor negativo para
terminar]''))
'Chr(13) é o caracter para mudar de linha
Do While Valor > 0
'Atualiza a soma
Soma = Soma + Valor
'Prepara a próxima iteração
'Le novo valor, convertendo-o para Double
Valor = CDbl(InputBox(``Entre com um valor.'' & Chr(13) & ``[Valor negativo para
terminar]''))
Loop
'Apresenta resposta
MsgBox (``A soma dos valores é: '' & Soma)
End Sub
Sub MelhorPr()
Dim Min As Double
'menor preço até o momento
Dim Preco As Double
'valor do produto atual
Dim Cont As Integer
'contador de produtos
'Inicialização
Min = 9E+99 'Este eh um valor muito alto: 9*1099
Cont = 0
MsgBox (``Você deverá entrar com o preço de'' & Chr(13) & ``um produto para quatro
fornecedores.'')
Do While Cont < 4
'Lê o preço do produto, convertendo-o para Double
Preco = CDbl(InputBox( ``Preço do produto do fornecedor '' & (Cont + 1) & ``:'' ))
'Verifica se preço é menor que o mínimo atual
If Preco < Min Then
Min = Preco 'Novo valor mínimo encontrado
End If
'Prepara próxima iteração
Cont = Cont + 1
Loop
'Fornece a resposta
MsgBox (``O menor preço é: '' & Min)
End Sub
Exercícios
1. Altere MelhorPr para aceitar um número qualquer de preços.
2. Fazer uma macro que lê N valores e apresenta a soma dos valores positivos apenas.
3. O Departamento de Contabilidade Forênsica da Universidade Municipal de Uauá
(BA) estuda casos famosos de fraude bancária. O mundialmente famoso Teste de Uauá
realiza o seguinte procedimento:
Dado um capital inicial, uma taxa mensal de juros e um capital final, determinar
se é consistente que o capital final foi obtido ao longo do tempo a partir do
capital inicial sob juros compostos.
Fazer uma macro que realiza o Teste de Uauá. No caso de consistência
detectada, indicar o número de meses necessários para gerar o capital final. No
caso de inconsistência, apenas mostrar em uma janela a mensagem ``Fraude
detectada''.
• A média da turma.
• A maior nota.
• A menor nota.
Simulação de Programas
Para simular um programa no computador você deverá proceder da seguinte maneira:
Neste ponto, já se pode acionar o programa, que deverá ativar uma janela de
depuração e parar no início da função/procedimento marcado.
3. Selecionar variáveis que serão observadas na simulação. Para isso, marcar a variável
(uma expressão também pode ser marcada e observada). Em seguida, na barra de
programa, clicar no oculinhos e pedir para adicionar a variável. Selecionar a aba de
``Inspecionar'' para ver as variáveis selecionadas.
4. Simular. Para isso, os dois últimos botões da barra de programas podem ser usados (a
diferença entre eles está na ativação de outras funções e procedimentos de dentro de um
programa, como veremos mais adiante.
Na simulação, o comando (linha) selecionado será aquele ainda por executar. Após a
execução de cada comando, o valor das variáveis inspecionadas pode mudar. No
término do programa, a janela de depuração desaparece.
O tipo de dados chamado de Booleano possui apenas dois valores: TRUE e FALSE.
Uma variável pode ser declarada como booleana assim:
Teste = True
Uma variável booleana pode aparecer em expressões nos lugares onde uma condição
poderia aparecer. Por exemplo:
If Teste Then
Um segundo exemplo: vamos fazer uma macro que lê uma sequência de inteiros
positivos e informa ao usuário se esta sequência está em ordem crescente. A seqüência é
terminada por um número menor que zero.
Sub EmOrdem()
' Lê uma sequência de inteiros positivos e informa ao usuário
' se esta sequência está em ordem crescente
Dim Atual As Integer
Dim Velho As Integer
Dim AindaEmOrdem As Boolean
'Inicializações
AindaEmOrdem = True
Atual = CInt(InputBox(``Entre com um inteiro:''))
Velho = Atual 'Velho inicia com o mesmo valor que atual
'Principal
Do While Atual >= 0
If AindaEmOrdem And (Atual < Velho) Then
'Teste falhou
AindaEmOrdem = False
End If
'Prepara a próxima iteração
Velho = Atual
Atual = CInt(InputBox(``Entre com mais um inteiro:''))
Loop
If AindaEmOrdem Then
MsgBox(``Seqüência em ordem.'')
Else MsgBox(``Desordenado.'')
End If
End Sub
Exercícios
1. Alterar o programa acima para parar e dar a resposta assim que descobrir que a
seqüência não está em ordem.
2. Simular no computador as suas soluções para os exercícios 1 e 2 do capítulo 5, para
os valores de N=5 e N=6.
3. O resto da divisão inteira de X por Y é calculada por X MOD Y. O número X é
divisível por Y se X MOD Y = 0. Neste caso, também dizemos que X é um mútiplo de Y.
A B
1 Produto Quantidade em Estoque
2 Vassoura 125
3 Rodo -2
...
53 Esfregão 12
Neste caso, vamos pensar que a planilha é uma Matriz de dimensão 2x2. A posição
(I,J) da matriz corresponde à linha I e à coluna J. Por exemplo, na planilha acima, a
posição (2,1) contém o valor ``Vassoura'' de tipo String e a posição (53,2) possui o valor
12 de tipo inteiro (ou double).
De maneira geral o valor da planilha que fica na posição de interseção da linha I com a
coluna J pode ser lido através do comando Valor = Cells( I, J ).
Um programa que lê a soma dos itens em estoque (só os itens positivos, pois os itens
negativos indicam falta de produto) pode ser o seguinte:
Suponhamos agora que não sabemos a priori qual a última linha da coluna de valores.
Há uma forma de saber se uma posição está vazia numa planilha, usando a função
IsEmpty() . Por exemplo, a condição IsEmpty( cells( I, J ) ) retorna True se a célula
(I,J) está vazia e retorna False se algo estiver escrito nela.
Escrita de dados na planilha não pode ser feita a partir de funções, apenas a partir de
subrotinas. Isto porque as funções não possuem autorização para mudar a planilha,
apenas para lê-las e retornar um único valor.
Para escrever um valor na posição (I,J) da planilha, é preciso usar o comando cells( I, J
) = <valor>. Se quisermos simplesmente apagar um valor contido numa célula,
podemos usar cells( I, J ) = Empty.
A B C D
1 Nome Saldo Anterior Crédito Débito Saldo Atual
2 Aarão 132,45 12,12 4321,12
3 Abel -987,65 78,90 56,56
...
Sub SaldoAtual()
' Saldo Anterior na coluna 2
' Credito na coluna 3
' Débito na coluna 4
' Saldo atual na coluna 5
Dim Anterior As Double
Dim Credito As Double
Dim Debito As Double
Dim Atual As Double
Dim I As Integer 'Contador das linhas
I = 2 'Primeira linha
'Não há necessidade de inicialização pois as
' variáveis internas são lidas no início de cada ciclo
Do While Not IsEmpty( Cells(I,1) )
'Lê dados da planilha
Anterior = Cells( I, 2)
Credito = Cells( I, 3)
Debito = Cells( I, 4)
Atual = Anterior + Credito - Debito
'Escreve dados na Planilha
Cells(I, 5) = Atual
'Próxima Linha
I=I+1
Loop
End Sub
Note que poderíamos dispensar todas as variáveis internas (exceto I), sendo que as 5
primeiras atribuições do loop ficariam comprimidas em um único (e quase
incompreensível) comando:
Exercícios
1. Considere uma planilha que descreve para cada produto, a quantidade em estoque, o
estoque mínimo e o estado do estoque.
A B C D
1 Produto Quantidade em Estoque Estoque Mínimo Status
2 Vassoura 125 100
3 Rodo 2 10
...
53 Esfregão 12 20
Fazer uma macro que escreve na coluna de Status escreve ``OK'' se o estoque
existente for maior que o estoque mínimo, ou escreve ``ATENÇÃO!!!'' se o
estoque estiver abaixo do mínimo. Resolver o problema em dois casos:
2. Fazer uma macro que copia uma coluna de um lugar para outro da planilha. Assumir
que:
Vamos supor que nós temos a seguinte planilha, que realiza o controle de estoque de
uma empresa.
A B C D
PRODUTO Em Estoque Estoque Mínimo Pedido de Compra
1 Vassoura 12 100
2 Rodo 120 70
3 Esfregão 5 50
...
Então vamos escrever a função RepoeEstoque que calcula a quantidade de estoque que
precisa ser reposta.
Const ColunaProd = 1 'cria um ``apelido'' (ColunaProd) para a Constante 1
Const ColunaEs = 2
Const ColunaMin = 3
Const ColunaPed = 4
Const ColunaUnit = 5
Const ColunaCusto = 6
Function RepoeEstoque(Linha As Integer) As Integer
'Este programa descobre qual a quantidade de produto
' necessária em um pedido de compra para que o estoque
' atual iguale o estoque mínimo na Linha da planilha
Dim emEstoque As Integer
Dim estoqueMin As Integer
Dim faltando As Integer
'Inicializações
emEstoque = Cells(Linha, ColunaEs)
estoqueMin = Cells(Linha, ColunaMin)
faltando = 0 'Assume inicialmente que estoque está OK
'Principal
If emEstoque < estoqueMin Then
faltando = estoqueMin - emEstoque
End If
RepoeEstoque = faltando
End Function
Este comando declara uma Constante, que pode ser usada em qualquer parte do módulo
em lugar do número. E para que usar constantes? Em primeiro lugar, porque o programa
fica mais claro (ColunaMin é muito mais expressivo que o número 3 para sabermos a
que este número se refere). Em segundo lugar, se houver várias ocorrências da constante
no programa, para mudar seu valor basta alterar o valor associado a ela na declaração
Const. Sem usar Const, teríamos que sair ``caçando'' as ocorrênicas do número e alterá-
la no corpo do programa. No exemplo, usamos Const para o número das colunas, uma
mudança de ordem nas colunas da planilha necessita apenas uma mudança nas
declarações Const. (Dê uma olhada no programa e imagine como seria fácil
cometermos um erro se não usássemos Const).
Especial é o fato de podermos utilizá-la como função auxiliar para resolver o problema
de atualização da coluna de Pedido de compra na planilha. O resultado final almejado é
uma macro que transforme a planilha inicial na seguinte planilha
A B C D
PRODUTO Em Estoque Estoque Mínimo Pedido de Compra
1 Vassoura 12 100 88
2 Rodo 120 70
3 Esfregão 5 50 45
...
Sub PedidoCompra()
'Monta o pedido de compra para toda a planilha
Dim compra As Integer
Dim lin As Integer
'Inicialização
lin = 2 'Primeira linha de dados
'Varre toda a planilha
Do While Not IsEmpty(Cells(lin, ColunaProd))
'Descobre qtdd a comprar para o produto corrente
compra = RepoeEstoque(lin)
If compra > 0 Then
'Insere pedido de compra na planilha
Cells(lin, ColunaPed) = compra
End If
'Próxima linha
lin = lin + 1
Loop
End Sub
Suponha agora que nós queremos não apenas saber quantas unidades comprar, mas
também calcular o custo do pedido de compra. Para isso precisamos de duas novas
colunas na planilha, uma delas com o preço unitário do produto e a outra com o custo da
compra para cada produto. No final queremos também computar o custo total do pedido
de compra.
A B C D E F
PRODUTO Em Estoque Estoque Pedido de Preço Custo
Mínimo Compra Unitário Compra
1 Vassoura 12 100 R$2,50
2 Rodo 120 70 R$3,00
3 Esfregão 5 50 R$1,25
O cálculo do item 1, pode, por exemplo, ser feito por uma função auxiliar
CustoCompra.
Em seguida, podemos fazer uma macro que compõe a coluna Custo Compra utilizando
a função CustoCompra:
Sub CustoPedido()
Dim custolin As Double
Dim lin As Integer
Dim total As Double 'custo total do pedido
'Inicia
lin = 2
total = 0
Do While Not IsEmpty(Cells(lin, ColunaProd))
custolin = CustoCompra(lin)
Cells(lin, ColunaCusto) = custolin
total = total + custolin
'proxima linha
lin = lin + 1
Loop
'Escreve custo total sob os custos
Cells(lin, ColunaCusto) = "Custo total: " & total
End Sub
A B C D E F
PRODU Em Estoque Pedido de Preço Custo Compra
TO Estoque Mínimo Compra Unitário
1 Vassoura 12 100 88 R$2,50 220
2 Rodo 120 70 R$3,00
3 Esfregão 5 50 45 R$1,25 56,25
CustoTotal:
276,25
Sub MontaPedido()
PedidoCompra
CustoPedido
End Sub
Exercícios
Considere a seguinte planilha:
2. Fazer uma função auxiliar Resultado que retorna um string de acordo com as médias,
da seguinte maneira:
A importância do nome da planilha é que será através dele que poderemos nos referir
aos dados quando trabalharmos com diversas planilhas.
Quando editamos fórmula em uma planilha, utilizamos referências relativas, como C4,
ou referências absolutas, como $C$4. Ambas as referências dizem respeito à planilha
em que as fórmulas ocorrem. No entanto podemos nos referir a células em outras
planilhas.
Por exemplo, suponha que nós temos duas planilhas, Moedas e Importações. Suponha
que numa fórmula em Importações queiramos nos referir à célula C4 em Moedas. Para
isso, não podemos usar apenas C4 pois este se refere a célula situada na linha 4 e coluna
3 da planilha atual, ou seja, Importações. Em vez disso, usamos
Moedas!C4
Moedas!$C$4
<Var> = Worksheets(``Moedas'').Cells(4,3)
Worksheets(``Importações'').Cells(2,5) = <expr>
Por exemplo, vamos construir planilhas para lidar com importações de produtos.
Uma planilha, chamada Moedas, contém a cotação de diversas moedas.
A B C
1 Moeda País Valor em Reais
2 Dolar EUA 1,19
3 Libra Reino Unido 2,2
4 Marco Alemanha 1,07
5 Yen Japão 0,006993007
6 Lira Itália 0,001278772
7 Dracma Grécia 0,43
Uma segunda planilha contém bens importados dos Estados Unidos, e a ela damos
o nome de ImportUS.
A B C
1 Produto Preço em US$ Preço em R$
2 Computador 2000 =B2 * Moedas!$C$2
3 Torradeira 70 =B3 * Moedas!$C$2
4 Chaleira 30 =B4 * Moedas!$C$2
5 Geladeira 500 =B5 * Moedas!$C$2
A B C D
1 Produto Moeda Preço Original Preço em R$
2 Computador Dolar 2000
3 TV Yen 600
4 Whisky Libra 26
5 Camelo Dinar 400
Const ColMoeda = 1
Const ColCota = 3
Const LinInicial = 2
Const PLAN2 = "ImportMundo"
Const ColProd = 1
Const ColTipo = 2
Const ColPreco = 3
Const ColReal = 4
Function BuscaCotação(moeda As String) As Double
'Encontra a cotação na planilha "Moedas" para
' uma dada moeda. Se a moeda não for encontrada,
' retorna -1.
Dim lin As Integer
Dim cotação As Double
'Inicialização
lin = LinInicial
cotação = -1 'assume que cotação não foi encontrada ainda
'Realiza busca
Do While (Not IsEmpty(Worksheets("Moedas").Cells(lin, ColMoeda)) And
cotação = -1)
'Encontrou a moeda?
If moeda = Worksheets("Moedas").Cells(lin, ColMoeda) Then
cotação = Worksheets("Moedas").Cells(lin, ColCota)
End If
'Próxima linha
lin = lin + 1
Loop
'Retorno
BuscaCotação = cotação
End Function
Sub PreencheMundo()
'Preenche o preço em Reais dos produtos
' na planilha ImportMundo
Dim i As Integer
i = LinInicial
'Varre a planilha
Do While Not IsEmpty(Worksheets(PLAN2).Cells(i, ColProd))
Call preencheLinhaMundo(i)
i=i+1
Loop
End Sub
Sugestão: criar uma função auxiliar que conta o número N de linha e usar esta
informação para inverter. A inversão deve mapear as posições:
Preencha esta planilha da forma que achar mais adequada (fórmulas ou macro).
Lembre-se de arredondar os resultado para números inteiros.
Suponha agora que haja uma segunda planilha de ordem de compra com as
colunas:
Const TAM_VET = 20
Dim vet(TAM_VET) as Integer
vet(1) = 22
i=2
vet(i) = 20
vet(i+1) = vet(i) - vet(i-1)
Acessos ao vetor com valores de índice fora do intervalo padrão 1..TAM_VET são
considerados ilegais e causam erros de execução no programa. Podemos alterar os
valores deste intervalo padrão na declaração, por exemplo:
faz com que os valores legais de índice para o vetor estejam no intervalo
1985..2010. Note que o tamanho do vetor lucroAnual é 26 = 2010 - 1985 + 1 (a
mesma fórmula é usada no cálculo dos vetores no caso padrão: o tamanho de vet é
20 = 20 - 1 + 1; em geral tamanho = PosiçaoFinal - PosiçãoInicial + 1.)
Como conseqüência deste último fato, a alteração de vetores dentro de uma função
ou procedimento se dá por efeito colateral. Com isso queremos dizer que, se um
vetor é passado para uma função e, no interior desta função este vetor é alterado,
esta alteração será percebida na função ou procedimento que chamou a função.
Isto é o que ocorre na função ColVet() abaixo, que lê uma coluna e copia seus
valores um um vetor. Esta função recebe um vetor como parâmetro e, ao retornar,
além de retornar o número de posições lidas, o valor do vetor está alterado,
contendo uma cópia dos valores contidos na coluna.
12,50 12,50
-4,00 5,20
5,20 em 7,00
-9,50
7,00
Para resolver este problema, vamos dividi-lo em uma série de funções e macros
auxiliares, de acordo com a seguinte descrição geral da solução:
Const TamVet = 20
Const LinhaInicial = 2
Const ColunaFoco = 1
Começamos mostrando a macro principal, que invoca todas as outras funções e
procedimentos , além de realizar a compactação do vetor no item 3.
Sub EliminaNeg()
Dim i As Integer
Dim tam1 As Integer 'Tamanho inicial do vetor
Dim tam2 As Integer 'Tamanho do vetor compactado
Dim iniVet(TAM_VET) As Double 'Vetor inicial
Dim CompactVet(TAM_VET) As Double 'Vetor compactado
'Lê coluna sob Foco, no máximo TAM_VET posições
tam1 = ColVet(ColunaFoco, iniVet(), LinhaInicial, TamVet)
tam2 = 0
'Zera posições negativas
Call ApagaNeg(iniVet(), tam1)
i=1
'Principal
Do While i <= tam1
If iniVet(i) > 0 Then
'Copia de iniVet para CompactVet
tam2 = tam2 + 1
CompactVet(tam2) = iniVet(i)
End If
i=i+1
Loop
'Copia CompactVet para a coluna
Call VetCol(ColunaFoco, compactVet(), LinhaInicial, tam2)
'Esvazia demais posições
Call Esvazia(ColunaFoco, tam2 + LinhaInicial, tam1 + LinhaInicial - 1)
End Sub
Em seguida, o item 1 é feito pela função ColVet(), que recebe como parâmetros a
coluna a ser copiada, o vetor a ser alterado, o valor da primeira linha a ser copiada
e o número máximo de posições que o vetor suporta. A função retorna o número
de posições realmente lidas, que pode ser menor que o tamanho máximo.
Function ColVet(col As Integer, vet() As Double, iniLin As Integer, tamMax As
Integer)
Dim i As Integer
Dim lin As Integer
i=1
lin = LinhaInicial
Do While i <= tamMax And Not IsEmpty(Cells(lin, col))
'Lê célula atual
vet(i) = Cells(lin, col)
'Próxima linha
i=i+1
lin = lin + 1
Loop
'Retorno
ColVet = i - 1
End Function
Exercícios
Nota: Algumas versões do Excel podem vir com o padrão de indexação diferente
daquele apresentado nesse cap'itulo. Para garantir que todos os vetores possuem a
primeira posição indexada por 1 (e não por 0), basta adicionar no início do seu
módulo (antes das declarações de Const) a seguinte instrução:
Option Base 1
1. Fazer um programa que inverte uma coluna. Por exemplo, uma coluna que contem
``1, 2, 3, 4'' deverá ser transformada em ``4, 3, 2, 1''. O programa deve:
(a) solicitar ao usuário qual a coluna a ser invertida (ColVet);
(b) copiar a coluna para um vetor; o tamanho da coluna já é sabido pois foi
retornado por ColVet;
(c) inverter o vetor (ver enunciado do Exercício 1 da Lista 10). Você deve usar
um segundo vetor para isso;
(d) copiar o vetor invertido por sobre a coluna inicial (VetCol).
Não é necessário usar funções ou procedimentos auxiliares além de ColVet e
VetCol.
2. Fazer uma macro que lê uma coluna em um vetor e mostra, numa janela, a linha e o
valor da menor célula na coluna. A coluna em questão deve ser solicitada ao usuário,
bem como a posição da primeira linha a ser considerada.
Você deve usar uma função auxiliar que recebe um vetor e retorna o índice da
posição que contém o menor valor. Não se esqueça que este valor do índice não
é o mesmo que o valor da linha que contém o menor valor, pois a linha inicial na
coluna considerada não é necessariamente a primeira.
Ordenação
O objetivo deste capítulo é descrever um método de ordenação de dados.
Estaremos ordenando um conjunto de dados em um vetor (que pode ter sido, por
exemplo, copiado de uma coluna da planilha). Existem vários métodos de
ordenação, e nós vamos nos concentrar no método de Ordenação por Bolhas.
Uma bolha nada mais é que um par de números ordenados, por exemplo, ( 2, 7 ) ou
( 7, 4 ). A primeira destas bolhas está ordenada crescentemente, enquanto a
segunda não. Toda vez que encontrarmos uma bolha desordenada, vamos invertê-
la, transformando ( 7, 4 ) em ( 4, 7 ).
As bolhas são assim chamadas pois ``sobem pela seqüência'' da mesma forma
como bolhas de gas na água. Vamos explicar o método através de um exemplo.
Suponhamos que nós queremos ordenar a seqüência 4,2,12,7,4,1 de 6 elementos.
Um passo de ordenação pelo método de bolhas irá produzir as seguintes alterações
nos dados:
(4 2) 12 7 4 1
2 (4 12) 7 4 1
2 4 (12 7) 4 1
2 4 7 (12 4) 1
2 4 7 4 (12 1)
2 4 7 4 1 12
O passo de ordenação faz uma bolha deslocar-se pelo vetor da esquerda para a
direita, ordenando a bolha se esta estiver desordenada e, em seguinda, movendo a
bolha para a direita. As bolhas acima aparecem entre parênteses e, quando estão
desordenadas, também estão em negrito.
Note que o maior número da seqüência, 12, foi parar na posição mais à direita.
Portanto, se realizarmos o passo de ordenação uma segunda vez, o segundo maior
número, 7, irá parar na segunda posição à direita.
(2 4) 7 4 1 12
2 (4 7) 4 1 12
2 4 (7 4) 1 12
2 4 4 (7 1) 12
2 4 4 1 (7 12)
2 4 4 1 7 12
Para que o programa possa rodar, precisaremos copiar ColVet e VetCol no mesmo
módulo que a macro principal, chamada de OrdenaCol. A coluna a ordenar é
solicitada ao usuário.
Const TamVet = 20
Const LinhaInicial = 2
Sub OrdenaCol()
Dim colAOrdenar As Integer 'Coluna a ordenar
Dim vetorColuna(TamVet) As Double 'vetor que abriga a coluna
Dim tamCol As Integer 'numero de elementos a serem ordenados
colAOrdenar = CInt(InputBox("Qual a coluna a ser ordenada?"))
'Lê a coluna
tamCol = ColVet(colAOrdenar, vetorColuna(), LinhaInicial, TamVet)
'Ordena a coluna
Call OrdenaPorBolhas(tamCol, vetorColuna())
'Escreve a coluna ordenada
Call VetCol(colAOrdenar, vetorColuna(), LinhaInicial, tamCol)
End Sub
Para finalizar, basta detalhar o passo de ordenação, que também recebe como
parâmetros o tamanho do vetor e o vetor. Esta rotina também funciona por efeito
colateral, devolvendo o vetor alterado por um passo de ordenação por bolhas.
Exercícios
1. Alterar o programa de ordenação acima para gerar a coluna em ordem decrescente.
Note que para isso basta alterar uma linha do passo de ordenação.
2 4 7 4 1 12
onde 12 foi parar na posição final e definitiva. O segundo passo produziu
2 4 4 1 7 12
onde 7 foi parar na posição definitiva (e 12 permaneceu na mesma posição).
Altere o programa para, a cada passo, propagar a bolha até uma posição a menos
que na vez anterior.
3. Muitas vezes o vetor já está ordenado antes da execução dos Npassos de ordenação.
Por exemplo, se o vetor já está ordenado de início, não há motivos para continuar
aplicando os passos de ordenação.
Altere seu programa para que este pare de aplicar o passo de ordenação assim
que a aplicação do passo de aplicação não realizar nenhuma inversão de ordem.
O programa pode parar pois, garantidamente neste caso, o vetor já está
ordenado.
Manipulação de Strings
Já sabemos como construir uma cadeia de caracteres (String) a partir de outras
usando concatenação, representada pelo operador &:
B a n a n a M a d u r a
1 2 3 4 5 6 7 8 9 10 11 12
Alguns exemplos:
str = ``BananaMadura''
Vamos ilustrar o uso das funçoes Mid$, Len e IsNumeric construindo uma função
que, dado um String, filtra todos os caracteres que não são numéricos. Por
exemplo, dado o CPF ``123.456.789-01'', retorna o string ``12345678901'',
eliminando toda a pontuação.
Function FiltraAlgarismo(strIn As String) As String
Esse exemplo transforma, por efeito colateral, um string num vetor de caracteres
(com a ressalva que o vetor de caracteres tem que ter tamanho pelo menos igual ao
do string).
Outro exemplo é a normalização de datas. Neste caso, uma data (dada por um
string) do tipo ``3/2/98'' é transformada em ``19980203'', ou seja, uma data do tipo
``Dia/Mes/Ano'' é transformada em Ano1Mes1Dia1, onde Ano1 está com 4
algarismos, Mes1 e Dia1 com dois.
Por fim, temos uma função que verifica se uma data é valida (com alguns errinhos:
quais?) que usa FormataData.
Exercícios
1. Fazer uma função que recebe um string como parâmetro e retorna um string obtido ao
se eliminar os espaços em branco no início e fim do string:
" Bom dia, senhor " deve ser transformado em "Bom dia,
senhor"
"Bom dia, senhor " deve ser transformado em "Bom dia,
senhor"
" Bom dia, senhor" deve ser transformado em "Bom dia,
senhor"
3. Fazer uma função que inverte um string. ``Parabens a voce'' vira ``ecov a snebaraP''.