Excel: el mismo texto del cuadro de mensaje dependiendo de cualquiera de las múltiples entradas posibles de InputBox

CorePress2024-01-25  9

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

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare