VBA InputBox

Dezembro 2016


Introdução

Existem várias caixas que permitem interagir com o usuário e As MsgBox, InputBox, UserForm são alguns exemplos. Para responder a uma questão relevante para o código, resposta esta que não será nem sim nem não, ou outra, o InputBox é a caixa adequada. Na verdade, como destaca a definição do site MSDN (Microsoft): Mostra uma mensagem em uma caixa de diálogo, espera que o usuário digite um texto ou clique em um botão e retorne o conteúdo da caixa de texto na forma de uma string.

Para começar, vamos descrever as diversas configurações para a função InputBox. Em seguida, vamos ver alguns exemplos de uso e, para terminar, veremos "sua irmã gêmea" do Excel, o método InputBox (método e mais funções): Aplicação.InputBox.

Os parâmetros do InputBox

Em primeiro lugar, vejamos a sintaxe desta função Visual Basic:
InputBox (prompt de [, título] [, padrão] [, xpos] [, ypos] [, helpfile] [,contexto]) 

As configurações entre colchetes ([]) são opcionais. Apenas uma configuração é obrigatória: o Prompt.

Prompt (Mensagem)

Esta é a mensagem que você envia para o usuário fazer o seu pedido. Esta configuração é obrigatória (mandatory) e deve ser como uma String (cadeia de caracteres).


Observação: Em geral, convém fazer uma pergunta (ou enviar uma mensagem para o usuário) solicitando que ele digite uma resposta que não seja "sim" ou "não". Caso contrário, será preciso usar uma MsgBox.

Exemplo:
Dim Nom As String

Nome= InputBox ("Digite seu nome;") 

Title (Título)

Esta é a primeira configuração opcional. Como o próprio nome indica, é preciso adicionar um título ao diálogo. Este título será na forma de uma cadeia de caracteres (string) e será inserido na barra de título da caixa de diálogo.


Exemplo:
Dim Nome As String 
Nome = InputBox ("Digite o seu NOME:", "NOME") 

Observação: esta configuração é opcional, se ela for omitida, o padrão aparecerá com o nome do aplicativo utilizado na barra de título.

Default (Valor padrão)

A caixa de diálogo InputBox é composta de 4 partes: a janela, a barra de título, a caixa de texto e os botões. Aqui, Default vai exibir, em sua inicialização, um valor padrão na TextBox (caixa de texto).

Exemplo:
Dim Nome As String 
Nome = InputBox ("Digite o seu NOME;", "NOME", "OLIVEIRA") 

xPos & ypos

Essas duas configurações também são opcionais e permitem colocar o nosso InputBox onde desejarmos. Trata-se do posicionamento horizontal (xpos) e vertical (ypos), mais especificamente, a distância, em pixels, que separa a borda esquerda (ou superior) do InputBox, da margem esquerda (ou superior) da tela. Da tela, e não do aplicativo.


Exemplo:
Dim Nome As String  
Nome = InputBox ("Digite o seu NOME", "NOME", "OLIVEIRA", 100, 100) 

Helpfile e Context

Essas duas configurações opcionais são inseparáveis. Se você fizer referência a uma, deverá fazer referência a outra, caso contrário você obterá um erro de execução 5: argumento ou chamada de procedimento incorreto.

Helpfile: ou arquivo de ajuda, é utilizado para identificar o arquivo de ajuda. Trata-se do seu nome (ex: "DEMO.HLP") ou do seu caminho de acesso (ex: "c:\Help.cam").
Context: ou ajuda contextual, é o número de ajuda contextual, atribuída pelo autor, para ajudar no tópico correspondente.

No Microsoft Office Excel 2007, por exemplo, se estas duas configurações forem corretamente referenciadas, um botão adicional Help será adicionado ao diálogo. Este botão corresponde à tecla F1 do seu aplicativo.

Exemplo:
<codw basic>Dim Nome As String
Nome = InputBox ("Digite o seu NOME", "NOME" , , , , "c:\Help.cam", 0) </code>
ou:
Dim Nome As String 
Nome = InputBox ("Digite o seu NOME", "NOME", "OLIVEIRA", 200, 200, "DEMO.HLP", 10) 

Configurações em variáveis

Assim como todas as funções VB, as configurações podem ser armazenadas em variáveis. Mas, muito cuidado para definir o tipo certo. Veja um exemplo que passa por todas as configurações variáveis intermediárias:


 Dim Número As Integer 
