Este artículo viene a colación de lo que he tenido que hacer hoy: cambiar un montón de separadores de millar y de decimales en Word.
No lo voy a negar: empecé cambiándolos a mano:

Pero pronto vi que era una locura, y me entró complejo de Sísifo: «¡Esto no va a acabar nunca!»
Imagínatelo: ¡tenía centenares de estos números!
Así que antes de volverme loco, paré a pensar cómo hacerlo de la mejor manera posible…
Al final, decidí que lo mejor era cambiar los separadores de millar y de decimales empleando los comodines de Word, y quiero contarte cómo lo he hecho, por si alguna vez te surge a ti la ocasión de poner en práctica el mismo proceso.
Este artículo no es más que una aplicación más de este otro, donde vimos la teoría de los comodines de Word.
¿Empezamos?
Planteamiento del problema
Imagínate que tienes que traducir de inglés a español un documento de Word con muchas tablas que tienen muchos datos numéricos. Las tablas son de Word, de modo que las puedes modificar directamente, sin problema. Son tablas de este estilo:

Traduces el encabezado de la tabla, y solo te queda por cambiar las cifras:

Si fuera una tabla tan pequeña como esta, puedes cambiar los separadores manualmente, teniendo cuidado…, pero si tienes que hacer este cambio unos cuantos centenares de veces, te aseguro que alguna vez te pasará lo mismo que a mí: traducirás 12,000 por 12.00 o por 1.000 (en vez de por 12.000, que es lo correcto).
🙁
Para evitar estos errores típicos de un trabajo aburrido y monótono, automaticé lo que pude los cambios con los comodines de Word.
Empleo de comodines
1.- Cifras con porcentajes
Vamos a empezar cambiando las cifras de porcentaje de la última columna.
Este patrón de búsqueda funcionará a la perfección:
([0-9]{1;}).([0-9]{1;})%
y encontrará la primera ocurrencia en 90.34%.
El patrón de sustitución será:
\1,\2%
O si prefieres seguir la última norma de la RAE y dejar un espacio antes del signo de porcentaje, el patrón de sustitución será:
\1,\2 %
Deberás escribir los patrones de búsqueda y de sustitución en el cuadro de diálogo Buscar y reemplazar de Word:

No olvides marcar la casilla de verificación Usar caracteres comodín.
Ahora ve pulsando el botón Reemplazar y mirando que los separadores se van reemplazando correctamente los separadores de decimales, sin tocar las cifras.
Cuidadito con pulsar el botón Reemplazar todo.
En este artículo tienes el significado de todos los comodines, pero repasamos rápidamente los que hemos empleado.
En el patrón de búsqueda:
- [0-9] busca un número del 0 al 9.
- [0-9]{1;} busca uno o varios números.
- La primera pareja de paréntesis () guarda su contenido (será la 1.ª posición).
- . busca el punto decimal en inglés.
- [0-9]{1;} busca también uno o varios números después del punto decimal.
- La segunda pareja de paréntesis () guarda su contenido (será la 2.ª posición).
- % busca simplemente el signo de porcentaje.
En el patrón de sustitución:
- \1 es el contenido encontrado en la 1.ª posición (90).
- , es una coma.
- \2 es el contenido encontrado en la 2.ª posición (34).
- % es, de nuevo, el signo de porcentaje.
Por tanto, Word sustituirá 90.34% por 90,34 % (o 90,34%, si tu patrón de sustitución no tiene un espacio antes del signo de porcentaje).
2.- Cifras con libras
Vamos ahora a la penúltima columna.
Fíjate que el patrón de búsqueda que necesitamos es:
£ ([0-9]{1;}),([0-9]{1;}).([0-9]{1;})
Por ejemplo, Word encuentra la primera ocurrencia en £ 10,357.40.
Fíjate que podríamos haber puesto también £ ([0-9]{1;}),([0-9]{3}).([0-9]{1;}) como patrón de búsqueda, ya que buscará un grupo de 3 dígitos en la parte inmediatamente a la izquierda del separador de decimales.
El patrón de sustitución será:
\1.\2,\3 £
Como antes, escribe estos patrones de búsqueda y de sustitución en el cuadro de diálogo Buscar y reemplazar.
Al pulsar el botón Reemplazar, Word sustituirá £ 10,357.40 por 10.357,40 £.
Como ves, hemos aprovechado los comodines para colocar el símbolo de libra esterlina (£) al final, donde nos interesa.
3.- Otras cifras
La antepenúltima columna es coser y cantar.
Si has seguido los otros patrones,verás claro que el patrón de búsqueda necesario será:
([0-9]{1;}),([0-9]{1;})
Por ejemplo, Word encuentra la primera ocurrencia en 10,234.
Igual que antes, el patrón de búsqueda £ ([0-9]{1;}),([0-9]{3}).([0-9]{1;}) también funcionaría.
Mientras que el patrón de sustitución será:
\1.\2
Al pulsar el botón Reemplazar, Word sustituirá 10,234 por 10.234.
Fácil, ¿verdad?
Al final, tendremos la tabla completamente traducida:

