Con este artículo seguimos con la serie iniciada con este primer artículo, en el que aprendimos a manejarnos con los comodines de Word con la excusa de tratar de convertir una memoria de traducción TMX a una sencilla tabla.
En un segundo artículo afinamos aún más los patrones de búsqueda y simplificamos el proceso, al menos el número de pasos, aunque conseguimos unos patrones de búsqueda monstruosamente largos.
Ahora, con algún pequeño cambio, vamos a aprovechar estos patrones de búsqueda con comodines para crear una macro en VBA (abreviatura de «Visual Basic for Applications»). Con esta macro conseguiremos la tabla a partir de la memoria TMX.
Por supuesto, la filosofía es que la creas una macro una vez y la puedes usar las veces que quieras.
¿Listo?
Índice
Material que puedes descargarte
Antes de empezar, por si tienes prisa y lo único que quieres es la macro convertir la memoria TMX a una tabla, te pongo aquí, al principio y muy clarito, lo que te puedes descargar:
- El documento con los 6 comodines empleados.
- Una pequeña memoria TMX de prueba.
- Por fin, la macro VBA en formato TXT.
Si era esto lo que querías y ya sabes cómo insertar el código VBA puedes dejar de leer el artículo, nada te retiene…
Ahora bien, si quieres saber los entresijos de esta macro en lenguaje VBA, sigue leyendo, y en el futuro podrás crear otras macros para otros fines.
Dame un pez, y me quitarás el hambre.
Enséñame a pescar, y nunca más pasaré hambre.
Introducción a VBA
Como en los dos artículos mencionados arriba, se trata de conseguir una sencilla tabla a partir de una memoria con formato TMX. El objetivo es el mismo, pero esta vez lo haremos con una macro VBA que emplea los comodines de Word. Te animo a que te descargues el listado de comodines necesarios y que lo tengas delante, para que sigas todo el artículo.
Por ejemplo, si quieres que Word sustituya todos los guión por guion, deberás usar esta macro en VBA dentro de Microsoft Word:
Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "guión" .Replacement.Text = "guion" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False End With Selection.Find.Execute Replace:=wdReplaceAll
Vamos a ver por encima las líneas más importantes:
- Las líneas 1 y 2 dicen que se busque y reemplace sin formato.
- Las líneas 3 a 14 establecen los parámetros de búsqueda y reemplazo (coinciden con las casillas que hay en el cuadro de diálogo Buscar y Reemplazar de Microsoft Word; te animo a comprobarlo). Por ejemplo, en la línea 4 se dice que se busque la palabra guión; la línea 5, que se reemplace por guion; la línea 13 dice que no se empleen comodines.
- La línea 15, por fin, realiza todos los reemplazos del documento, sin pedir confirmación y con los criterios que se han declarado antes.
Este código no utiliza comodines, pero como necesitaremos usarlos en todo el artículo, el código VBA que encuentra todos los gui?n y los sustituye por guion será (fíjate que ya hay comodines):
Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "gui?n" .Replacement.Text = "guion" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll
¿Ves cómo ha cambiado la línea 13 de False a True?
Pues bien, ya tenemos el módulo básico de reemplazos que utilizaremos en la macro VBA basada en comodines. Solo tendremos que repetirlo para cada uno de los reemplazos.
Diseño final de la macro VBA
Ya tenemos los dos bloques básicos para nuestra macro:
- la estructura del módulo básico de la macro VBA de un reemplazo;
- el listado de reemplazos necesarios para convertir una memoria de traducción TMX.
Ahora puedes llegar a la conclusión de que se trata solo de repetir este módulo tantas veces como comodines haya en dicho listado.
Pues bien la macro completa que convertirá una memoria TMX abierta en Word es la siguiente:
Sub MacroVBA_TMX_a_Tabla() 'Declaración de variables y constantes Dim CadenaBuscar As String, CadenaBuscarReemplazarPor As String Const cadenaTemporal As String = "¡Gonduana!" ' No actualizar pantalla de Word (hasta el final) Application.ScreenUpdating = False '1.er reemplazo CadenaBuscar = "(*\<body\>^13)(*)( {1;}\</body\>^13\</tmx\>)" CadenaBuscarReemplazarPor = "\2" Call ReemplazarConComodines(CadenaBuscar, CadenaBuscarReemplazarPor) '2.º reemplazo CadenaBuscar = " {1;}\<tu creationdate*\>^13" CadenaBuscarReemplazarPor = "" Call ReemplazarConComodines(CadenaBuscar, CadenaBuscarReemplazarPor) '3.er reemplazo CadenaBuscar = " {1;}\<prop*/prop\>^13" CadenaBuscarReemplazarPor = "" Call ReemplazarConComodines(CadenaBuscar, CadenaBuscarReemplazarPor) '4.º reemplazo (temporal) 'Cambiar las tabulaciones que haya por la cadena temporal «¡Gonduana!», o la cadena que quieras CadenaBuscar = "^t" CadenaBuscarReemplazarPor = cadenaTemporal Call ReemplazarConComodines(CadenaBuscar, CadenaBuscarReemplazarPor) '4.º reemplazo 'Reemplazar comodines CadenaBuscar = "( {1;}\<tuv xml:lang=\""??-??\""\>^13 {1;}\<seg\>)(*)(\</seg\>^13 {1;}\</tuv\>^13 {1;}\<tuv xml:lang=\""??-??\""\>^13 {1;}\<seg\>)(*)(\</seg\>^13 {1;}\</tuv\>^13 {1;}\</tu\>)" CadenaBuscarReemplazarPor = "\2^t\4" Call ReemplazarConComodines(CadenaBuscar, CadenaBuscarReemplazarPor) '5.º reemplazo CadenaBuscar = "\<?pt i*\>" CadenaBuscarReemplazarPor = "" Call ReemplazarConComodines(CadenaBuscar, CadenaBuscarReemplazarPor) '6.º reemplazo CadenaBuscar = "\<ph */\>" CadenaBuscarReemplazarPor = "" Call ReemplazarConComodines(CadenaBuscar, CadenaBuscarReemplazarPor) '6.º deshacer reemplazo temporal 'Cambiar «Gonduana» por una tabulación CadenaBuscar = cadenaTemporal CadenaBuscarReemplazarPor = "^t" Call ReemplazarConComodines(CadenaBuscar, CadenaBuscarReemplazarPor) 'Actualizar la pantalla de Word Application.ScreenUpdating = True MsgBox "Se ha terminado el proceso de reemplazo", vbOKOnly + vbInformation, "Proceso de reemplazo en Word" End Sub 'Procedimiento para reemplazar las cadenas CadenaBuscar por CadenaBuscarReemplazarPor Private Sub ReemplazarConComodines(CadenaBuscar As String, CadenaBuscarReemplazarPor As String) 'Primero, poner el cursor al principio del documento Word Selection.HomeKey Unit:=wdStory 'Reemplazar con comodines Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = CadenaBuscar .Replacement.Text = CadenaBuscarReemplazarPor .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll End Sub
Puedes copiar esta macro VBA y pegarla en Microsoft Word como se explica más abajo, y probarla en la memoria TMX de ejemplo o directamente en tu memoria.
Explicación de la macro VBA en Word
Con esto, se habría conseguido el objetivo del artículo: tener la macro que convierte una memoria TMX en una sencilla tabla de un modo desatendido.
Ahora bien, si te pica la curiosidad, te preguntarás qué hace todo ese código.
Sigue leyendo, porque la respuesta la tendrás en las siguientes líneas:
- La línea 1 es el nombre del subprocedimiento, en este caso MacroVBA_TMX_a_Tabla (puedes cambiar este nombre si te apetece a lo que quieras). Será el nombre de la macro que habrá que ejecutar desde Microsoft Word con la TMX abierta.
Muy importante: te recuerdo que en función de tu configuración regional de tu sistema operativo Windows, es posible que tu separador de listas no sea mi punto y coma ;, sino la coma ,, por lo que es posible que tengas que cambiar esto en tu macro. - La líneas 2 de color verde es un comentario. Fíjate que los comentarios tienen un apostrofo al principio, y sirven solo para documentar para ti o para otros lo que hacen las siguientes líneas de código.
- Las líneas 3 y 4 declaran unas variables que vamos a necesitar (CadenaBuscar y CadenaBuscarReemplazarPor) y define una constante (cadenaTemporal, que también puedes cambiar con tal de que estés seguro al 100% de que no existe en la memoria TMX)
- La línea 7 (Application.ScreenUpdating = False) hace que no se actualice la pantalla de Word con los reemplazos que se vayan haciendo. El motivo de esta línea es acelerar la ejecución de la macro. Casi al final del código, en la línea 53, se activa la actualización de la pantalla de Word (para que veas los cambios implementados).
- En la línea 9 se da un valor a la cadena de búsqueda CadenaBuscar del primer reemplazo. Puedes ver que es el primer comodín de búsqueda del listado que te puedes descargar.
- En la línea 10 se da un valor a la cadena de reemplazo CadenaBuscarReemplazarPor, también del primer reemplazo. Puedes ver que es el comodín de reemplazo del listado que te puedes descargar.
- La línea 11 llama a otro subprocedimiento, llamado ReemplazarConComodines, que realiza de verdad el reemplazo.
- Las líneas 14 a 16 hacen lo propio con el 2.º reemplazo.
- Las líneas 19 a 21 hacen lo propio con el 3.er reemplazo.
- Las líneas 25 a 27 hacen un reemplazo temporal: reemplaza las tabulaciones que tiene el documento por una cadena temporal, la definida en la línea 4. En las líneas 48 a 50 desharemos este cambio temporal.
- Las líneas 31 a 33 hacen lo propio con el 4.º reemplazo. Aquí, curiosamente, hemos tenido que duplicar cada comilla " del comodín de búsqueda para poderlo usarla en VBA. Como ves, es un comodín largo, largo… Por supuesto, no me saco de la manga esta monstruosidad de comodín. Si quieres ver cómo se ha diseñado este comodín, deberás leerte los artículos anteriores (los enlaces están al principio del artículo).
- Las líneas 36 a 38 hacen lo propio con el 5.º reemplazo.
- Las líneas 41 a 43 hacen lo propio con el 6.º reemplazo. Si has seguido los artículos que preceden a este, verás que entonces solo había 5 reemplazos. Ha habido que incluir este sexto reemplazo para que Word borre los elementos <ph> (abreviatura de la palabra inglesa placehorder).
- Las líneas 48 a 50 deshacen el cambio temporal de las tabulaciones.
- La línea 53 permite que la pantalla de Word actualice el contenido (ya se comentó que la línea 7 desactivó la actualización para que la macro se ejecutara más rápidamente).
- La línea 55 emplea la función MsgBox para mostrar un cuadro informativo de que se ha terminado con todos los reemplazos.
- Las líneas 60 a 80 son el subprocedimiento llamado ReemplazarConComodines, que realiza el reemplazo. Si no he contado mal, se llama un total de 8 veces a este subprocedimiento: 6 para los comodines, 1 vez más para el cambio temporal de tabulaciones y 1 más para deshacer este último cambio. Básicamente es el bloque básico comentado al principio del artículo, excepto que se ha añadido la línea 63 para que Word sitúe el cursor al principio del documento (arriba a la izquierda) antes de realizar el reemplazo. Este era un requisito de estos comodines, si no, es posible que no funcionen los reemplazos como queremos (ya lo vimos en los artículos anteriores).
Abrir la memoria TMX en Word
Con la macro ya diseñada, tenemos que abrir en Word la memoria TMX de una manera que nos convenga. Te comento la forma que uso, aunque no sé si es la mejor:
- Abres el archivo TMX con el Bloc de notas.
- Seleccionas todo el contenido (CTRL+E) y lo copias (CTRL+C).
- Cambias a Word, y ahí pegas el contenido del portapapeles (CTRL+V).
Si lo has hecho así, verás tu documento de Word con el contenido mostrado arriba.
Si ves que falta información, es que lo has abierto de otra manera, y Word reconoce automáticamente el formato de archivo como un XML y te lo presenta algo más limpio. Si es así, da marcha atrás y sigue mi procedimiento, por favor.
Un detalle técnico: Microsoft Word tiene un límite para los documentos que puede abrir. En concreto, el mayor archivo de solo texto que puede abrir es de 32 MB. Es una cifra muy pequeña, es verdad, pero basta para poder abrir una memoria con un par de cientos miles de unidades de traducción. Este es el límite de la memoria TMX que puedes convertir con el procedimiento indicado en este artículo.
Por si acaso te lo preguntas: sí, todos hemos visto documentos de Word mucho mayores que estos 32 MB, pero Word los puede abrir porque tienen poco texto, aunque gráficos muy grandes. Aun así, el máximo tamaño absoluto es de 512 MB.
Si intentas abrir un documento demasiado grande por uno u otro motivo, recibirás un mensaje de error de Word de este estilo:
Insertar la macro en un documento de Word
Para añadir la macro VBA al documento recién creado, abre el Editor de Visual Basic para Aplicaciones; para ello, selecciona la ficha Programador y pulsar el botón Visual Basic (o bien emplea el atajo de teclado ALT+F11 ). Ya en el Editor, crea un nuevo módulo:
y ahí pegas el texto anterior (en la figura, solo es un ejemplo de código VBA):
Vuelve a Word y usa el atajo ALT+F8 para abrir el cuadro de diálogo Macros y así poder ejecutar la macro que hemos llamado MacroVBA_TMX_a_Tabla.
Conclusiones de la macro VBA para convertir una memoria TMX en una tabla
Hemos conseguido una macro escrita en VBA que puedes aprovechar para ejecutarla dentro de Microsoft Word.
Es la forma más rápida de conseguir la tabla a partir del archivo TMX.
¿Cómo de rápido?
En memorias pequeñas, la macro se ejecuta de forma instantánea; en una memoria más grade de 50.000 unidades puede tardar algo de 15 minutos. Lo que tarde en sí da un poco igual, porque se prepara enseguida, y se deja ejecutándose sin problemas.
Recuerda que normalmente:
Una macro se diseña una vez
y se ejecuta muchas veces.
Nada más, espero que hayas disfrutado como yo en este recorrido de expresiones regulares y comodines.
¿Hemos terminado con los comodines y las expresiones regulares?
Algo muy dentro de mí dice que no…
🙂