• Martes 23 de Abril de 2024, 20:12

Autor Tema:  Fallo en cerrar documento de Word desde VB6  (Leído 5029 veces)

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Fallo en cerrar documento de Word desde VB6
« en: Jueves 2 de Julio de 2009, 23:10 »
0
Hola a toda la comunidad de solocodigo...
Mi problema es el siguiente:

Estoy intentado copiar el contenido de unos archivos de texto (.txt) en unos documentos de word, los documentos son creados con el mismo nombre que los archivos de texto (solo cambian la extension a .doc)... Por ejemplo...
Si el archivo se llama Archivo.txt, se debe crear un documento de word con el mismo nombre pero de extensión .doc, es decir, debe crearse Archivo.doc con el contenido de Archivo.txt.

Para esto he creado una funcion y un subproceso (en un modulo), aqui se los coloco:

Esto es para leer el contenido de los archivos de texto:
Código: Visual Basic
  1. Public Function LeerTexto(ArchivoTXT As String) As String
  2.             If ArchivoTXT = "" Then Exit Function
  3.     Dim NroLibre As Integer
  4.     Dim Ruta As String
  5.     Dim Linea As String
  6.     Dim Texto As String
  7.     Ruta = App.Path & "" & ArchivoTXT
  8.     NroLibre = FreeFile
  9.    
  10.  
  11.     Open Ruta For Input As #NroLibre
  12.         While Not EOF(1)
  13.             Line Input #NroLibre, Linea
  14.             Texto = Texto & Linea & vbCrLf
  15.         Wend
  16.     Close #NroLibre
  17.  
  18. LeerTexto = Texto
  19.  
  20. End Function
  21.  

Esto es para crear el documento de word:
Código: Visual Basic
  1. Sub AgregarWord(Texto_A_Escribir As String, Nombre_ArchivoTXT As String)
  2.     If Nombre_ArchivoTXT = "" Then Exit Sub
  3.  
  4. Dim Texto As String
  5. Dim Nombre_Archivo As String 'este es el nombre del archivo sin la extensión.
  6. Texto = Texto_A_Escribir
  7.  
  8.     Dim Word As New Word.Application
  9.  
  10.     'AGREGA  DOCUMENTO
  11.     Word.Documents.Add
  12.    
  13.    
  14.         'AGREGA TEXTO
  15.         Word.Selection.Font.Color = wdColorBlack
  16.         Word.Selection.Font.Name = "Courier new"
  17.         Word.Selection.TypeText Texto
  18.         'AGREGA PARRAFO
  19.         Word.Selection.TypeParagraph
  20.  
  21.    
  22.     'SELECCIONA TEXTO
  23.     Word.Selection.WholeStory
  24.     Word.Selection.Font.Size = 10
  25.    
  26.      Nombre_Archivo = Left(Nombre_ArchivoTXT, Len(Nombre_ArchivoTXT) - 4)
  27.      
  28.      ActiveDocument.SaveAs FileName:=App.Path & "" & Nombre_Archivo & ".doc"
  29.    
  30.    
  31.     Set Word = Nothing
  32. End Sub
  33.  

Y en un boton command1 del formulario coloco lo siguiente:

Código: Visual Basic
  1. Private Sub Command1_Click()
  2. Dim Archivo As String
  3. Dim Texto As String
  4.  
  5.  
  6.  
  7. Archivo = Dir(App.Path & "*.txt")
  8.  
  9. While Archivo <> ""
  10.     Texto = LeerTexto(Archivo)
  11.     Call AgregarWord(Texto, Archivo)
  12.     Archivo = Dir
  13. Wend
  14.  
  15. MsgBox ("Finalizado")
  16.  
  17.  
  18. End Sub
  19.  
  20.  

El problema es que los archivos de Word creados no cierran del todo... me doy cuenta cuando abro el administrador ( CTRL + Alt + Sup) y encuentro en la lista la aplicacion de word (y esta abierta!!!)...
Miren la siguiente imagen y dense cuenta de los WINWORD que aun estan abiertos (en este ejemplo, solo cree tres documentos de word, por lo que solo aparecen 3 Winword en la imagen)