Casuística y deberes para casa
Por si acaso piensas, mi querido traductor, que nunca tendrás este problema, quería señalar los siguientes casos posibles:
- En el patrón de sustitución, he elegido el punto como separador de miles (el habitual en España), pero puedes escribir un espacio duro, el indicado por una norma internacional (que no sigue casi nadie, ni yo). ¿Te atreves con un patrón de sustitución que te funcione así?
- Si traduces a español de México también puedes encontrar útil este artículo si traduces de francés a español, por ejemplo. En este caso, ¿podrías diseñar el patrón de búsqueda que encuentre la cifra 1 234,56 €? Ya sabes que los separadores de millar en francés son espacios duros, quizás espacios normales. Si son espacios duros, necesitarás el dato de que los espacios duros se escriben con el código ALT+0160. De paso, el patrón de sustitución es muy fácil también… 🙂
- Si adaptas el español de España a español de México, ¿podrías diseñar el patrón de búsqueda que encuentre 1.234,56 €? De paso, diseña el patrón de sustitución que cambie la anterior cifra a €1,234.56.
- Fíjate que el segundo patrón £ ([0-9]{1;}),([0-9]{1;}).([0-9]{1;}) no encontrará los números de 7 o más dígitos a la izquierda del separador de decimales, como £ 1,234,567.89. Por ello, te propongo diseñar el patrón que encuentre £ 1,234,567.89 en inglés, y el patrón de sustitución correspondiente.
- Es cierto que las cifras con porcentajes suelen ser pequeñas, como 3.14%, pero nada impide un tres mil por ciento (3,000%). ¿Podrías diseñar el patrón de búsqueda que encuentre 3,000% en inglés?
Como ves, la casuística es grande, y es muy probable que alguna vez tengas que lidiar con este problema y que necesites adaptar los patrones de búsqueda y sustitución para tu caso.
Nomenclatura de colores
Ya hemos comentado la nomenclatura seguida en los artículos de la serie de comodines de Word, pero no está de más recordarla:
- los patrones de búsqueda irán sobre fondo rojo, por ejemplo, (Gond[uw]ana);
- cada patrón encontrará una cadena, por ejemplo Gonduana, sobre fondo de color azul;
- por algún motivo interesante de mencionar en el artículo, el patrón no encontrará una cadena, por ejemplo gonduana, que va sobre fondo gris (por ir la ge en minúsculas);
- el patrón de sustitución, por ejemplo Blog \1, irá sobre fondo amarillo;
- la cadena final sustituida será Blog Gonduana, e irá sobre fondo de color verde.
Conclusiones de cambiar los separadores de millar y de decimales en Word
Hemos encontrado una forma fácil y rápida de cambiar todos los separadores de millar y de decimales.
Es rápido, sí, pero para mí es quizás más importante aún tener la seguridad de haber realizado bien los cambios.
Si son pocos cambios, es más fácil y rápido hacerlo manualmente. Pero si son muchos, este procedimiento de sustitución con comodines de Word es mucho mejor.
Hemos visto que la casuística es grande, así que espero que los ejemplos de este artículo te sirvan para diseñar tus propios patrones de búsqueda y de sustitución.
De no ser por los comodines de Word, creo que todavía estaría cambiando comas y puntos, y seguro que tendría pesadillas durante toda una semana. A nivel fisiológico, creo que mi muñeca derecha, la que maneja el ratón, no lo habría soportado y habría desarrollado el síndrome de túnel carpiano.
Los comodines te cuidan…
* * * * * *
Creo que hay macros en VBA que cambian automáticamente las cifras. Aunque en este caso no sé si me fiaría de una macro, si sabes cómo es esa macro o tienes el enlace, te agradecería que lo escribieras en las sección de comentarios.