Mensagem Dim As String, Titulo As String, Por padrão As String, PosX As Integer, PosY As Integer, Ajuda AS String, NumAJUDA As Long 
Mensagem = "Entre um número inteiro" 
Titulo = "digitação numérica" 
Por padrão= "13" 
PosX = 250 
PosY = 360 
Help = "c:\Help.cam" 
NumAjuda = 3152 
Número= InputBox (Mensagem, Título, PorPadrão, PosX, PosY, NumAjuda) 


Observação: Aqui, nós digitamos, por padrão, um valor do tipo String: PorPadrão= "13". Ora, nossa variável encarregada de armazenar o resultado do InputBox é Integer. Assim, esperaríamos um retorno de erro Tipo errado. Mas não, neste caso, VB sabe reconhecer que o valor digitado é numérico. Para confirmar isso, basta adicionar no final do código anterior:
 MSGBox Número * 2 
.

InputBox - os botões

Existem três botões diferentes possíveis no InputBox:

O botão OK

Quando o usuário pressiona este botão (ou pressiona a tecla "Enter"), a função InputBox retorna tudo o que a caixa de texto contém. Se nada foi digitado, ela retorna a cadeia: "".

O botão CANCELAR

Quando o usuário pressiona esta tecla, a função InputBox retorna a sequência de comprimento zero: "".

O botão AJUDA

Este botão abre a ajuda do aplicativo ou a ajuda correspondente ao arquivo e contexto de ajuda, definidos nas configurações.

Erros comuns

Saiba que com este recurso, você deverá lidar com tudo que é tipo de erro que o usuário possa fazer. Do erro de entrada ao erro de incompreensão, passando pelo erro voluntário. Na certa, você vai precisar de um gerenciador de erros, adaptado e integrado ao seu código.

Erro de tipo de digitação

Erro de execução "13" Incompatibilidade de tipo: esta mensagem de erro aparece quando você pede ao usuário um determinado tipo de dado (que você declara em suas variáveis) e digita outro. Por exemplo, você pede a introdução de um número inteiro e ele entra um número decimal.

Exemplo:
 Dim Número As Integer 'Aqui nós sabemos que é pedido um Integer 
Número = InputBox ("Digite um número inteiro:", "Digitação numérica") 

Se o usuário digitar 13,5 e pressionar o botão OK, uma mensagem de erro aparecerá. Mesma coisa, mesma sanção, se o usuário digitar uma letra, ou não digitar nada e pressionar o botão Cancelar.

Como remediar esta situação?
Simplesmente com a ajuda de um processamento de erro.

Exemplo:
 Dim Número As Integer 
"Em caso de erro, acesse a etiqueta <bold>Tipo errado</bold>
On Error GoTo Tipo errado
Número = InputBox ("Digite um número inteiro:", "Digitação numérica") 