¿Como hago para que despues de ejecutar mi code esta aplicacion no este abierta?, que le falta a mi codigo?...
Saludos.


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Fallo en cerrar documento de Word desde VB6
« Respuesta #1 en: Jueves 2 de Julio de 2009, 23:14 »
0
Normal. Con Set Word = Nothing no cierras la aplicación, simplemente desreferencias el objeto. Tienes que hacer Word.Quit antes.

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Fallo en cerrar documento de Word desde VB6
« Respuesta #2 en: Jueves 2 de Julio de 2009, 23:27 »
0
Cita de: "m0skit0"
Normal. Con Set Word = Nothing no cierras la aplicación, simplemente desreferencias el objeto. Tienes que hacer Word.Quit antes.
Si hago eso, me aparece el siguiente error:

señalando la siguiente linea:
Código: Visual Basic
  1. ActiveDocument.SaveAs FileName:=App.Path & "" & Nombre_Archivo & ".doc"
  2.  


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Fallo en cerrar documento de Word desde VB6
« Respuesta #3 en: Viernes 3 de Julio de 2009, 09:53 »
0
Pues porque habrás hecho el Quit antes de salvar...

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Fallo en cerrar documento de Word desde VB6
« Respuesta #4 en: Viernes 3 de Julio de 2009, 18:40 »
0
El comando para cerrar word es:
Código: Text
  1. Word.Application.Quit 
  2.  
:comp:

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Fallo en cerrar documento de Word desde VB6
« Respuesta #5 en: Viernes 3 de Julio de 2009, 19:11 »
0
Cita de: "cpmario"
El comando para cerrar word es:
Código: Text
  1. Word.Application.Quit 
  2.  
:comp:
Eso ya lo habia pensado...
Cita de: "m0skit0"
Pues porque habrás hecho el Quit antes de salvar...
...
El error estaba en que no declare el objeto Word.Document, de esta forma:
Código: Visual Basic
  1. Set Doc = Word_.Documents.Add
  2. Doc.Activate
  3.  
Sino que lo agregue como :
Código: Visual Basic
  1.  'AGREGA  DOCUMENTO
  2.  Word.Documents.Add
  3.  

Esto ocasiona que al momento de cerrar, solo se cierra la aplicacion Word.apllication y no la Documents dando por resultado que la aplicacion Winword.exe quede abierta.

Conclusión:
Al momento de crear una instancia de Word siempre usar un objeto para word.application y otro para el Documents.


Aqui les dejo mi code ya corregido:
MODULO:
Código: Visual Basic
  1.  
  2. Public Word_ As Word.Application
  3. 'Objeto Word
  4.  
  5.  
  6.  
  7.  
  8. Sub AgregarWord(Texto_A_Escribir As String, Nombre_ArchivoTXT As String)
  9.     If Nombre_ArchivoTXT = "" Then Exit Sub
  10.  
  11. Dim Texto As String
  12. Dim Nombre_Archivo As String 'este es el nombre del archivo sin la extensión.
  13. Texto = Texto_A_Escribir
  14.  
  15.     Dim Doc As Word.Document
  16.    
  17.     'Iniciar word
  18.     Set Word_ = New Word.Application
  19.     Word_.Visible = True
  20.     'Iniciar documento
  21.     Set Doc = Word_.Documents.Add
  22.     Doc.Activate
  23.    
  24.  
  25.        
  26.         'AGREGA TEXTO
  27.         Word_.Selection.Font.Color = wdColorBlack
  28.         Word_.Selection.Font.Name = "Courier new"
  29.         Word_.Selection.TypeText Texto
  30.         'AGREGA PARRAFO
  31.         Word_.Selection.TypeParagraph
  32.         'Quitando seleccion
  33.         Word_.Selection.EndOf
  34.  
  35.    
  36.     'SELECCIONA TEXTO
  37.     On Error GoTo Adelante
  38.         Word.Selection.WholeStory
  39.         Word.Selection.Font.Size = 10
  40.         Word_.Selection.EndOf
  41. Adelante1:
  42.    
  43.      Nombre_Archivo = Left(Nombre_ArchivoTXT, Len(Nombre_ArchivoTXT) - 4)
  44.     Doc.SaveAs App.Path & "" & Nombre_Archivo & ".doc"
  45.      
  46.        
  47.         Word_.Quit True
  48.         Set Word_ = Nothing
  49.        
  50. Adelante:
  51.         If Err.Number = 462 Then
  52.             Resume Adelante1
  53.         End If
  54.        
  55. End Sub
  56.  
  57.  
  58. Public Function LeerTexto(ArchivoTXT As String) As String
  59.             If ArchivoTXT = "" Then Exit Function
  60.     Dim NroLibre As Integer
  61.     Dim Ruta As String
  62.     Dim Linea As String
  63.     Dim Texto As String
  64.     Ruta = App.Path & "" & ArchivoTXT
  65.     NroLibre = FreeFile
  66.    
  67.  
  68.     Open Ruta For Input As #NroLibre
  69.         While Not EOF(1)
  70.             Line Input #NroLibre, Linea
  71.             Texto = Texto & Linea & vbCrLf
  72.         Wend
  73.     Close #NroLibre
  74.  
  75. LeerTexto = Texto
  76.  
  77. End Function
  78.  
  79.  

