Quiero crear un cuadro de mensajes que muestre texto dependiendo de entradas específicas en un cuadro de entrada.
Vea el código de ejemplo a continuación donde se ingresa el valor en el cuadro de entrada, "Fantástico" o "Basura", recibe mensajes diferentes.
Dim UserAge as String
UserAge = Application.InputBox("Hi, how was your day?", Type:=3)
If InStr(1, UserAge.Text, "Fantastic") > 0 Then #runtime error '424'
MsgBox "I am glad you are having a good day!"
ElseIf InStr(1, UserAge.Text, "Rubbish") > 0 Then
MsgBox "I am sorry you are having a bad day!"
End If
End Sub
Para expandir, también me gustaría modificar el código para que aparezca el mismo cuadro de mensaje para múltiples opciones ingresadas, por ejemplo a continuación.
UserAge = Application.InputBox("Hi, how was your day?", Type:=3)
If InStr(1, UserAge.Text, "Fantastic", "Excellent", "Great") > 0 Then
MsgBox "I am glad you are having a good day!"
ElseIf InStr(1, UserAge.Text, "Rubbish","Awful") > 0 Then
MsgBox "I am sorry you are having a bad day!"
End If
------------------------------------
Distinguir diferentes grupos, así como la entrada de números y caracteres
Como OP distingue entre
diferentes grupos de entradas de atributos y
pasa explícitamente un argumento Tipo:=3 (aceptando st textual y numéricoanillos) a la función Application.InputBox(),
Esto me estimuló a demostrar cómo manejar estas especificaciones individuales en el siguiente ejemplo de código.
Ejemplo de llamada
A diferencia del InputBox de VBA, la función Application.InputBox() permite especificar un tipo de datos de retorno. Entonces, un argumento Type:=3 (es decir, 3 como suma de 1 número + 2 textos) en Application.InputBox() acepta entradas de cadenas tanto textuales como numéricas.
Consulte Aplicación de ayuda de MS.InputBox.
Sub ExampleCall()
'Purp: get (case insensitive) UserInput via Application.InputBox and check response
Dim UserAge As String
UserAge = Application.InputBox("Hi, how was your day?", Type:=3)
CheckResponse UserAge ' << call procedure CheckResponse
End Sub
Procedimiento VerificarRespuesta
Consta de los siguientes pasos
[0] Defina todos los atributos permitidos enumerados en una matriz de palabras clave de límite cero.
keywords = Split("super,fantastic,great,rubbish,awful", ",")
[1] Defina allí el último número de elemento de cada grupo (número de fin de grupo):
Group = Array(0, 3, 5)
dónde
[Grupo(0): ----------------- (= 0 )]
Grupo(1): súper.. genial (=3er elemento)
Grupo(2): basura...horrible(=quinto elemento)
[2] obtiene el número de posición dentro de las palabras clave, para ser precisos mediante Val() en el caso de entradas numéricas o mediante Application.Match() en el caso de entradas textuales. - Observe cómo comprobar la validez de los resultados de la posición en ambos casos.
[3] encuentre el número de grupo resultante según la posición del número en las palabras clave
[4] muestra el cuadro de mensaje individual.
Sub CheckResponse(ByVal entry)
'[0]Define valid attribute inputs
Dim keywords: keywords = Split("super,fantastic,great,rubbish,awful", ",")
'[1]Define positions of last element number within user defined groups 0/1/2:
Dim Group(): Group = Array(0, 3, 5)
Stop
'[2]get attribute position within keywords (1-based)
Dim num As Variant
If Val(entry) Then ' a) numeric input
num = Val(entry)
If num > Group(UBound(Group)) Then num = 0
Else ' b) characters = textual input
num = Application.Match(entry, keywords, 0)
If Not IsNumeric(num) Then num = 0
End If
'[3]get group number
Dim GroupNum As Long
Select Case num
Case Group(0)
MsgBox "Input " & entry & " not found!", vbCritical, "Invalid Attribute"
Case Is <= Group(1)
GroupNum = 1
Case Is <= Group(2)
GroupNum = 2
End Select
'[4]display message
If GroupNum Then
MsgBox "**My day was " & _
keywords(num - 1) & ".**" & String(2, vbNewLine) & _
"(Identified as " & _
num - Group(GroupNum - 1) & ". item in " & _
GroupNum & ". group)", vbInformation, "My Response"
End If
End Sub
Diviértete :-)
------------------------------------
Instr se puede comparar con un solo texto, debe cambiar su declaración o de la siguiente manera:
If InStr(1, UserAge, "Fantastic") > 0 Or InStr(1, UserAge, "Fantastic") > 0 Or InStr(1, UserAge, "Fantastic") > 0 Then
Sin embargo, si mirasSi busca la frase exacta que ingresó arriba, puede usar Seleccionar caso:
Select Case UserAge
Case "Fantastic", "Fantastic", "Great"
' do something 1
Case "Rubbish", "Awful"
' do something 2
End Select
1
Útil en cualquier caso @ShaiRado +:) - para su información En mi respuesta demostré un enfoque ligeramente modificado sobre cómo distinguir entre diferentes grupos de atributos, así como diferentes tipos de datos de entrada (`Tipo:=3 debido a que OP permite texto + número entradas).
- T.M.
29/03/2021 a las 20:22
------------------------------------
Si hazaña de práctica de declaración. Aplicación.InputBox
Option Explicit
Sub exSimple()
Dim UserAge As Variant
UserAge = Application.InputBox("Hi, how was your day?", Type:=2)
If UserAge = False Then
MsgBox "You canceled."
ElseIf InStr(1, UserAge, "Fantastic", vbTextCompare) > 0 Then
MsgBox "I am glad you are having a good day!"
ElseIf InStr(1, UserAge, "Rubbish", vbTextCompare) > 0 Then
MsgBox "I am sorry you are having a bad day!"
'Else
' Non of the above.
End If
End Sub
Sub exAdvanced()
Dim UserAge As Variant
UserAge = Application.InputBox("Hi, how was your day?", Type:=2)
If UserAge = False Then
MsgBox "You canceled."
ElseIf InStr(1, UserAge, "Rubbish", vbTextCompare) > 0 Then
MsgBox "I am sorry you are having a bad day!"
Else
Dim arr As Variant: arr = Array("Fantastic", "Excellent", "Great")
Dim n As Long
For n = LBound(arr) To UBound(arr)
If InStr(1, UserAge, arr(n), vbTextCompare) > 0 Then
Exit For
End If
Next n
If n <= UBound(arr) Then
MsgBox "I am glad you are having a good day!"
'Else
'none of the above
End If
End If
End Sub