jueves, 7 de marzo de 2013

Números enteros a cualquier base con VBA

Convertir a cualquier base con VBA

Usa Visual Basic para Aplicaciones para convertir un número en base 10 a cualquier base.

Microsoft Office ofrece una serie de funciones en VBA para convertir un número en base 10 a otra base. Dichas funciones como HEX o OCT tienen como limite máximo el tipo de datos Long.

Sin embargo, a veces es interesante y sobre todo en sistemas operativos de 32 bits, convertir números mucho más grandes.

Para este propósito he escrito una función para números enteros cuyo límite está establecido por el tipo de datos Double. El número más grande para este tipo de datos es 1,79769313486232E308 frente a 2.147.483.647.

El código:

Function CBase(Numero_Base_10 As String, Optional Base As Integer) As String

'Convierte un número decimal a otro de máximo 35 de base

Dim n, r, c As Double
Dim esFin As Boolean
Dim strCrt As Variant

strCrt = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")

'Si no se pasa el argumento asume el máximo de la matriz

If IsMissing(Base) Then Base = UBound(strCrt)
'Si el usuario es un poquito cabr... corrige el fallo
If Base > UBound(strCrt) Or Base < 2 Then Base = UBound(strCrt)

esFin = False
'Convierte el número al tipo de dato doble

n = CDbl(Numero_Base_10
'Inicializa el resultado

CBase = "" 
Do While Not esFin
     c = n / Base 'Cociente
     r = (c - Int(c)) * Base 'Resto
     CBase = strCrt(r) & CBase
     'Si el cociente es menor que la Base acaba
     If c < Base Then esFin = True Else n = Int(c)
Loop
'Añade el cociente final
CBase = strCrt(Int(c)) & CBase

End Function


La función está preparada para cualquier base que se quiera. En el código descrito se podría llegar hasta una base de 36. Si se quiere convertir a una base inferior a 36 sólo hay que pasar el parámetro de la base correspondiente, por ejemplo para convertir a hexadecimal el número 562133321251410, simplemente usa CBase( 5621333212514,16) sin modificar la función. Si quieres convertir a una base de por ejemplo 85, debes modificar la función añadiendo más caracteres diferentes a la matriz strCrt.


Agradecimientos:
Jack Daniel's