Habría que crear un nuevo módulo de clase (no un módulo normal) en Insertar->Módulo de clase; yo le he llamado clsContratro. Luego pegas el siguiente código: Option Compare Database Option Explicit Public Nombredoc As String, Guardar As Boolean, stPath As String, stPlantilla As String Public Campos As Variant Dim stSQL As String Dim appWd As Word.Application Dim WordDoc As Word.Document Public Sub Nuevo() Dim template As String, mipath As String, i As Integer mipath = stPath & Nombredoc & ".doc" template = stPlantilla On Error Resume Next 'Vemos si word está abierto Set appWd = GetObject(, "Word.Application.8") If Err.Number <> 0 Then 'Word no esta abierto Err.Clear ' borramos el error. 'Creamos una nueva instancia de Word Set appWd = CreateObject("Word.Application.8") 'Creamos una instancia de Word Else appWd.Activate End If On Error GoTo Err_Nuevo With appWd 'Seleccionamos la plantilla .Documents.Add template:=Chr(34) & template & Chr(34) Dim marca As Bookmark i = 0 'Recorremos los Campos For Each marca In .ActiveDocument.Bookmarks marca.select 'Asignamos el valor del campo correspondiente que tenemos en la matriz "Campos" .Selection.InsertAfter Nz(Campos(i, 0)) i = i + 1 Next If Guardar = True Then .ActiveDocument.SaveAs mipath End If .Visible = True .WindowState = wdWindowStateMaximize End With Exit_Nuevo: Exit Sub Err_Nuevo: If Err.Number = 5941 Then appWd.Quit GoTo Exit_Nuevo Else appWd.Quit GoTo Exit_Nuevo End If End Sub Public Property Get TextoSQL() As String TextoSQL = stSQL End Property Public Property Let TextoSQL(ByVal stNewValue As String) stSQL = stNewValue Dim rst As Recordset 'Abrimos un recordset con la sentencia SQL Set rst = CurrentDb.OpenRecordset(stSQL, dbOpenSnapshot) With rst ' Pasamos el recordset a una matriz llamada "Campos" Campos = .GetRows(1) .Close End With Set rst = Nothing End Property Ahora, queda llamarlo desde un formulario. Podría ser así: Private Sub Comando0_Click() 'Dimensionamos una nueva instancia de la clase Dim Contrato As New ClsContrato, misql As String ' Hacemos el Select poniendo los campos en el mismo orden que estén los marcadores ' en la plantilla de word. Si un campo se repite en la plantilla, también lo debemos repetir en el Select. ' Lo más sencillo es usar el generador de consultas y ' luego copiar el texto SQL. ' Debemos añadir una clausula Where que restrinja los datos a un solo registro misql = "SELECT Contratos_contrato.PrefijoCCC, Contratos_contrato.CCC, Contratos_contrato.SufijoCCC, 'FULANITO DE TAL' AS Gerente, Contratos_contrato.Nombre_Trabajador, Contratos_contrato.Numero_afiliación_Seg, Contratos_contrato.Nivel_de_Estudi, Contratos_contrato.Fecha_Nacimiento, Contratos_contrato.DNI_Traba, Contratos_contrato.Dirección, Contratos_contrato.Denominación, Contratos_contrato.Número_Curso_FPO, Contratos_contrato.Importe_pesetas_hora, Contratos_contrato.inicio, Contratos_contrato.Periodo_maximo_de_duracion, [gerente] AS Gerente2, Contratos_contrato.Nombre_Trabajador AS Firma, Contratos_contrato.[Horas lectivas] FROM Contratos_contrato " misql = misql & "WHERE (((Contratos_contrato.id_contrato)=" & Me.id_contrato & "));" With Contrato 'indicamos el txto SQL del que obtenemos los campos .TextoSQL = misql 'indicamos el nombre con el que se guardará el documento .Nombredoc = "Pruebas word" ' .. y la ruta .stPath = "P:\XXX\pid\access\Formación\ContratosW\" '... y la plantilla que vamos a usar .stPlantilla = "P:\XXX\pid\access\Formación\ContratosW\pruebas word.dot" ' Le decimos que guarde el documento que se genera (usará el nombre que hemos dado antes) .Guardar = True ' Y lo ponemos en marcha .Nuevo End With ' Destruimos la clase Set Contrato = Nothing End Sub -- Saludos.