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.