Em várias situações do dia a dia, precisamos coletar informações dos usuários para o correto funcionamento de nossas planilhas.
Isso normalmente é feito através de células evidenciadas através de formatação e outros recursos visuais. É possível até forçar a validação do valores de entrada, mas mesmo assim, não temos a garantia de que as informações foram coletadas. Para estas situações, o VBA disponibiliza uma função simples e muito eficaz, a função InputBox.
Com uma chamada simples, uma caixa de diálogo é mostrada ao usuário, disponibilizando também um caixa de texto para que este digite um valor de entrada.
Para simular o uso da função InputBox, imagine que você possui uma lista produtos cujos valores se baseiam na cotação do dólar do dia. O valor da cotação do dólar precisa ser informado, ou os cálculos não irão refletir os valores corretos dos produtos, podendo causar muitos problemas.
A idéia é tentar forçar com que o usuário insira o valor da cotação do dólar antes de efetuar qualquer operação na planilha. Porque não fazê-lo no momente em que este abre a pasta de trabalho? Para possibilitar isso, abra um novo arquivo do Microsoft Excel. Acione o VBA clicando em Ferramentas->Macros->Editor do Visual Basic ou clicando o atalho Alt+F11. A janela do VBA será mostrada conforme abaixo:
O que faremos é capturar o evento que é disparado quando uma pasta de trabalho é aberta. Para isso, dentro do VBA, na janela de Projeto, procure o item EstaPata_de_trabalho e clique duas vezes sobre ele para abrir a tela de código:
Com a tela de código aberta, logo acima da tela de código, existem duas caixas de seleção. Clique na caixa da esquerda e selecione o item Workbook:
Ao fazer isso, o código do evento que é disparado ao abrir a pasta de trabalho de nome Workbook_Open é criado conforme a seguir:
1 2 3 | Private Sub Workbook_Open() End Sub |
É dentro deste código que trabalharemos com o InputBox. Como tudo o que estiver neleé executado quando o arquivo é aberto, vamos solicitar que o usuário que digite o valor da cotação do dólar no InputBox e colocar este valor em uma determinada célula. Supondo que a célula que contém o valor da cotação seja a célula A1 da Plan1, o código seria o seguinte
1 2 3 4 5 6 7 | Private Sub Workbook_Open() Dim cotacao As String cotacao = InputBox("Digite a cotação do dólar do dia: ", "Cotação", "2,00") ThisWorkbook.Worksheets("Plan1").Range("A1").Value = cotacao End Sub |
O código declara uma variável na linha 2 que armazenará o valor da cotação informado pelo usuário. Ela precisa ser uma String pois é o tipo de retorno do InputBox. Em seguida, o valor da cotação é solicitado através do InputBox na linha 4 e armazenada na variável cotação. O resultado é colocado na célula A1 da planilha Plan1 na linha 6.
Execute o procedimento clicando em F5 ou fechando a planilha e abrindo-a novamente (lembre-se de ativar as macros). Veja o resultado:
Clique em OK e veja o valor inserido na célula A1 da planilha Plan1:
Com isso, temos o valor informado pelo usuário colocado em uma célula desejada. Tudo isso ocorre normalmente, se tudo for feito de forma correta pelo usuário
Porém, no código acima, temos dois problemas. O primeiro é, caso o usuário não informe um valor clicando no botão cancelar, o aplicativo retornará um erro. O segundo é, se a célula não estiver implicitamente configurada para valores numéricos, ela considerará o conteúdo no formato texto, que é o tipo padrão da variável cotacao. Tentaremos resolver os dois problemas de uma vez. Veja o código abaixo:
1 2 3 4 5 6 7 8 9 | Private Sub Workbook_Open() Dim cotacao As String While cotacao = "" cotacao = InputBox("Digite a cotação do dólar do dia: ", "Cotação", "2,00") Wend ThisWorkbook.Worksheets("Plan1").Range("A1").Value = CDbl(cotacao) End Sub |
As mudanças feitas no código tratam o problema da seguinte maneira:
Na linha 4 a 6, a chamada do InputBox foi colocada dentro de um loop While com a condição de, caso a variável cotacao esta com o valor “”, ou seja, vazia, o que significa que o usuário clicou no botão cancelar, ele voltará a chamar o InputBox e isso acontecerá até que ele insira um valor e clique em OK. Na linha 8, ao invés de atribuir diretamente a variável cotacao à célula, usa-se a função CDbl() que força a conversão da variável passada por parâmetro para o tipo numérico Double.
Isso faz com que o valor seja passado com o formato numérico diretamente para a célula.
Execute o procedimento clicando em F5 ou fechando a planilha e abrindo-a novamente (lembre-se de ativar as macros). Ao aparecer a caixa de diálogo, tente clicar no botão Cancelar e veja o que acontece.
Conclusão
É possível melhorar mais ainda a inclusão de valores, fazendo verificações com funções de validação de tipo como foi o caso da CDbl(), usada neste artigo. Assim, o InputBox torna-se uma alternativa muito elegante para coletar dados do usuário.
Parabens pelo artigo, muito bem montado e de fácil entendimento…
Preciso efetuar uma busca numa planilha e quero solicitar que me retorne um valor lançado numa inputbox. Por exemplo para uma planilha contendo nome do usuário e curso, lanço o nome do curso e o sistema me retorna os alunos que estão inscritos neste curso, etc…
Sergio,
Visite nosso fórum:
http://www.tomasvasquez.com.br/forum
Já há uma série de tópicos que tratam do assunto com planilhas de exemplo. Nos vamos lá!
Abraços
Tomás
Preciso fazer esta entrada de dados, mas ao invés de ser no excel tem que ser no word, sou leiga em VBA, tem como me orientar?
Juliane,
Visite nosso fórum:
http://www.tomasvasquez.com.br/forum
Podemos discutir este problema e muitos outros a partir de lá mais facilmente. Nos vemos lá!
Abraços
Tomás