
Este artículo es el segundo programado de Marisa E. Schieda, una correctora y bloguera argentina que quiere compartir contigo sus macros de Word para ordinales. Ya sabes que los ordinales son, por ejemplo, 1.º, 2.º, 3.ª, 4.ª, etc. No te pierdas el artículo de Marisa y descágarte la macro al final del artículo.
Te dejo ya con Marisa.
Introducción

Antes de preparar la macro, hay que tener en cuenta dos cosas respecto a la ortografía de los ordinales:
- La cifra se separa de la voladita (º para masculino, ª para el femenino) con un punto.
- El grupo cifra, punto y voladita se separa con un espacio de no separación de la siguiente palabra.
Ni más ni menos.
Nomenclatura de colores
- 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;
- si un patrón NO encuentra una cadena, por ejemplo Pangea, se marcará sobre un fondo de color gris;
- 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.
⁂
Macros para ordinales

A partir de la dinámica de los patrones del artículo anterior sobre abreviaturas de número, pueden elaborarse, también, patrones de búsqueda para la corrección de aquellas abreviaturas de ordinales que estuviesen mal escritas (no me canso de remitir, para cualquier duda acerca de comodines y patrones de búsqueda en Word, a la entrada de Jesús “Los comodines de Word a fondo: teoría y práctica”).
Hay que considerar, como ya indiqué al comienzo, que no verifica la concordancia del ordinal en género y en número con el sustantivo al que modifica.
Sus acciones básicas:
- Coloca punto entre cifra y voladita ª/º (casos sin espacio entre cifra y voladita).
- Cambia cualquier espacio o/y punto entre cifra y voladita por solo punto.
- Busca cifra seguida de espacios + voladita + punto.
- Busca cifra seguida de espacios + voladita + espacios + punto.
- Elimina doble puntuación.
- Agrega espacio entre cifra y voladita para habilitar búsqueda y reemplazo de espacio por espacio de no separación.
- Búsqueda y reemplazo de espacio por espacio de no separación.
- Casos particulares:
- 2.do/2do → 2.º
- 2.da/2da → 2.ª
- 7.mo/7mo → 7.º
- 7.ma/7ma → 7.ª
Patrones de búsqueda y sustitución para ordinales
Donde:
- ([0-9]) encuentra un número del 0 al 9;
- ([a-zA-Z]) encuentra una letra de la A al Z, sin importar las mayúsculas/minúsculas;
- , @ o [ ]@ encuentran cualquier espacio (uno o más ).
⁂
1. Agrega punto entre cifra y ordinal (sin espacio entre ambos)
Ejemplo: reemplaza 1º por 1.º
Buscar: ([0-9])([ºª])
Reemplazar con: \1.\2
With Selection.Find .Text = "([0-9])([ºª])" .Replacement.Text = "\1.\2" .Forward = True .Wrap = wdFindContinue .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll
⁂
2. Agrega espacio entre ordinal y palabra siguiente
Para posibilitar paso 3…
Ejemplo: reemplaza 2.º E por 2.º E
With Selection.Find .Text = "([0-9].[ºª])([a-zA-Z])" .Replacement.Text = "\1 \2" .Forward = True .Wrap = wdFindContinue .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll
⁂
3. Sustituye espacios entre cifra y ordinal por punto
Ejemplo: reemplaza 3 ª por 3.ª
- Encuentra un número ([0-9]) → término \1,
- seguido por uno o más espacios [ ]@,
- seguidos por las voladita ([ºª]) → término \2,
- y reemplaza lo encontrado por el término (1) seguido de punto e inmediatamente (2). Ej. 12 ª → 12.ª.
Buscar: ([0-9]) @(ª)
Reemplazar con: \1.\2
With Selection.Find .Text = "([0-9]) @([ºª])" .Replacement.Text = "\1.\2" .Forward = True .Wrap = wdFindContinue .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll
⁂
4. Corrige doble puntuación en ordinal
Ejemplo: reemplaza 4.ª. por 4.ª
Buscar: ([0-9].[ºª])(.)
Reemplazar con: \1
With Selection.Find .Text = "([0-9].[ºª])(.)" .Replacement.Text = "\1" .Forward = True .Wrap = wdFindContinue .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll
⁂
5. Corrige casos frecuentes
Buscar: 2.do, 2do, 2.da, 2da
Reemplazar con: 2.º o 2.ª
Buscar: 7.do, 7do, 7.da, 7da
Reemplazar con: 7.º o 7.ª
⁂
5. a) 2.do, 2do y 2.da, 2da → 2.º/2.ª
Ejemplo: reemplaza 2.do, 2do por 2.º, y 2.da, 2da por 2.ª
With Selection.Find .Text = "2.do" .Replacement.Text = "2.º" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = "2do" .Replacement.Text = "2.º" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = "2.da" .Replacement.Text = "2.ª" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = "2da" .Replacement.Text = "2.ª" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll
⁂
5. b) 7.ma, 7ma y 7.mo, 7mo → 7.ª /7.º
Ejemplo: reemplaza 7.mo, 7mo por 7.º, y 7.ma, 7ma por 7.ª
With Selection.Find .Text = "7.ma" .Replacement.Text = "7.ª" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = "7ma" .Replacement.Text = "7.ª" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "7.mo" .Replacement.Text = "7.º" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = "7mo" .Replacement.Text = "7.º" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub
⁂
6. Sustituye espacios entre ordinal y palabra siguiente por espacio de no separación
Ejemplo: reemplaza 6.º E por 6.º E
With Selection.Find .Text = "([0-9].[ºª]) @([a-zA-Z])" .Replacement.Text = "\1^s\2" .Forward = True .Wrap = wdFindContinue .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll
⁂
Descargar la macro
Podés copiar la macro completa y pegarla en el editor de VBA:
Conclusiones de la macro para ordinales
Espero que las macros de Marisa te sirvan en un doble sentido:
- Si eres corrector, seguro que puedes aprovechar estas macros.
- Si tienes miedo a las macros y reniegas de cualquier cosa que no sean letras puras, deseo que te des cuenta del proceso por el que pasó Marisa, desde la posición inicial de no dominar ni los comodines ni el lenguaje de macros de Word, y así te sirva de aliciente para dar un paso al frente si la novedad va a ser útil en tu trabajo.
Una vez más, quiero agradecer a Marisa que compartiera sus macros de Word, la de este artículo y la anterior para las abreviaturas de número.
Ahora es tu turno… Sí, tu turno para probar las macros de Marisa, aplicarlas y mejorarlas incluso añadiendo de tu propia cosecha. Si quieres agradecer a Marisa su trabajo o comentar algo, lo puedes hacer a continuación, en la sección Comentarios.
⁂
Si no te quieres perder ningún artículo de Gonduana, suscríbete al boletín del blog con el siguiente formulario o sígueme en LinkedIn, Facebook o Twitter (@jssprt). De esta manera, serás el primero en enterarte de las siguientes publicaciones.
Si quieres leer otros artículos sobre comodines de Word de Gonduana, los tienes todos si filtras por «comodines» en la nube de etiquetas del blog.
Ya ves que tienes aquí un nuevo seguidor y que ya ha picado el anzuelo con las macros de Word. ^_^
Me parece extraño el último punto de esta macro por dos razones. La primera, el espacio que hay al final del criterio de búsqueda:
--
With Selection.Find
.Text = "([0-9].[ºª]) @([a-zA-Z ])"
--
Me da la sensación de que ese espacio se ha colado ahí o, al menos, le veo más sentido si fuera algo así:
--
"([0-9].[ºª])[ ]@([a-zA-Z])"
--
Pero puede que se me escape algún detalle.
En segundo lugar, ¿un ordinal va *siempre* unido con espacio de separación a la siguiente palabra? Sí me parece lógico con un texto como este: «La 2.ª Feria del Motor…», pero no cuando decimos algo como «Repartieron pocos premios y se los llevaron los 3 primeros ganadores, pero el 4.º no tuvo tanta suerte».
Aparte de esto, que me ha llamado la atención, tengo un problema que no sé si alguien ha resuelto ya. Estoy grabando macros y funcionan bien, salvo cuando tengo activado el 'Control de cambios'. Sé que Word trata el texto eliminado como si estuviera oculto, pero está ahí y este interfiere con los criterios de búsqueda y los reemplazos. ¿Sabes si hay alguna forma de evitarlo?
Un saludo.
Hola, Noa:
Sobre lo primero que dices, ese espacio se sustituye por un espacio de no separación, para que, por ejemplo, «4.º puesto» quede siempre en la misma línea.
Sobre lo de que el espacio «siempre va a unido a lo siguiente», entiendo lo que dices, y me parece que en tu ejemplo no debería ir unido. De todas formas, espero a que María se pronuncie al respecto.
Sobre lo tercero, no sé exactamente lo que quieres:
Si necesitas que las búsquedas se salten el texto oculto, hay que añadir que el formato sea «No oculto».
Para ello, habría que añadir esto en algún lugar antes de With Selection.Find:
Selection.Find.Font.Hidden = False
y .Format = True dentro del bucle With Selection.Find
Por otra parte, si lo que quieres es desactivar temporalmente el control de cambios mientras ejecutas la macro, se puede hacer. No lo he probado, pero creo que si colocas estas líneas al principio de la macro:
If ActiveDocument.TrackRevisions = True
ActiveDocument.TrackRevisions = False
y esta otra línea al final:
ActiveDocument.TrackRevisions = True
creo que debería funcionar.
Más información sobre esta cosa rara de TrackRevisions aquí:
https://docs.microsoft.com/en-us/office/vba/api/Word.Document.TrackRevisions
☛ Habría que pulir algo más este código VBA, porque lo ideal sería activar el control de cambios (al final) si estaba activado antes de ejecutar la macro. En fin, sea lo que sea, te lo dejo ya para ti.
Por cierto: Los reemplazos generales, siempre con mucho cuidadito, cuando no haya excepciones.
Un saludo,
… Jesús Prieto …
Gracias, Jesús. Estudiaré lo que me dices. Mi problema, en resumidas cuentas, es que necesito hacer las correcciones con el 'Control de cambios' activado para que el cliente luego pueda verlos y aceptarlos, pero no sé si el texto eliminado o sustituido mediante 'Buscar y reemplazar' lo convierte en oculto o qué. Sea como sea, interfiere en las macros.
Por ejemplo, si sustituyo tres puntos por puntos suspensivos, el texto resultante es el texto que he buscado (tachado) y el que he usado para reemplazarlo: "...…". Esto hace que luego no encuentre por ejemplo puntos suspensivos tras un espacio, porque algunos pueden ser ahora " ...…" en lugar de " …".
No sé si se entiende, pero vuelve cualquier macro compleja una auténtica locura. Trastearé con lo de texto oculto o, al menos, espero aprender a hacerlo. 🙂
En cuanto al espacio que mencionaba al principio, lo que no entiendo bien es que tras buscar espacios después de las voladitas —es decir, esta parte: "([ºª]) @"— se incluya luego entre corchetes la posibilidad de encontrar aún más espacios —como se aprecia tras la Z: "([a-zA-Z ])"—. Que a lo mejor es una tontería y no tiene mucha importancia, pero me ha dejado intrigado.
Gracias por tu paciencia. Voy a intentar aprender más cosas por mi cuenta para no robarte más tiempo, pero es que estoy tan verde en esto que a veces no sé ni por dónde empezar y cualquier consejo resulta de gran utilidad. 🙂
Ah, disculpa, ahora veo el espacio que dices. Creo que hay que quitarlo como dices, sí…
Hola Noa. Sí, ese espacio es un infiltrado, donde dice: "([0-9].[ºª]) @([a-zA-Z ])" debería decir:"([0-9].[ºª]) @([a-zA-Z])"... ¡Hiciste muy bien la tarea!
Gracias, Marisa;
Espacio borrado, entonces.