none
Problema al abrir un documento de Word

    Question

  • Buenos días,

    La idea es esta:  Tengo un programa que abre una plantilla que tengo hecha en Word, rellena unos campos que le paso y luego lo guarda en una carpeta que le indico.

    El problema es que si ya se está ejecutando el Word, es decir, si hay un documento abierto, me salta el siguiente error:

    "Este archivo está en uso por otra aplicación u otro usuario. (C:\....\Normal.dot)"

    Si no hay ninguna instancia de word lo hace correctamente.  El proceso de abrir el documento de Word lo hago dos veces, es decir, primero abro una plantilla, la relleno y la cierro y luego abro otra, la relleno y la cierro.

    ¿Cómo puedo solucionar esto? Además, yo uso plantillas personalizadas, no Normal.dot.

    El código que utilizo es el siguiente, pongo lo mismo en dos métodos diferentes, cambiando el nombre de la plantilla, y luego los llamo uno despues del otro en un evento click de un botón:


    Dim oWord As New Microsoft.Office.Interop.Word.Application
    'Cargo la plantilla
    oWord.Documents.Open(Me.ruta & "\Plantilla.dot")
    'Guardo una copia de la plantilla con el nombre que le voy a dar al informe de Word
    oWord.ActiveDocument.SaveAs(Me.ruta & "\" & Me.nombre & ".doc")
    'Abro el documento, pero sin mostrarlo
    oWord.Documents.Open(Me.ruta & "\" & Me.nombre & ".doc", , , , , , , , , , , False, , , , )

    'Le paso los parámetros
    oWord.ActiveDocument.Variables.Add("parametro1", parametro1)
    oWord.ActiveDocument.Variables.Add("parametro2", parametro2)
    oWord.ActiveDocument.Variables.Add("parametro3", parametro3)

    'Actualizo el documento
    oWord.ActiveDocument.Select()
    oWord.Selection.Fields.Update()
    'Guardo el documento
    oWord.ActiveDocument.Save()

    oWord.ActiveDocument.Close()
    oWord.Quit()
    oWord = Nothing


    Muchas gracias de antemano por su ayuda.

    Un saludo,

    Thursday, October 09, 2008 9:53 AM

Answers

All replies

  •  

    Uso algo parecido y nunca me pasa. Pero lo uso junto con este control  dsoframer.ocx.

     

    Monday, October 27, 2008 7:08 AM
  • :-)

    Hola,

     

    Esto te sucede porque estás abriendo directamente la plantilla, lo cual es incorrecto. Si quieres crear nuevos documentos basados en una plantilla debes crearlos con el método Add():

     

    Dale una vistazo a:

    To create a new document based on a custom template:
    http://msdn.microsoft.com/en-us/library/hhf98b5c(VS.80).aspx

    Monday, October 27, 2008 8:33 AM
    Moderator
  • Buenos días,

    Antes de nada muchas gracias a los dos por contestar.  Respecto a la solución que daba Lluis, probé a cambiar el código y ponerlo con el método Add(), y algo hemos avanzado.  Ahora solo me da el error si llamo al método una vez despues de otra, si solo lo hago una vez me funciona bien.  Como ya comenté en la pregunta, lo que necesito es llamar a dos métodos idénticos pero en el que cambian las rutas y la plantilla.  Probé a llamar a los dos métodos solos, es decir sin ir uno detras de otro, y funcionan, pero cuando llamo a un método y despues al otro me sigue saltando el error.

    Más concretamente cambié la línea de:

    oWord.Documents.Open(Me.ruta & "\Plantilla.dot")

    por:

    oWord.Documents.Add(Template:=Me.ruta & "\Plantilla.dot")

    No sé si hay que cambiar algo más, pero si tienen alguna idea se lo agradezco mucho.

    Un saludo,
    Tuesday, October 28, 2008 11:05 AM
  • :-)

    ¿Puedes postear todo el código?

     

    Gracias,

    Tuesday, October 28, 2008 11:27 AM
    Moderator
  • Yo utilizo el siguiente código:
    Imports Microsoft.Office.Interop
    Imports Word = Microsoft.Office.Interop.Word


    Private Sub CrearDocumento()
            Try
                '=========DECLARACIONES WORD========CONTROL DE DIRECTORIOS======
                Dim sRutaDocPlantilla As String = Application.StartupPath & "\Documentos\Plantilla.dot" ' ruta para abrir el documento plantilla
                Dim sSalvaDoc As String 'ruta donde se guardará el documento creado
                AppWord = New Word.Application()

                AppWord.Documents.Open(sRutaDocPlantilla)
                ' nombre con el que se va a guardar
                sCarpeta = sRutaDocFinal & LbCarpeta.Text
                sSalvaDoc = sCarpeta & "\NombreDelDocumento
    .doc"
                AppWord.Visible = True
                '=======================MARCADORES==========================
    ' en este apartado lo que hago es ir a un marcador insertado en el documento e introducir el texto del textbox 'Numtextbox.text
                AppWord.Selection.GoTo(What:=Word.WdGoToItem.wdGoToBookmark, Name:="mNúmero")
                AppWord.Selection.TypeText(Text:=NumTextBox.Text)
               
                '==========GUARDAMOS DOCUMENTO===================
                Dim doc As Word.Document = AppWord.Documents.Open(sRutaDocPlantilla)
                doc.SaveAs(FileName:=sSalvaDoc)
                doc.Close()
                'Cerramos(Word)
                AppWord.Quit()
                ' Liberamos los recursos
                AppWord = Nothing
    'por si tienes errores, aquí le digo al código que me guarde en un archivo el error para posteriormente estudiar que sucede.
            Catch oExcep As Exception
                MsgBox("Descripción del error : " & _
                        oExcep.Message, MsgBoxStyle.Critical, "Error")
                Dim sRuta As String = "Se genera el error al crear el documento: Documento Libre.dot"
                Dim sError As String = "Error en procedimiento o diligencia: " & sRuta & oExcep.ToString & "Error"
                My.Computer.FileSystem.WriteAllText(Application.StartupPath & "\Proyecto2008\Directorios\ListErroresDetectados.txt", sError, True)
                AppWord.Quit()
                AppWord = Nothing

            End Try
        End Sub

    Wednesday, October 29, 2008 8:40 PM
  • Buenas tardes,

    Antes de nada muchas gracias por vuestras respuestas.

    Probé con tu código poliems, pero me pasa lo mismo que me pasaba a mi al principio.  Si ya tengo una instancia de word abierta, no funciona, me da el error de que intento modificar la plantilla normal.dot.  Eso lo solucione con la respuesta que me dió Lluis.  El problema ahora es que no puedo hacer lo mismo dos veces seguidas, porque me da el error.

    A petición de Lluis, pongo el código completo, a ver si así me podeis ayudar más.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
           ImprimirUno()
           ImprimirDos()
    End Sub


    Private Sub ImprimirUno()
    Dim oWord3 As New Microsoft.Office.Interop.Word.Application
    'Cargo la plantilla
    oWord3.Documents.Add(Template:=Me.ruta & "\Plantilla.dot")
    'Guardo una copia de la plantilla con el nombre que se le va a dar al informe de Word
    oWord3.ActiveDocument.SaveAs(Me.ruta & "\" & Me.id & ".doc")
    'Abro el documento
    oWord3.Documents.Open(Me.ruta & "\" & Me.id & ".doc", , , , , , , , , , , False, , , , )

    'Le paso los parámetros
    oWord3.ActiveDocument.Variables.Add("parametro1", parametro1)
    oWord3.ActiveDocument.Variables.Add("parametro2", parametro2)
    oWord3.ActiveDocument.Variables.Add("parametro3", parametro3)

    'Actualizo el documento
    oWord3.ActiveDocument.Select()
    oWord3.Selection.Fields.Update()
    'Guardo el documento
    oWord3.ActiveDocument.Save()

    oWord3.ActiveDocument.Close()
    oWord3.Quit()
    oWord3 = Nothing
    End Sub

    Private Sub ImprimirDos()
    Dim oWord As New Microsoft.Office.Interop.Word.Application
              'Cargo la plantilla
              oWord.Documents.Add(Template:=Me.ruta & "\Plantilla2.dot")
              'Guardo una copia de la plantilla con el nombre que se le va a dar al informe de Word
              oWord.ActiveDocument.SaveAs(Me.ruta & "\" & Me.id & "2.doc")
              'Abro el documento
              oWord.Documents.Open(Me.ruta & "\" & Me.id & "2.doc", , , , , , , , , , , False, , , , )

              'Le paso los parámetros
              oWord.ActiveDocument.Variables.Add("parametro1", parametro1)
              oWord.ActiveDocument.Variables.Add("parametro2", parametro2)
              oWord.ActiveDocument.Variables.Add("parametro3", parametro3)
             
              'Actualizo el documento
              oWord.ActiveDocument.Select()
              oWord.Selection.Fields.Update()
              'Guardo el documento
              oWord.ActiveDocument.Save()

              oWord.ActiveDocument.Close()
              oWord.Quit()
              oWord = Nothing
    End Sub


    Muchas gracias por vuestras respuestas.

    Un saludo,
    Thursday, October 30, 2008 4:49 PM
  • hola buen dia , no se si ando perdido pero tengo un problema parecido y quiero saber si me puden ayudar, mi problema es que cuando doy click en un boton  imprimir de mi formulario se abre una plantilla hasta esta parte va todo bien ,mi problema es que  yo tengo un listado de items y que por cada item de ese listado se cree un pagina con la misma plantilla que se abrio al hacer click en imprimir ,es algo como si yo quisiera abrir una plantilla dentro de la misma plantilla, ya he posteado  en varios foros pero la verdad no he encontrado respuestas , por favor ayuda.

    Sergio Fernandez Cruz Life Run's of Code

    Monday, October 22, 2012 10:08 PM