** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Error 5941
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoError 5941

 Responder Responder
Autor
Mensaje Invertir el orden de clasificación
dokk Ver desplegable
Habitual
Habitual


Unido: 15/Mayo/2020
Localización: Hendaye
Estado: Sin conexión
Puntos: 166
Enlace directo a este mensaje Tema: Error 5941
    Enviado: 19/Mayo/2020 a las 13:40
No sé qué estaría haciendo mal con el documento de Word. Os recuerdo que algunos campos me los completaba y otros no. Pues bien, he convertido el documento en plantilla, he puesto el add en lugar del open y voilà! Ha funcionado a la primera. Sin cambiar los nombres de los marcadores ni nada. Simplemente he comprobado que seguían existiendo en el ".dot" al guardarlo como tal.

El código ha quedado así tras añadirle que guarde el documento en la carpeta adecuada. Me queda hacer la comprobación de elementos nulos y los correspondientes avisos. Pero queda funcionando.

Gracias por todo

Function fillWordForm()
    On Error GoTo Error_fillWordForm
    Dim appWord As Word.Application
    Dim doc As Word.Document
    Dim strSQL, path, Fecha As String
    Dim mibase As Database
    Dim TabRutas As Recordset
    Dim I As Integer
    
    Set mibase = CurrentDb
    strSQL = "SELECT * FROM Rutas WHERE Documento='" & EtiquetaRuta.Caption & "';"
    Set TabRutas = mibase.OpenRecordset(strSQL)
    TabRutas.MoveFirst
    path = TabRutas!Ruta
    Set appWord = CreateObject("Word.Application")
    If Err.Number <> 0 Then
        Set appWord = New Word.Application
        appWord.Visible = True
    End If
    Set doc = appWord.Documents.Add(path, , False)
    With doc
        .FormFields("ContratoConfProv").Result = Me.ContratoConfProv
        .FormFields("FechaContrato").Result = Format(Date, "dd \de mmmm \de yyyy")
        .FormFields("RazonSocialProv").Result = Me.RazonSocialProv
        .FormFields("RazonSocialProv1").Result = Me.RazonSocialProv
        .FormFields("NomProv").Result = Me.NomProv
        For I = 1 To 21
            .FormFields("NomProv" & I).Result = Me.NomProv
        Next I
        .FormFields("NIFProv").Result = Me.NIFProv
        If Me.Dir2Prov = "" Then
            .FormFields("Dir1Prov").Result = Me.Dir1Prov
        Else
            .FormFields("Dir1Prov").Result = Me.Dir1Prov & ", " & Me.Dir2Prov
        End If
        .FormFields("CPProv").Result = Me.CPProv
        .FormFields("LocProv").Result = Me.LocProv
        .FormFields("ProvProv").Result = Me.ProvProv
        .FormFields("AutProv").Result = Me.AutProv
        .FormFields("AutProv1").Result = Me.AutProv
        .FormFields("CargoAutProv").Result = Me.CargoAutProv
        .FormFields("CargoAutProv1").Result = Me.CargoAutProv
        .FormFields("DNIAutProv").Result = Me.DNIAutProv
    End With
    
    strSQL = "SELECT * FROM Rutas WHERE Documento='" & EtiquetaRutaCarpeta.Caption & "';"
    Set TabRutas = mibase.OpenRecordset(strSQL)
    TabRutas.MoveFirst
    path = TabRutas!Ruta

    
    doc.SaveAs2 TabRutas!Ruta & Me.ContratoConfProv & " Acuerdo Confidencialidad " & Me.NomProv & "-" & "EKIONA.doc"
    appWord.Visible = True
    appWord.Activate
    
    Set doc = Nothing
    Set appWord = Nothing
    
Salir_fillWordForm:
    mibase.Close
    Exit Function
Error_fillWordForm:
    MsgBox Err.Description
    Resume Salir_fillWordForm
End Function
Albert Hostein
Aprendiendo cayendo
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 19/Mayo/2020 a las 13:28
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
dokk Ver desplegable
Habitual
Habitual


Unido: 15/Mayo/2020
Localización: Hendaye
Estado: Sin conexión
Puntos: 166
Enlace directo a este mensaje Enviado: 19/Mayo/2020 a las 10:36
Gracias, por todas las respuestas.

@prga - Sï. Algo debe pasar con los nombres y creo que tendrá que ver con lo que comenta Dabellaso. Gracias por el consejo de la fecha. Lo probaré

@01loko - Estoy intentando rellenar un Word desde Access.

