• 👏 Bienvenido a nuestra comunidad Excel

    ¿Todavía no estás registrado? 😲

    Registrate gratis aquí y podrás:

    💪 Hacer preguntas a los expertos
    ⬇️ Descargar ejemplos y plantillas
    🏅 
    Acceder a contenidos premium

NºSaltosEntreElementosArrayNoNumericos

Hola, buenas:

Me gustaría crear en VBA una "escalera" de rating (calificaciones) que reza así:

1+
1
1-
2+
2
2-
3+
3
3-
4+
4
4- (y así sucesivamente hasta el 12)

Es decir, que 1+ es mejor nota que 1, mientras que 1 es mejor calificación que 1-, etc...

Y claro, me gustaría que VBA calculara el número de saltos o escalones que se da de una nota a otra. Por ejemplo, de 2+ a 3+ hay 3 escalones pues pasamos de 2+ a 2, de 2 a 2-, y finalmente de 2- a 3+.

Puesto que esta escalera no puede funcionar como número, haciendo aritmética entre los distintos escalones (no se puede hacer resta entre 3+ y 2+) como normalmente se haría, he pensado en generar un array tipo vector de una sola dimensión:

dim V(1 to 12)
V(1) = "1+": V(2) = "1": V(3) = "1-", etc

Y así para calcular el número de saltos entre ellos, usar el número de índice del Vector/Array en vez de la calificación. ¿Sabe alguien si existe un comando que pueda usar para referirme al número de índice del elemento del Array en vez del valor del elemento (vamos, la calificación)?

¿O quizá a alguien se le ocurra alguna manera de hacer esto más sencilla?


Muchas gracias en cualquier caso.

Saludos!
 
Muchas gracias, hc3115. La función de usuario funciona fenómenal, salvo un pequeño detalle. Si en los inputs de la función no pones algo que entré 1 y 12, toma el valor del input como 0 (tanto si pones un número como el 14 como si pones una letra como input). Por tanto, yo lo he solucionado de la siguiente manera. A ver qué te parece:

Código:
Function DIF·ESCALA(d2, c2) As Variant
'Stop
Dim a, i%, m(), n%, n_i%, n_f%

    a = Array("+", "", "-")
    For i = 1 To 12
        n = n + 1
        ReDim Preserve m(n)
        m(n) = i & a(1)
        GoSub VNI
        GoSub vnf
        n = n + 1
        ReDim Preserve m(n)
        m(n) = i & a(2)
        GoSub VNI
        GoSub vnf
        n = n + 1
        ReDim Preserve m(n)
        m(n) = i & a(3)
        GoSub VNI
        GoSub vnf
    Next

        If n_f = 0 Or n_i = 0 Then
            DIF·ESCALA = "Error in input"
        Else
            DIF·ESCALA = n_f - n_i
        End If

Exit Function

VNI:
    If m(n) = c2 Then
        n_i = n
    End If
    Return
vnf:
    If m(n) = d2 Then
        n_f = n
    End If
    Return
    

End Function


Saludos
 
Arriba