next up previous contents
Next: Simulação de Programas Up: Técnicas de Programação Utilizando Previous: Comando de Iteração (DO

Subrotinas, Macros, Entrada e Saída de dados

Até agora vimos apenas programas no formato função. Funções possuem as seguintes propriedades:

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.

A isso se dá o nome de subrotina ou procedimento. Uma subrotina possui o seguinte formato

Sub NomeSub( <Lista de Parâmetros> )
$\ldots$
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.

A ativação de macros é feita acionando-se o menu Ferramentas|Macros, que fará aparecer uma janela contendo uma lista de todas as macros existentes nos módulos do programa. Como não há passagem de parâmetros para macros, basta selecionar uma macro nesta lista, e acionar o botão Executar.

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:

Texto = InputBox( ``Entre com um valor'' )

Ao executarmos este comando, primeiramente aparecerá uma janela contendo:

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.

Se desejarmos ler um valor numérico ao invés de String, o valor inserido será convertido para o tipo apropriado. Para isso, utilizamos as duas funções pré-definidas CDbl(String) e CInt(String) que convertem o parâmetro String respectivamente em um valor equivalente do tipo Double ou Int.

Em geral, fazemos a chamada a InputBox e a conversão por CDbl ou CInt num mesmo comando, como mostra o exemplo abaixo:

Dim Nprods As Integer
Dim Preco1 As Double

Nprods = CInt( InputBox( ``Entre a quantidade de produtos:'' ))
Preco1 = CDbl( InputBox( ``Preço do primeiro produto'' ))

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.

O comando que faz isso é o comando MsgBox(String), que mostra o conteúdo do String ao usuário em uma janela. Por exemplo, supondo que a variável MIN é do tipo Double e contém o valor 27,32,

MsgBox( ``O melhor preço é: '' & MIN )

faz aparecer uma janela com a mensagem:

O melhor preco é: 27,32

Se quisermos que a mensagem exibida seja quebrada em diversas linhas, devemos incluir nos pontos desejados o caracter que codifica o comando ``mude de linha''. Por exemplo,

MsgBox( ``Isto aqui é uma'' & Chr(13) & ``linha quebrada.'' )

produz como resultado:

Isto aqui é uma
linha quebrada.

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

Para finalizar, mostramos um programa que solicita 4 preços do usuário e retorna o menor:

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''.

4.
Fazer uma macro que, lê o número N de alunos matriculados em Introdução à Contabilidade Forênsica e suas notas na primeira prova, e calcula:


next up previous contents
Next: Simulação de Programas Up: Técnicas de Programação Utilizando Previous: Comando de Iteração (DO
Flavio Soares Correa da Silva
2000-04-10