@Dabellaso - Lo primero que haré es pasar a usar una plantilla, por que estaba usando un documento. Y después trataré de aplicar tus consejos, tras repasarlos bien.

Ya os diré. Que tengáis un buen día.

Albert Hostein
Aprendiendo cayendo
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 18/Mayo/2020 a las 16:53
Hace no demasiado hice cosas como esa, y la conclusión que saqué, es que dentro de cada campo existe un marcador.

descubrí que la mejor manera de modificar campos en Word era, determinar el tipo de control/campo que era, (primero saber si era un textbox o un checkbox) y en función de eso luego cambiar el marcador dentro de ese control/campo.

en su día me hice una función que de momento me funciona bien:
Private Sub ModificarCampoDeFormularioEnWord(ByRef DocumentoWord As Word.Document, _
                                            ByRef NombreMarcadorEnCampo As String, _
                                            ByRef NuevoValor As String)

    If DocumentoWord.FormFields.Item(NombreMarcadorEnCampo).type = wdFieldFormCheckBox Then
        
        DocumentoWord.FormFields.Item(NombreMarcadorEnCampo).CheckBox.Value = CBool(NuevoValor)
        
    ElseIf DocumentoWord.FormFields.Item(NombreMarcadorEnCampo).type = wdFieldFormTextInput Then
        
        DocumentoWord.FormFields.Item(NombreMarcadorEnCampo).Result = NuevoValor
        
    End If

End Sub

Espero que te ayude

Ed.

Puedes listar los campos para saber los que hay, y por otro lado los marcadores para ver que corresponde a que

Public Sub ListarMarcadoresDocumentoWord(ByRef DocumentoWord As Word.Document)
    
    Dim Marcadores As Word.Bookmarks
    Dim Marcador As Word.Bookmark

    Set Marcadores = DocumentoWord.Bookmarks
    For Each Marcador In Marcadores
    
        Debug.Print "Marcador: " & Marcador.Name
        
    Next Marcador

End Sub

Public Sub ListarCamposDeFormularioDocumentoWord(ByRef DocumentoWord As Word.Document)
    
    Dim Campos As Word.FormFields
    Dim Campo As Word.FormField
    
    Set Campos = DocumentoWord.FormFields
    For Each Campo In Campos
    
        Debug.Print "campo.Name: " & Campo.Name; "  Campo.Result: " & Campo.Result '& _
                    " Campo.Result.Text: " & Campo.Result.Text & _
                    " Campo.Type: " & Campo.Type & _
                    " Campo.Result.ID: " & Campo.Result.ID
    Next Campo

End Sub