EN EL FORM:
Código: Visual Basic
  1.  
  2. Private Sub Command1_Click()
  3.  
  4.  
  5. Dim Archivo As String
  6. Dim Texto As String
  7.  
  8. List1.ListIndex = 0
  9. Archivo = List1.Text
  10.  
  11. Do
  12. Archivo = List1.Text
  13.  
  14. Texto = LeerTexto(Archivo)
  15. Text1.Text = Texto
  16. Call AgregarWord(Texto, Archivo)
  17.  
  18.  
  19.  
  20. If List1.ListIndex + 1 >= List1.ListCount Then Exit Sub
  21. List1.ListIndex = List1.ListIndex + 1
  22. Loop Until List1.ListIndex = List1.ListCount
  23.  
  24.  
  25. MsgBox ("Finalizado")
  26.  
  27. End Sub
  28.  
  29. Private Sub Form_Load()
  30.  
  31. Dim Archivo As String
  32.  
  33.  
  34.  
  35.  
  36. Archivo = Dir(App.Path & "*.txt")
  37.  
  38. While Archivo <> ""
  39.     List1.AddItem Archivo
  40.     Archivo = Dir
  41. Wend
  42.  
  43.  
  44.  
  45.  
  46. End Sub
  47.  
  48.  

Saludos.

Nota:
Coloquen un listbox y un textbox multiline = true, scrollbars = vertical


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Fallo en cerrar documento de Word desde VB6
« Respuesta #6 en: Viernes 3 de Julio de 2009, 20:48 »
0
Un detalle jimbenit...

Cuando invocas una función, lo primero que se hace es reservar memoria para todas las variables definidas explícitamente... por tanto esto que haces:

Código: Visual Basic
  1.  
  2. Public Function LeerTexto(ArchivoTXT As String) As String
  3.             If ArchivoTXT = "" Then Exit Function
  4.     Dim NroLibre As Integer
  5.     Dim Ruta As String
  6.     Dim Linea As String
  7.     Dim Texto As String
  8.  
  9.       ...........
  10.  
  11.  
No evita que se reserve memoria. supongo que la razón por que pones la línea 'if...then ...exit..'' la 1ª es que crees que ahorras tiempo si primero se ejecuta esa línea y asó no 'pierde' tiempo en reservar memoria para variables que al final no se van a usar. Sin embargo esto no sucede así... Incluso aunque pongas al final de la función un 'dim x as byte' lo 1º será reservar memoria para las variables luego se procesa el resto, por tanto, ya que no se tiene control sobre esto, es preferible al menos ganar en claridad y orden...

Por tanto será más adecuado poner el código así, dado que el tiempo en procesarse y los recursos empleados son idénticos.:

Código: Visual Basic
  1.  
  2. Public Function LeerTexto(ArchivoTXT As String) As String
  3.     Dim NroLibre As Integer
  4.     Dim Ruta As String
  5.     Dim Linea As String
  6.     Dim Texto As String
  7.  
  8.     If ArchivoTXT = "" Then Exit Function
  9.     ..............
  10.  
  11.  
«Ma non troppo»
----> ModoVacaciones = False<----