Una familia de software de hoja de cálculo de Microsoft con herramientas para analizar, trazar y comunicar datos.
Hola IVANZzZ:
Debes tener en cuenta las observaciones de Héctor Miguel.
Yo utilizó la siguiente función que te va a funcionar bien hasta con 15 dígitos, pero la puedes modificar para números con más dígitos, lo puedes manejar con una cadena de texto y unir los resultados.
C12 = 1407000006349150
=SI((LARGO(C12)-15)>=1,NumLetras(EXTRAE(C12,1,LARGO(C12)-15)&"000")&" "&NumLetras(EXTRAE(C12,LARGO(C12)-14,15)),NumLetras(C12))
Un mil Cuatrocientos siete billones seis millones trescientos cuarenta y nueve mil ciento cincuenta
La siguiente es la explicación de los argumentos de la función:
=NumLetras("valor";"singular";"plural";"centavos")
Resultados:
NumLetras(1;"PESO";"PESOS";0)= Un peso
NumLetras(15,25;"PESO";"PESOS";0)= Quince pesos
NumLetras(15,25;"PESO";"PESOS";1)= Quince pesos con 25/100
NumLetras(10732)= Diez mil setecientos treinta y dos
Puedes copiar y pegar la función en un módulo de VBA y utilizarla como una función de excel.
Función VBA:
Public Function NumLetras(Valor As Currency, Optional MonedaSingular As String = "", Optional MonedaPlural As String = "", Optional InclCentvs As Boolean = False) As String
Dim lyCantidad As Currency, lyCentavos As Currency, lnDigito As Byte, lnPrimerDigito As Byte, lnSegundoDigito As Byte, lnTercerDigito As Byte, lcBloque As String, lnNumeroBloques As Byte, lnBloqueCero
Dim laUnidades As Variant, laDecenas As Variant, laCentenas As Variant, I As Variant 'Si esta como Option Explicit
Dim ValorEntero As Currency
Valor = Round(Valor, 2)
lyCantidad = Int(Valor)
ValorEntero = lyCantidad
lyCentavos = (Valor - lyCantidad) * 100
laUnidades = Array("UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE", "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE", "VEINTIUN", "VEINTIDOS", "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE")
laDecenas = Array("DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA")
laCentenas = Array("CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS", "QUINIENTOS", "SEISCIENTOS", "SETECIENTOS", "OCHOCIENTOS", "NOVECIENTOS")
lnNumeroBloques = 1
Do
lnPrimerDigito = 0
lnSegundoDigito = 0
lnTercerDigito = 0
lcBloque = ""
lnBloqueCero = 0
lcDigito = ""
For I = 1 To 3
lnDigito = Right(lyCantidad, 1)
If lnDigito <> 0 Then
Select Case I
Case 1
lcBloque = " " & laUnidades(lnDigito - 1)
lnPrimerDigito = lnDigito
Case 2
If lnDigito <= 2 Then
lcBloque = " " & laUnidades((lnDigito * 10) + lnPrimerDigito - 1)
Else
lcBloque = " " & laDecenas(lnDigito - 1) & IIf(lnPrimerDigito <> 0, " Y", Null) & lcBloque
End If
lnSegundoDigito = lnDigito
Case 3
lcBloque = " " & IIf(lnDigito = 1 And lnPrimerDigito = 0 And lnSegundoDigito = 0, "CIEN", laCentenas(lnDigito - 1)) & lcBloque
lnTercerDigito = lnDigito
End Select
Else
lnBloqueCero = lnBloqueCero + 1
End If
lyCantidad = Int(lyCantidad / 10)
If lyCantidad = 0 Then
Exit For
End If
Next I
Select Case lnNumeroBloques
Case 1
NumLetras = lcBloque
Case 2, 4
NumLetras = lcBloque & IIf(lnBloqueCero = 3, Null, " MIL") & NumLetras
Case 3
NumLetras = lcBloque & IIf(lnPrimerDigito = 1 And lnSegundoDigito = 0 And lnTercerDigito = 0, " MILLON", " MILLONES") & NumLetras
Case 5
NumLetras = lcBloque & IIf(lnPrimerDigito = 1 And lnSegundoDigito = 0 And lnTercerDigito = 0, " BILLON", " BILLONES") & NumLetras
End Select
lnNumeroBloques = lnNumeroBloques + 1
Loop Until lyCantidad = 0
NumLetras = Trim(NumLetras & " " & IIf(ValorEntero = 1, MonedaSingular, MonedaPlural)) & IIf(InclCentvs, " CON " & Format(Str(lyCentavos), "00") & "/100 ", "")
NumLetras = UCase(Left(NumLetras, 1)) & LCase(Mid(NumLetras, 2, Len(NumLetras) - 1))
End Function