Edito otra vez.
Recuerdo también, que la primera vez que se cambia un marcador (ya sea marcador sólo, o dentro de un campo), este desaparece. Por tanto, si estas intentando modificar un mismo marcador dos veces te dará ese error de que no existe. 
Deberás abrir la plantilla o el .doc cada vez que quieras modificar un marcador. (Mejor usar plantilla (.dot)  para que no se pierdan los marcadores al guardar

Es super importante que después te asegures de cerrar el documento para no tener cientos de instancias abiertas e invisibles (esto me paso a mi LOL). Si ocurre, podrás verlas y cerrarlas desde el administrador de tareas

creo que es esto último lo que te está ocurriendo, (que modificas el marcador de un campo, y luego intentas asignarle otro valor cuando resulta que el marcador desapareció tras el primer cambio, o bien que no usas una plantilla. y guardas el .doc después de haber modificado los marcadores, lo que guardaría el .doc sin marcadores de ahí en adelante)

Dejaré el código de arriba por si a alguien puede interesarle


Editado por Dabellaso - 18/Mayo/2020 a las 17:16
El saber no ocupa lugar, sólo tiempo
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 18/Mayo/2020 a las 13:09
Estas intentando rellenar un documento Word desde Access o estas en Word y quieres sacar los datos de Access?


Recordar de que soy nuevo y estoy aprendiendo.
Arriba
prga Ver desplegable
Moderador
Moderador


Unido: 16/Noviembre/2004
Localización: España
Estado: Sin conexión
Puntos: 3523
Enlace directo a este mensaje Enviado: 18/Mayo/2020 a las 10:33
Hola.
Casi seguro que o bien el nombre de algún campo/control del formulario o del nombre de alguno del documento word no existe o está mal escrito.
Por otra parte, si se pasa un "nulo" también dará error, es buena práctica utilizar Nz en los campos que puedan ser nulos.
Sin saber las peculiaridades del windows instalado, cabe la posibilidad de simplificar el código en la fecha con algo parecido a: Format(Date, "dd \de mmmm \de yyyy")

Prueba y ya comentas
Un saludo a todos
Arriba
dokk Ver desplegable
Habitual
Habitual


Unido: 15/Mayo/2020
Localización: Hendaye
Estado: Sin conexión
Puntos: 166
Enlace directo a este mensaje Enviado: 18/Mayo/2020 a las 08:21
Buenos días amigos:

A ver si alguien me puede echar una mano que me estoy volviendo loco.

Estoy intentando completar un documento de Word desde una base de datos Access. En la base de datos tengo los datos del cliente y en Word he creado un documento que tiene unos campos de texto que son los que quiero rellenar.

Lo que ocurre es que con unos campos funciona correctamente y en otros me da el error 5941 "El elemento del conjunto solicitado no existe". Salto el error, continua rellenado y en otro campo vuelve a dar el error.

He repasado los marcadores de los campos diez veces. Hasta he eliminado los campos y los he creado nuevamente.

La función que he usado es la de más abajo. A ver si alguien ve algo raro o sabe de algo que falle habitualemente. Gracias.

Function fillWordForm()
    'On Error GoTo Error_fillWordForm
    Dim appWord As Word.Application
    Dim doc As Word.Document
    Dim strSQL, path, Fecha As String
    Dim mibase As Database
    Dim TabRutas As Recordset
    Dim I As Integer
    
    Set mibase = CurrentDb
    strSQL = "SELECT * FROM Rutas WHERE Documento='" & EtiquetaRuta.Caption & "';"
    Set TabRutas = mibase.OpenRecordset(strSQL)
    TabRutas.MoveFirst
    path = TabRutas!Ruta
    Set appWord = CreateObject("Word.Application")
    If Err.Number <> 0 Then
        Set appWord = New Word.Application
        appWord.Visible = True
    End If
    Set doc = appWord.Documents.Open(path, , False)
    With doc
        .FormFields("ContratoConfProv").Result = Me.ContratoConfProv
        Fecha = Day(Date) & " de "
        Select Case Month(Date)
        Case 1
            Fecha = Fecha & "enero de " & Year(Date)
        Case 2
            Fecha = Fecha & "febrero de " & Year(Date)
        Case 3
            Fecha = Fecha & "marzo de " & Year(Date)
        Case 4
            Fecha = Fecha & "abril de " & Year(Date)
        Case 5
            Fecha = Fecha & "mayo de " & Year(Date)
        Case 6
            Fecha = Fecha & "junio de " & Year(Date)
        Case 7
            Fecha = Fecha & "julio de " & Year(Date)
        Case 8
            Fecha = Fecha & "agosto de " & Year(Date)
        Case 9
            Fecha = Fecha & "septiembre de " & Year(Date)
        Case 10
            Fecha = Fecha & "octubre de " & Year(Date)
        Case 11
            Fecha = Fecha & "noviembre de " & Year(Date)
        Case 12
            Fecha = Fecha & "diciembre de " & Year(Date)
        End Select
        
        .FormFields("FechaContrato").Result = Fecha
        .FormFields("RazonSocialProv").Result = Me.RazonSocialProv
        .FormFields("RazonSocialProv1").Result = Me.RazonSocialProv
        .FormFields("NomProv").Result = Me.NomProv
        For I = 1 To 21
            .FormFields("NomProv" & I).Result = Me.NomProv
        Next I
        .FormFields("NIFProv").Result = Me.NIFProv
        If Me.Dir2Prov = "" Then
            .FormFields("Dir1Prov").Result = Me.Dir1Prov
        Else
            .FormFields("Dir1Prov").Result = Me.Dir1Prov & ", " & Me.Dir2Prov
        End If
        .FormFields("CPProv").Result = Me.CPProv
        .FormFields("LocProv").Result = Me.LocProv
        .FormFields("ProvProv").Result = Me.ProvProv
        .FormFields("AutProv").Result = Me.AutProv
        .FormFields("AutProv1").Result = Me.AutProv
        .FormFields("CargoAutProv").Result = Me.CargoAutProv
        .FormFields("CargoAutProv1").Result = Me.CargoAutProv
        .FormFields("DNIAutProv").Result = Me.DNIAutProv
    End With
    appWord.Visible = True
    appWord.Activate
    
    Set doc = Nothing
    Set appWord = Nothing
    
Salir_fillWordForm:
    mibase.Close
    Exit Function
Error_fillWordForm:
    MsgBox Err.Description
    Resume Salir_fillWordForm
End Function
Albert Hostein
Aprendiendo cayendo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable