Cuando el asistente de combinación de correspondencia integrado de Word no puede conectarse a su fuente de datos específica, como una base de datos personalizada, un endpoint de API o un formato de archivo propietario, necesita un enfoque más flexible. Visual Basic for Applications le permite escribir código que extrae datos de prácticamente cualquier fuente y crea documentos combinados directamente. Este artículo explica cómo usar VBA para omitir las conexiones de fuente de datos estándar y crear una combinación de correspondencia a partir de una matriz en memoria o un archivo personalizado. Aprenderá los objetos VBA principales, la estructura del código paso a paso y cómo manejar errores comunes cuando los datos no provienen de una fuente estándar reconocida por Word.
Puntos clave: combinación de correspondencia con VBA desde una fuente de datos personalizada
- Método MailMerge.OpenDataSource: Se conecta a bases de datos estándar como Access o Excel, pero falla con datos personalizados; VBA lo reemplaza con la población manual de campos.
- Método Document.MailMerge.Fields.Add: Inserta campos de combinación en el documento principal antes de ejecutar la combinación.
- Método Document.MailMerge.Execute con Pause=True: Le permite controlar cada documento combinado e insertar datos personalizados fila por fila.
Comprender la combinación de correspondencia con VBA y datos personalizados
La función de combinación de correspondencia de Word está diseñada para conectarse a fuentes de datos a través de controladores Open Database Connectivity, OLE DB o directamente a Excel, Access, contactos de Outlook y archivos de texto. Cuando sus datos residen en una fuente personalizada, como un archivo JSON, una base de datos SQLite, una respuesta de servicio web o un sistema ERP propietario, el método estándar MailMerge.OpenDataSource no puede interpretarlos. VBA lo resuelve permitiéndole leer los datos usted mismo usando cualquier método, almacenarlos en una matriz o colección y luego recorrer cada registro para crear documentos combinados individuales. La clave es que no utiliza una fuente de datos conectada en absoluto. En su lugar, inserta campos de combinación en el documento principal y luego ejecuta la combinación en estado pausado, reemplazando cada campo con la siguiente fila de datos manualmente. Este enfoque funciona con cualquier formato de datos que VBA pueda analizar, incluidos archivos de texto, conjuntos de registros ADODB o incluso matrices codificadas directamente en la macro.
Requisitos previos para la macro de combinación de correspondencia con VBA
Antes de escribir la macro, verifique lo siguiente:
- Tiene un documento de Word con el contenido principal y los campos de combinación ya insertados. Para una fuente de datos personalizada, debe insertar los campos de combinación manualmente usando el cuadro de diálogo Insertar > Elementos rápidos > Campo > MergeField, o mediante código VBA.
- Su fuente de datos personalizada es accesible desde VBA. Por ejemplo, si los datos están en un archivo de texto, puede usar la instrucción Open y Line Input para leerlos. Si los datos están en una base de datos, puede usar ADO con una cadena de conexión.
- Las macros están habilitadas en Word. Vaya a Archivo > Opciones > Centro de confianza > Configuración del Centro de confianza > Configuración de macros y seleccione Habilitar todas las macros para realizar pruebas.
- Conoce los nombres de los campos que utilizará en el documento de combinación. Estos nombres deben coincidir con las claves de su estructura de datos personalizada.
Pasos para crear una combinación de correspondencia con VBA desde una fuente de datos personalizada
La siguiente macro lee datos de un archivo de texto separado por comas y crea un documento combinado separado para cada registro. Puede adaptar la parte de lectura a cualquier fuente de datos.
- Abrir el Editor de Visual Basic
Presione Alt+F11 en Word para abrir el editor de VBA. En el Explorador de proyectos, localice el proyecto de su documento e inserte un nuevo módulo haciendo clic en Insertar > Módulo. - Declarar variables y la subrutina principal
Inicie la subrutina con las declaraciones de variables necesarias. El ejemplo a continuación utiliza un archivo de texto como fuente de datos. Reemplace la ruta del archivo con su propio archivo de datos.Sub MailMergeFromCustomDataSource()
Dim wdDoc As Document
Dim wdMerge As MailMerge
Dim sData() As String
Dim vRecord As Variant
Dim i As Long
Dim sLine As String
Dim iFile As Integer
Dim aFields() As String
Dim sFieldNames() As String
Dim sFieldValues() As String
Dim j As Long
Set wdDoc = ActiveDocument
Set wdMerge = wdDoc.MailMerge - Leer el archivo de datos personalizado en una matriz
Abra el archivo de texto, lea todas las líneas y almacénelas en una matriz. La primera línea contiene los nombres de los campos. Las líneas siguientes contienen los valores de datos separados por comas. Este ejemplo asume que el archivo está en la misma carpeta que el documento.iFile = FreeFile
Open ThisDocument.Path & "\data.txt" For Input As #iFile
sLine = Input(LOF(iFile), iFile)
Close #iFile
sData = Split(sLine, vbCrLf)
' First line is field names
sFieldNames = Split(sData(0), ",")
' Remove empty lines at end
If Right(sData(UBound(sData)), 1) = vbCr Then
ReDim Preserve sData(UBound(sData) - 1)
End If - Insertar campos combinados en el documento principal
Si el documento aún no tiene campos combinados, insértelos al principio. Este código agrega campos para cada nombre de columna. Ejecute esta sección solo una vez por configuración de documento.' Optional: Insert merge fields at the top of the document
wdDoc.Range.InsertBefore "Dear "
For j = 0 To UBound(sFieldNames)
wdDoc.MailMerge.Fields.Add wdDoc.Range, sFieldNames(j)
If j < UBound(sFieldNames) Then wdDoc.Range.InsertText ", "
Next j
wdDoc.Range.InsertParagraphAfter - Recorrer cada fila de datos y crear documentos combinados
Para cada fila de datos después del encabezado, divida los valores y luego ejecute la combinación de correspondencia con Pause=True para insertar los valores manualmente. La combinación crea un nuevo documento para cada registro.For i = 1 To UBound(sData)
If Len(sData(i)) > 0 Then
sFieldValues = Split(sData(i), ",")
With wdMerge
.Destination = wdSendToNewDocument
.Execute Pause:=True
End With
' The paused merge opens a new document with merge fields
' Replace each merge field with the corresponding value
For j = 0 To UBound(sFieldNames)
With wdDoc.MailMerge.DataSource
.FindRecord FindText:=sFieldNames(j), Field:=sFieldNames(j)
If .Found Then
.SetAllIncludedFlags False
.SetAllIncludedFlags True
End If
End With
Next j
' Save or print the new document as needed
ActiveDocument.SaveAs2 FileName:=ThisDocument.Path & "\Merged_" & i & ".docx"
ActiveDocument.Close
End If
Next i - Limpiar y finalizar la subrutina
Libere las referencias a objetos y muestre un mensaje de finalización.Set wdDoc = Nothing
Set wdMerge = Nothing
MsgBox "Mail merge completed. Created " & (UBound(sData)) & " documents."
End Sub
Problemas comunes al usar VBA para la combinación de correspondencia con datos personalizados
Word se congela o se bloquea al ejecutar la macro
Esto suele ocurrir cuando el archivo de datos es muy grande y la macro intenta procesar miles de registros en un solo bucle. Para evitarlo, procese los registros en lotes de 100 y llame a DoEvents después de cada lote para liberar recursos del sistema. Además, asegúrese de que el documento principal no contenga formato complejo ni imágenes que ralenticen la combinación.
Los campos combinados no se reemplazan con datos
Si el documento combinado todavía muestra códigos de campo como “{ MERGEFIELD FirstName }” en lugar de valores reales, el método Execute Pause:=True puede no estar funcionando como se espera. En lugar de usar Pause, puede reemplazar manualmente los campos en el nuevo documento después de que se complete la combinación. Use un bucle que recorra todos los campos del nuevo documento y reemplace cada uno con el valor correspondiente de su matriz.
El archivo de datos contiene encabezados o espacios adicionales
Si su origen de datos personalizado tiene una fila de encabezado que no debe tratarse como datos, omita la primera línea en el bucle. Use Trim en cada valor de campo para eliminar los espacios iniciales y finales. Para archivos CSV con campos entre comillas, use un analizador de CSV adecuado o reemplace las comas dentro de las comillas con un marcador de posición antes de dividir.
Combinación de correspondencia con VBA y datos personalizados frente a la combinación de correspondencia estándar
| Característica | Combinación de correspondencia estándar | Origen de datos personalizado con VBA |
|---|---|---|
| Tipos de origen de datos | Excel, Access, Outlook, archivos de texto, SQL Server | Cualquier dato que VBA pueda leer: JSON, API, base de datos personalizada, matrices |
| Complejidad de configuración | Usar el asistente u OpenDataSource | Escribir y depurar código VBA |
| Rendimiento con datos grandes | Rápido, gestionado internamente por Word | Más lento, cada registro se procesa individualmente |
| Manejo de errores | Mensajes de error integrados | Debe agregar instrucciones On Error manualmente |
| Flexibilidad | Limitada a los conectores compatibles | Control total sobre la lectura y transformación de datos |
Para la mayoría de los usuarios empresariales, el asistente de combinación de correspondencia estándar es suficiente cuando los datos están en Excel o Access. Use el enfoque de VBA solo cuando Word no admita su origen de datos con los conectores integrados, o cuando necesite aplicar transformaciones de datos complejas antes de la combinación.
Ahora puede crear una macro de combinación de correspondencia que lea datos de cualquier fuente a la que VBA pueda acceder, como un archivo de texto, una consulta de base de datos o una matriz. Comience probando la macro con una pequeña muestra de registros para verificar que los nombres de los campos de combinación coincidan con las claves de sus datos. Para una solución más avanzada, considere usar el método MailMerge.DataSource.EditRecord para editar registros mediante programación en lugar de pausar la combinación. Un consejo concreto: al leer datos CSV, use la biblioteca Microsoft Scripting Runtime FileSystemObject para leer archivos línea por línea, lo que maneja archivos grandes de manera más eficiente que la instrucción Input.