Secuencia alfanumérica en VB Excel 2003

Buen día, necesito calcular los siguientes 1,000 valores de una secuencia alfanumérica en la columna A a partir de un valor capturado en la celda C1.
La secuencia alfanumérica es parecida al Hezadecimal, sólo que incluye todas las letras del alfabeto, y los valores subsecuentes calculados deben mostrarse a 5 dígitos.
Por ejemplo:
00000
00001
00002
...
00009
0000A
0000B
...
0000Y
0000Z
00010
00011
...
De tal manera que si C1= 34F9W
La secuencia debe mostrarse en la columna A de la siguiente manera:
34F9W
34F9X
34F9Y
34F9Z
34FA0
...
De antemano muchísimas gracias.
Respuesta
1
Una posible solución es considerar los caracteres 0->9 y A->Z (en total, 36) como constitutivos de la base 36.
Dado que Excel trabaja en base 10, lo primero que hay que hacer entonces es convertir el código "base 36" a base 10, sumarle 1 y hacer la conversión opuesta, o sea, desde base 10 a "base 36".
Usando fórmulas de Excel es posible hacer la primera conversión, pero (hasta donde yo sé) no es posible hacer la segunda, por lo que hay que recurrir a VBA:
Option Base 1
Const sCaracteres As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Public Function Siguiente_Código(ByVal sCad As String) As String
    'Averiguar el valor en decimal de la cadena, para luego poder sumarle 1
    Dim lValorDecimal As Long
    Dim n As Integer
    Dim mtr() As Byte
    For n = 1 To Len(sCad)
        lValorDecimal = lValorDecimal + (InStr(sCaracteres, Mid(sCad, n, 1)) - 1) * Len(sCaracteres) ^ (Len(sCad) - n)
    Next n
    lValorDecimal = lValorDecimal + 1
    'Averiguar el siguiente código
    ReDim mtr(Int(WorksheetFunction.Log(lValorDecimal, Len(sCaracteres))) + 1)
    For n = 1 To UBound(mtr)
        mtr(n) = 1 + Int(lValorDecimal / Len(sCaracteres) ^ (n - 1)) Mod Len(sCaracteres)
    Next n
    For n = UBound(mtr) To LBound(mtr) Step -1
        Siguiente_Código = Siguiente_Código & Mid(sCaracteres, mtr(n), 1)
    Next n
    'Ajustar al largo que tenga Scad
    Siguiente_Código = Right(VBA.String(Len(sCad), "0") & Siguiente_Código, Len(sCad))
End Function
Por ejemplo, para llamar averiguar el código después de 34F9W habría que poner en una celda:
=Siguiente_Código("34F9W")
Donde, lógicamente, "34F9W" puede ser sustituido por la dirección de la celda donde se encuentre el código que se desee procesar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas