Hace poco nos pidieron poder convertir en un documento de Microsoft Word números en texto, de manera que, por ejemplo, 123,27 se convirtiese en Ciento veintitrés con Veintisiete. Veamos como podemos hacerlo:
Contenidos
Pasar de número a letra con campos dinámicos
Pasar números enteros
Pulsamos control + F9 y nos aparecerán { } en cuyo interior introduciremos este código:
=numero \*cardtext
Cambiando número por el número que queramos convertir.
Luego pulsamos Alt + F9 para pasar de mostrar la fórmula a verel resultado
Pasar números con decimales
Lo anterior no funciona con decimales, para los cuales podemos usar este código más avanzado (cuidado al copiar y pegar porque así no interpreta los corchetes como campos dinámicos)
{ SET x NUMERO }
{ SET y { =INT({ref x})}}
{ SET z { =({ref x}-{ref y})*100}}
{ REF y \*Cardtext \* Upper \* MERGEFORMAT } CON { REF z \*Cardtext \* Upper \* MERGEFORMAT }
Pasar de número a letra con macros
Podemos facilitar la tarea usando macros de VBA (Visual Basic for Applications) en lugar de campos dinámicos, ya que así podremos realizar la tarea desde un botón.
Macro para números enteros
La página tips.net nos facilita esta fabulosa macro:
Sub numeroaletra()
Dim sDigits As String
Dim sBigStuff As String
sBigStuff = ""
' Select the full number in which the insertion point is located
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdMove
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
' Store the digits in a variable
sDigits = Trim(Selection.Text)
If Val(sDigits) > 999999 Then
If Val(sDigits) <= 999999999 Then
sBigStuff = Trim(Int(Str(Val(sDigits) / 1000000)))
' Create a field containing the big digits and
' the cardtext format flag
Selection.Fields.Add Range:=Selection.Range, _
Type:=wdFieldEmpty, Text:="= " + sBigStuff + " \* CardText", _
PreserveFormatting:=True
' Select the field and copy it
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
sBigStuff = Selection.Text & " million "
sDigits = Right(sDigits, 6)
End If
End If
If Val(sDigits) <= 999999 Then
' Create a field containing the digits and the cardtext format flag
Selection.Fields.Add Range:=Selection.Range, _
Type:=wdFieldEmpty, Text:="= " + sDigits + " \* CardText", _
PreserveFormatting:=True
' Select the field and copy it
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
sDigits = sBigStuff & Selection.Text
' Now put the words in the document
Selection.TypeText Text:=sDigits
Selection.TypeText Text:=" "
Else
MsgBox "Numero demasiado largo", vbOKOnly
End If
End Sub
Debemos copiarla y pegarla en Word, menú vista, macros, modificar. Guardamos los cambios y podremos ejecutarla desde el mismo botón de macros, haciendo doble clic en la macro llamada numeroaletra.
Macro para números con decimales
Para números con decimales modificamos la anterior macro un poco:
Copiamos la macro 2 veces, cambiando su nombre, por ejemplo numerosdecimales() y numerosdecimales2(). En la primera añadimos un código para separar la parte entera de la decimal del número seleccionado y pasamos la parte entera a letra, para luego hacer una llamada a la segunda función, pasándole como parámetro la parte decimal.
Sub numerosdecimales()
' numeros Macro pasa a texto el numero seleccionado
Dim sDigits As String
Dim sBigStuff As String
sBigStuff = ""
' Store the digits in a variable
numero = Trim(Selection.Text)
x = Split(Str(numero), ".")
sDigits = x(LBound(x, 1)) 'parte entera
num2 = x(UBound(x, 1)) 'parte decimal
If Val(sDigits) > 999999 Then
If Val(sDigits) <= 999999999 Then
sBigStuff = Trim(Int(Str(Val(sDigits) / 1000000)))
' Create a field containing the big digits and
' the cardtext format flag
Selection.Fields.Add Range:=Selection.Range, _
Type:=wdFieldEmpty, Text:="= " + sBigStuff + " \* CardText", _
PreserveFormatting:=True
' Select the field and copy it
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
sBigStuff = Selection.Text & " million "
sDigits = Right(sDigits, 6)
End If
End If
If Val(sDigits) <= 999999 Then
' Create a field containing the digits and the cardtext format flag
Selection.Fields.Add Range:=Selection.Range, _
Type:=wdFieldEmpty, Text:="= " + sDigits + " \* CardText", _
PreserveFormatting:=True
' Select the field and copy it
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
sDigits = sBigStuff & Selection.Text
' Now put the words in the document
Selection.TypeText Text:=sDigits
Selection.TypeText Text:=" "
Else
MsgBox "Numero demasiado largo", vbOKOnly
End If
numerosdecimales2 (num2)
End Sub
Sub numerosdecimales2(sDigits)
'
' numeros Macro
'
'
'Dim sDigits As String
Dim sBigStuff As String
sBigStuff = ""
If Val(sDigits) > 999999 Then
If Val(sDigits) <= 999999999 Then
sBigStuff = Trim(Int(Str(Val(sDigits) / 1000000)))
' Create a field containing the big digits and
' the cardtext format flag
Selection.Fields.Add Range:=Selection.Range, _
Type:=wdFieldEmpty, Text:="= " + sBigStuff + " \* CardText", _
PreserveFormatting:=True
' Select the field and copy it
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
sBigStuff = Selection.Text & " million "
sDigits = Right(sDigits, 6)
End If
End If
If Val(sDigits) <= 999999 Then
' Create a field containing the digits and the cardtext format flag
Selection.Fields.Add Range:=Selection.Range, _
Type:=wdFieldEmpty, Text:="= " + sDigits + " \* CardText", _
PreserveFormatting:=True
' Select the field and copy it
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
sDigits = sBigStuff & Selection.Text
' Now put the words in the document
Selection.TypeText Text:="con "
Selection.TypeText Text:=sDigits
Selection.TypeText Text:=" "
Else
MsgBox "Numero demasiado largo", vbOKOnly
End If
End Sub
Acceder a las macros desde un botón de la barra
Para acceder facilmente a estas macros podemos añadirlas a la barra de menús, haciendo clic derecho en ella, personalizar la cinta de opciones, seleccionar macros en el desplegable los comandos disponibles en, escogemos nuestra macro y en la derecha escogemos el menú donde queremos que aparezca y pulsamos agregar.
Fayna dice
Gracias por la aportación. Sin embargo, no me funciona la Macro para números con decimales, ¿se puede copia tal y como está o hay que hacerle algo? En caso de que haya que incluirle algo.. ¿Me la puede hacer llegar para que la pueda copiar y pegar? Muchas gracias de antemano. Saludos.
Igor García dice
Hola. Acabamos de modificar el código para números con decimales. Ahora debería funcionarte.
ARTURO BARBOSA SABANERO dice
NO funciona, sigue arrojando el error
Arturo Barbosa dice
Hola, yo usaba la macro que te dejo enseguida, pero dejo de funcionar correctamente, word me pide que la depure, pero no se que tiene mal, puedes darle una mirada, por favor?
Sub Nums_unicos_a_texto()
Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Copy
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeText Text:=" "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False
Selection.TypeText Text:="="
Selection.PasteAndFormat (wdFormatOriginalFormatting)
Selection.InsertSymbol Font:="Arial", CharacterNumber:=92, Unicode:=True
Selection.TypeText Text:="*cardtext"
Selection.Fields.Update
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Selection.Range.Case = wdNextCase
Selection.Range.Case = wdNextCase
Selection.Copy
Selection.PasteSpecial Link:=False, DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=False
End Sub
Es el último renglón el que aparentemente está mal.
Ariel dice
Muy interesante! Lo he testeado. Funciona hasta el número 1000000 exacto. Un millon uno, ya falla. No funciona con números superiores a 1 millon. De todas maneras es muy útil. Mucho mejor que estar ejecutando a mano uno por uno copiando " \* CardText" e introduciendo el número que queremos pasar a letras cada vez.
Muchas gracias