`Veja o exemplo do tratamento desejado  

Selecione a casa Número 
    Case Is > = 18: MsgBox "Menção Muito Bem" 
    Case Is  > = 16: MsgBox "Menção Bem" 
    Case Is  > = 14: MsgBox "Menção Passável" 
    Case Is  > = 10: MsgBox "Nenhuma menção" 
    Case Is  > = 8: MsgBox "Menção nada boa" 
    Case Is  > = 6 MsgBox "Menção ruim" 
    Case Else: MsgBox "Menção muito ruim" 
End Select 
Exit Sub 'Não esquecer a Saída para não tratar Tipo Errado 

Tipo Errado: 
MsgBox "Você não digitou um número inteiro", vbCritical

Número de caracteres

Visível pelo seu tamanho, o InputBox não é feito para inserir dados longos. Na verdade, a entrada é limitada a 255 caracteres. Além disso, a função InputBox só envia 254. Portanto, cuidado para não pedir dados muito "longos" através dela.

Variável obrigatória

A função InputBox precisa de uma variável para ser armazenada nela. Ao contrário da MsgBox que não precisa disso, sem variável você obterá certamente a mensagem de erro: Erro de compilação Esperado: =

Exemplo do que não devemos fazer:
 InputBox ("Digite um número inteiro: ", "Digitação numérica")

Botão CANCELAR

Como vimos anteriormente, não é possível cancelar se o código pedir um número. Na verdade, a função retorna uma string ("" é uma cadeia de caracteres...) quando clicarmos neste botão; teremos o erro 13, ou seja, incompatibilidade de tipo. Para uma variável declarada As String, isso é diferente. Se o usuário cancelar, a variável conterá um dado: "". Ora, este dado pode ser primordial para o sucesso do resto do seu código.

Como evitar isso?
Fazendo looping, enquanto o comprimento da cadeia enviada pela função for igual a zero. Assim:

Exemplo:
Dim Nome As String  
Nome = InputBox ("Digite seu NOME: ", "Entre NOME") 
Do While Len (Name) = 0 
    MsgBox "Este dado é obrigatório" 
     Nome = InputBox ("Digite seu NOME:", "Entre NOME") 
Loop
MsgBox "Seu NOME é: " & Nome 


Pois é, mas isso cria um problema adicional. Se o usuário, após um momento de pouca sorte, só vir o botão Cancelar, minha macro vai ficar dando voltas para sempre? Para remediar isso, vamos inserir um registro e uma porta de saída.

Exemplo:
Dim Nome As String Dim, Cpt As Integer 
Cpt  = 1 
Nome = InputBox ("Digite seu NOME:", "Entre NOME") 
Do While Len (Nome) = 0 
     Cpt  =  Cpt + 1
     If Cpt = 4 Then GoTo Muitoburroparacontinuar 
     MsgBox "Este dado é obrigatório. Mais que " & 4 -. Cpt & " tentativas."
     Nome = InputBox ("Digite seu NOME:", "Entre NOME") 
Loop
MsgBox "Seu NOME é:"  & Nome 
Exit Sub 
Muitoburroparacontinuar: 
MsgBox "Por favor, pare com a informática ."

Caso especial - O método "Application.InputBox"

As configurações são idênticas aos da função, com a adição de um ultimo ajuste, o tipo. A sintaxe deste método é: InputBox (prompt de [, título] [, padrão] [, xpos] [, ypos] [, ArquivoDeAjuda] [, contexto], Tipo). Vamos ver como completar esta nova configuração.

Os diferentes tipos

Valor Significado
0Fórmula
1Número
2Texto (String)
4Valor lógico (True or False)
8Referência de célula, na forma de um objeto Range
16Valor de erro como #n/a
64Matriz de valores

Exemplos

Entrada digital:
Retomemos aqui o nosso código que travava, transposto como InputBox de tipo: = 1

 Dim Número As Integer 
Número = Application.InputBox ("Digite um número inteiro:" "Digitação numérica", Tipo: = 1) 


Se você digitar letras em vez de um número, uma mensagem de erro lhe será enviada, depois, você deverá voltar ao InputBox ...
Mensagem de erro:
Número inválido


Referência de célula:
Esta opção permite selecionar células com o mouse.

Exemplo 1:
 Dim Campo Como Range
       Set Campo = Application.InputBox ("Selecione um campo", "Seleção de células", Type: = 8) 
       MsgBox ("O campo que você selecionou é:" & Campo.Address) 


Exemplo 2:
Mesma coisa com a restituição em uma variável de matriz:
 Minha Matriz  () As String 
Dim Campo As range 
Dim i As Integer 

Set Campo  = Application.InputBox ("Selecione campo", "Seleção de células", Tipo: = 8) 
Minha Matriz = Split (Campo.Address, ",") 
For i = 0 To Ubound (MinhaMatriz)  
    MsgBox  MinhaMatriz(i) 
Next i 


Exemplo 3:
Fonte: este exemplo usa um método InputBox para permitir que o usuário selecione um campo a ser transferido para a função MinhaFunção definida pelo usuário, que multiplica três valores de um campo e retorna o resultado.</block>

 Cbm_Value_Select () 
    RNG Dim  AS Range 
   
    Set RNG = Application.InputBox ("Range", Tipo: = 8) 
   If rng.Cells.Count <> 3 Então 
      MsgBox "comprimento, largura e altura são necessários -" & _ 
          vbLf e "favor selecionar três células!" 
       Exit Sub 
    End If 
   
    Chamada 1 MinhaFunção 
    ActiveCell.Value = MinhaFunção (RNG) 
End Sub 


Função MinhaFunção (rng As Range) As Double 
    MyFunction = rng (1) rng * (2) * rng (3) 
End Function 

Conclusão

Lembre-se de adaptar os processamentos de erros possíveis vistos na função InputBox ao método. O usuário é capaz de tudo, até mesmo do pior!

Veja também :
Este documento, intitulado « VBA InputBox  »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.