Muchas gracias a los que me me habéis apuntado los errores del artículo. Ya los he corregido todos…
¡Qué maravilla de artículo, Jesús! Muchas gracias. Es justo lo que necesitaba. Llegaba a construir la fórmula de búsqueda, pero no me salía bien la de reemplazo. ¡Gracias de nuevo!
Me alegro de que los comodines te hayan servido.
Y gracias a ti, María Ángeles, por comentar.
... Jesús Prieto ...
¡Excelente artículo Jesús (igual que los anteriores)!
Déjame decirte que no soy traductor y, sin embargo, me he topado en varias oportunidades con esta problemática de las cifras. Por suerte en mi caso han sido pocas y opté por cambiarlas manualmente.
Muchas gracias por tomarte el tiempo de compartir tus conocimientos.
Saludos desde Argentina.
Muchas gracias, Gastón.
Siempre da ánimos ver que lo escrito ayuda a otras personas, aunque no sean traductores…
¡Un fuerte abrazo desde España!
... Jesús Prieto ...
Mil gracias por este post, es lo que estaba buscando y no encontraba.
En Edición pasa mucho.
Un abrazo
Gracias a ti por decirlo, Ari. Me alegro de que te resultara útil.
Que pases un buen día con los comodines de Word.
(^_^)
… Jesús Prieto …
Hola, al intentar hacerlo me sale lo siguiente: "el texto del cuadro buscar contiene una expresión que no es valida" Si me puedes ayudar, mil gracias.
Tengo Word 2010
Saludos
Hola, Juan:
Falta saber lo que tienes escrito en el texto del cuadro Buscar y, de paso, falta la información del «lo» en «hacerlo».
De todas formas, asegúrate de que tienes marcada la casilla Usar caracteres comodín, y que sepas que no escribir de todo y que Word lo entienda. Te recomiendo que leas este artículo de Gonduana sobre los comodines. Creo que ahí tendrás la información que buscas.
¡Suerte con los comodines!
… Jesús Prieto …
Brother me ayudas con algo, suelo usar un codigo para un app y ese codigo va cambiando a cada avance debo hacer el cambio en codigo es b1.1.1-3 > Gn 1:1-3
Lo que debo ir actualizando es solo los numeros en "b1.1.1-3'>Gn 1:1-3" y las letras "Gn" Hay algun modo de hacelo mas facil?
la web me a borrado los caracteres que habia puesto en el comentario (b 1.1.1 > Gn 1:1-3) , ok e puesto espacion entre todos los caracteres talvez se vean y si no pues ya que me ire a seguir asi...
Hola, Marvin:
Si trabajas con Microsoft Word, mírate mejor estos dos artículos de comodines:
Comodines de Word para buscar y reemplazar
Los comodines de Word a fondo: teoría y práctica
En Word podrás hacerlo bastante fácil y rápido.
¡Suerte!
… Jesús Prieto …
Milllllll Gracias, me salvaste horas y horas de trabajo en 6 documentos larguisísmos, cuando al final el cliente me pide que todo sea con comas y no con puntos. Amé tu aporte.
Dios te bendiga.
Me alegro mucho de que el artículo te ayudara con los comodines. A veces, una pequeña inversión supone ahorrar mucho tiempo malgastado en acciones engorrosas.
Un fuerte abrazo desde España, Karen.
… Jesús Prieto …
Mi segunda aportación al blog.
Solo porque lo has pedido y solo porque tus artículos me sirven de mucha ayuda y me siento en la obligación de devolver algo a cambio... aunque a ti esto ya te quede un poco fuera de utilidad, dado que el artículo es de 2015, y porque en su caso lo habrías conseguido igualmente sin mi ayuda. No obstante, queda aquí por si alguien está en la imperiosa necesidad de llevarlo a cabo.
He introducido la mejora de que puedes seleccionar el texto donde quieres llevar a cabo la sustitución, combinando dos de los artículos de este blog. El orden en el que procesar las operaciones de cambio debe ser el que figura en la macro, o los cambios iniciales se irán machacando con los posteriores.
Public Sub ReemplazarSeparadoresNuméricos() ' Basado en: https://www.gonduana.com/como-borrar-los-retornos-en-word ' https://www.gonduana.com/separadores-de-millar-y-decimales-en-word/#more-2544 Dim oRango As Word.Range Set oRango = Selection.Range If oRango.ComputeStatistics(wdStatisticWords) <= 1 Then If vbYes = VBA.MsgBox("No hay un bloque de seleccion, ¿proceder en todo el documento?", vbYesNo + vbQuestion) Then ActiveDocument.Range(0, 0).Select Selection.WholeStory Set oRango = Selection.Range Else Exit Sub End If End If With oRango With .Find ' reset for next operation .ClearFormatting .Replacement.ClearFormatting 'Patrón de búsqueda para las cifras numéricas: .Text = "([0-9]{1;}),([0-9]{1;})" 'Patrón de sustitución: .Replacement.Text = "\1.\2" .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = True 'False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=wdReplaceAll End With With .Find ' reset for next operation .ClearFormatting .Replacement.ClearFormatting 'Patrón de búsqueda para monedas: .Text = "£ ([0-9]{1;}),([0-9]{1;}).([0-9]{1;})" 'Patrón de sustitución: .Replacement.Text = "\1.\2,\3 £" .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = True 'False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=wdReplaceAll End With With .Find ' reset for next operation .ClearFormatting .Replacement.ClearFormatting 'Patrón de búsqueda para porcentajes: .Text = "([0-9]{1;}).([0-9]{1;})%" 'Patrón de sustitución: .Replacement.Text = "\1,\2 %" .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = True 'False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=wdReplaceAll End With End With End SubUn saludo
Después de revisar la ejecución, el sistema no acababa de funcionar. Así que, bregando un poco más con las expresiones de comodín y un cambio en la estructura para compactar el código, he conseguido aumentar la funcionalidad. Ahora detecta valores numéricos con y sin decimales en todos los casos considerados. Y además permite personalizar hasta el estilo de búsqueda.
En la expresión de búsqueda de porcentajes hay una expresión comentada que intentaba ser generalista con varios espacios y un porcentaje, pero no he conseguido una sustitución adecuada. Los espacios antes del carácter "%" deben ser filtrados antes y después de la ejecución de la macro a conveniencia de cada uno.
Aquí el código:
Option Explicit Private Type tWdReplace SearchForText As String ReplacementText As String End Type Public Sub ReemplazarSeparadoresNuméricos() Call fReemplazarSeparadoresNuméricos(, , "Estilo2") End Sub Private Function fReemplazarSeparadoresNuméricos(Optional ByVal strOldThousandsSeparator As String = ",", _ Optional ByVal strOldDecimalSeparator As String = ".", _ Optional ByVal strSearchStyle As String = vbNullString) ' Basado en: https://www.gonduana.com/como-borrar-los-retornos-en-word ' https://www.gonduana.com/separadores-de-millar-y-decimales-en-word/#more-2544 Dim oRango As Word.Range Dim aCriteria() As tWdReplace, lgCriteria As Long Dim owdDoc As Word.Document Dim strNewThousandsSeparator As String, strNewDecimalSeparator As String Set oRango = Selection.Range If oRango.ComputeStatistics(wdStatisticWords) <= 1 Then If vbYes = VBA.MsgBox("No hay un bloque de seleccion, ¿proceder en todo el documento?", vbYesNo + vbQuestion) Then 'ActiveDocument.Range(0, 0).Select Selection.WholeStory Set oRango = Selection.Range Else Exit Function End If End If strNewThousandsSeparator = VBA.IIf(strOldThousandsSeparator = ".", ",", ".") strNewDecimalSeparator = VBA.IIf(strOldDecimalSeparator = ".", ",", ".") Set owdDoc = ActiveDocument ' oRango.Document ReDim aCriteria(0 To 5) With aCriteria(0) 'cifras numéricas con decimales .SearchForText = "([0-9]{1;})" & strOldThousandsSeparator & "([0-9]{1;})" & strOldDecimalSeparator & "([0-9]{1;})" .ReplacementText = "\1•¶\2•§\3" End With With aCriteria(1) 'cifras numéricas enteras .SearchForText = "([0-9]{1;})" & strOldThousandsSeparator & "([0-9]{1;})" .ReplacementText = "\1•¶\2" End With With aCriteria(2) 'valores en moneda .SearchForText = "£" & " " & "([0-9]{1;})" & strOldThousandsSeparator & "([0-9]{1;})" & strOldDecimalSeparator & "([0-9]{1;})" .ReplacementText = "\1•¶\2•§\3" & " " & "£" End With With aCriteria(3) 'cifras numéricas de porcentaje (con decimales, no se esperan valores por encima del 999%) .SearchForText = "([0-9]{1;})" & strOldDecimalSeparator & "([0-9]{1;})%" .ReplacementText = "\1•§\2%" End With '------- With aCriteria(4) 'separador de decimales .SearchForText = "•§" .ReplacementText = "," End With With aCriteria(5) 'separador de miles .SearchForText = "•¶" .ReplacementText = "." End With '------- With oRango For lgCriteria = LBound(aCriteria) To UBound(aCriteria) With .Find ' clear fields for next search-replace operation .ClearFormatting .Replacement.ClearFormatting 'Patrón de búsqueda: .Text = aCriteria(lgCriteria).SearchForText 'Patrón de sustitución: .Replacement.Text = aCriteria(lgCriteria).ReplacementText .Forward = True .Wrap = wdFindStop If strSearchStyle = vbNullString Then .Format = False ElseIf Not styleExists(strSearchStyle, owdDoc) Then .Format = False Else .Format = True .Style = owdDoc.Styles(strSearchStyle) ' not expected: .Replacement.Style = owdDoc.Styles(strReplacementStyle) End If .MatchCase = False .MatchWholeWord = False .MatchWildcards = True 'False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=wdReplaceAll End With Next lgCriteria End With End Function Private Function styleExists(ByVal strStyleName As String, _ Optional ByVal owdDoc As Word.Document = Nothing) As Boolean styleExists = False On Local Error Resume Next If owdDoc Is Nothing Then Set owdDoc = ActiveDocument styleExists = owdDoc.Styles(strStyleName).NameLocal = strStyleName On Local Error GoTo 0 End FunctionEl bloque de criterios con el orden adecuado, y además reconociendo múltiples monedas
ReDim aCriteria(0 To 8) With aCriteria(0) 'valores en moneda, con decimales .SearchForText = "([$,€,£,¥,¢]{1;})" & " " & "([0-9]{1;})" & strOldThousandsSeparator & "([0-9]{1;})" & strOldDecimalSeparator & "([0-9]{1;})" .ReplacementText = "\2•¶\3•§\4" & " " & "\1" End With With aCriteria(1) 'valores en moneda, con decimales, sin miles .SearchForText = "([$,€,£,¥,¢]{1;})" & " " & "([0-9]{1;})" & strOldDecimalSeparator & "([0-9]{1;})" .ReplacementText = "\2•§\3" & " " & "\1" End With With aCriteria(2) 'valores en moneda, enteros .SearchForText = "([$,€,£,¥,¢]{1;})" & " " & "([0-9]{1;})" & strOldThousandsSeparator & "([0-9]{1;})" .ReplacementText = "\2•¶\3" & " " & "\1" End With With aCriteria(3) 'cifras numéricas, con decimales .SearchForText = "([0-9]{1;})" & strOldThousandsSeparator & "([0-9]{1;})" & strOldDecimalSeparator & "([0-9]{1;})" .ReplacementText = "\1•¶\2•§\3" End With With aCriteria(4) 'cifras numéricas de porcentaje (con decimales, no se esperan valores por encima del 999%) .SearchForText = "([0-9]{1;})" & strOldDecimalSeparator & "([0-9]{1;})%" ' aquí se podría intentar reconocer múltiples espacios... sigue lo que incico en mis comentarios de fecha de ayer que han quedado descolgados del hilo... .ReplacementText = "\1•§\2%" End With With aCriteria(5) 'cifras numéricas cortas, con decimales .SearchForText = "([0-9]{1;})" & strOldDecimalSeparator & "([0-9]{1;})" .ReplacementText = "\1•§\2" End With With aCriteria(6) 'cifras numéricas, enteras .SearchForText = "([0-9]{1;})" & strOldThousandsSeparator & "([0-9]{1;})" .ReplacementText = "\1•¶\2" End With '------- With aCriteria(7) 'separador de decimales .SearchForText = "•§" .ReplacementText = "," End With With aCriteria(8) 'separador de miles .SearchForText = "•¶" .ReplacementText = "." End With '-------con esto cierro el tema de los decimales y separadores de millar.
'([!A-~,&-@,•]{1;}) esta es la expresión que iba en la parte de porcentajes y que la plataforma no me dejó poner como código comentado (??)
Y esto reemplazaría los multiespacios por un espacio simple:
dim oCriteria as tWdReplace With oCriteria .SearchForText = "([ ]{1;})" .ReplacementText = " " End With '... 'aquí la parte de buscar y reemplazar en rango, sin el bucle de Criterios '...Muchas gracias, Enrique:
No he probado aún tu macro (ni la versión mejorada), pero estoy seguro de que servirá a muchos.
Un abrazo,
… Jesús Prieto …