Foros del Web » Programación para mayores de 30 ;) » Programación General »

VB y Archivos word

Estas en el tema de VB y Archivos word en el foro de Programación General en Foros del Web. Hola a todos, casi nunca ando por estos lados posteando pero si revisando los msg. Pero ahora me tengo un proyecto y me he topado ...
  #1 (permalink)  
Antiguo 30/12/2002, 07:05
Avatar de Phobos  
Fecha de Ingreso: abril-2001
Ubicación: sentado frente a un pc prestado
Mensajes: 375
Antigüedad: 23 años
Puntos: 2
VB y Archivos word

Hola a todos, casi nunca ando por estos lados posteando pero si revisando los msg.

Pero ahora me tengo un proyecto y me he topado con un muro que no logro decifrar...

Les explico.

Mi aplicacion de vb debe crear documentos word en base a una plantilla. Algunos campos de una bd debo colocarlos en el documento word y ademas el usuario puede editar el nuevo documento a antojo.

Estoy super desorientado, no se como abordarlo aun. he buscado y he encontrado por ahi algo para insertar mis campos en el doc pero no he encontrado nada para editarlo desde vb.
A recuerden que lo que hay que editar es el doc creado en base a la plantilla.

ok.
Saludos
y Feliz Año Nuevo,.

Chao.
  #2 (permalink)  
Antiguo 30/12/2002, 12:30
 
Fecha de Ingreso: marzo-2002
Mensajes: 449
Antigüedad: 22 años, 1 mes
Puntos: 0
Antes de Word 97 existia el componente WordBasic y apartir de este se remplazo por VBA (Visual Basic for Applications).

Con WordBasic puedes crear un objeto con
****************************************
dim DocWord as Object
set DocWord=createObject("Word.Basic")

*************************************
Con este podias hacer algo como esto:

*************************************
Dim Libro As String 'para almacenar el título del libro
Dim r As Integer 'valor devuelto por MsgBox
Dim n As Integer

'Iniciar una copia de Word
Set DocWord = CreateObject("Word.Basic")
'Crear un nuevo documento vacío (equivale a FileNew)
DocWord.ArchivoNuevo
DocWord.Negrita 'equivale a Bold
DocWord.Insertar "Estimado Sr. " & "Fulano:"
'insertar equivale a Insert
DocWord.Insertar vbCrLf 'insertar retorno de carro
DocWord.Insertar vbTab 'sangrar el texto
DocWord.Insertar "La editorial RA-MA tiene el gusto de "
DocWord.Insertar "enviarle los títulos por Vd. solicitados "
DocWord.Insertar "del autor " & Text2.Text & "."
DocWord.Insertar vbCrLf
DocWord.Insertar vbTab 'sangrar el texto
DocWord.Insertar "Al mismo tiempo aprovechamos para "
DocWord.Insertar "adjuntarle el catálogo de nuestras "
DocWord.Insertar "publicaciones que podrá obtener en "
DocWord.Insertar "su librería habitual."
DocWord.Insertar vbCrLf

'Acceder a los registros de la base de datos
n = 1
While Not Adodc1.Recordset.EOF
'Para evitar que libro sea campo nulo (valor Null)
If Not IsNull(Adodc1.Recordset.Fields("Título")) Then
Libro = Adodc1.Recordset.Fields("Título")
Else
Libro = " "
End If
'Si libro fuera Null el programa causaría un error
DocWord.Insertar Libro & vbCrLf
Adodc1.Recordset.MoveNext
DoEvents 'ejecutar mensajes de otras aplicaciones
n = n + 1
Wend
Adodc1.Recordset.MoveFirst
DocWord.ArchivoImprimirPredeter 'lanzar la tarea de impresión
Form1.SetFocus 'volver al formulario antes de MsgBox
r = MsgBox("¿Desea ver el documento?", vbYesNo, "Atención:")
If r = vbYes Then
AppActivate "Microsoft Word"
Else
DocWord.ArchivoCerrar 2 'cerrar sin guardar (2)
Set DocWord = Nothing 'liberar los recursos
End If
***********************************************
  #3 (permalink)  
Antiguo 30/12/2002, 12:46
 
Fecha de Ingreso: marzo-2002
Mensajes: 449
Antigüedad: 22 años, 1 mes
Puntos: 0
Para editar una plantilla se debe marcar lo que se va a modificar como marcadores de word.
En el siguiente ejemplo el vector DatoVariable contiene los datos que se van a remplazar y son objetidos apartir de una base de datos un otro medio.

*********************************
Private Sub ImprimirCarta_Click()
Dim DatoVariable(1 To 3) As String, fNombre As String
Dim x As Integer 'variable auxiliar
Dim marcadores As Integer ' número de marcadores en el documento

Label3.Visible = True 'visualizar etiqueta "Generando cartas..."
Screen.MousePointer = vbHourglass 'reloj de arena
'Obtener la fecha
DatoVariable(3) = Format(Now, "d-mmmm-yyyy")
'Nombre del documento
fNombre = InputBox("Nombre del documento:", , "carta.doc")
If fNombre = "" Then GoTo Salir
marcadores = InputBox("Nro. de marcadores en el documento:", , 1)
If marcadores <= 0 Then GoTo Salir
'Iniciar una copia de Word
Set DocWord = CreateObject("Word.Basic")

'Acceder a los registros de la base de datos
While Not Adodc1.Recordset.EOF
'Si algún campo fuera Null el programa causaría un error
If Not IsNull(Adodc1.Recordset.Fields("Nombre")) Then
DatoVariable(1) = Adodc1.Recordset.Fields("Nombre")
Else
DatoVariable(1) = " "
End If
If Not IsNull(Adodc1.Recordset.Fields("Dirección")) Then
DatoVariable(2) = Adodc1.Recordset.Fields("Dirección")
Else
DatoVariable(2) = " "
End If
'Llamar al procedimiento que escribe la carta
Documento DatoVariable(), marcadores, fNombre
Adodc1.Recordset.MoveNext
DoEvents 'ejecutar mensajes de otras aplicaciones
Wend
Adodc1.Recordset.MoveFirst
Salir:
Label3.Visible = False 'ocultar la etiqueta "Generando cartas..."
Form1.SetFocus 'volver al formulario antes del MsgBox
Screen.MousePointer = vbDefault 'restaurar ratón
End Sub

*****************************************
El procedimiento que hace el remplazo el Documento y recibe como parametro el vector, el numero de marcadores en el documento y el nombre del archivo.

Private Sub Documento(DatoVar() As String, marc As Integer, fNom As String)
Dim x As Integer 'variable auxiliar

'Abrir el documento fNom que suponemos en el directorio de app
DocWord.ArchivoAbrir App.Path & "\" & fNom, 0, 1
'Insertar los datos variables en el documento
For x = 1 To marc
'Los marcadores se han nombrado M01 y M02
DocWord.EdiciónMarcador "M" & Format(x, "00"), 0, 0, 0, 1
DocWord.Insertar DatoVar(x)
Next x
DocWord.ArchivoImprimirPredeter 'lanzar la tarea de impresión
DoEvents 'ejecutar mensajes de otras aplicaciones
DocWord.ArchivoCerrar 2 'cerrar el documento sin guardarlo
End Sub

**********************************************

y al salir para guardarlo

Private Sub Salir_Click()
On Error Resume Next 'por ya estuviera cerrado el documento
DocWord.ArchivoCerrar 0 'pregunta al usuario si desea guardarlo
If Not (DocWord Is Nothing) Then Set DocWord = Nothing
End
End Sub
  #4 (permalink)  
Antiguo 30/12/2002, 12:58
 
Fecha de Ingreso: marzo-2002
Mensajes: 449
Antigüedad: 22 años, 1 mes
Puntos: 0
Bueno cabe decirte que el ejemplo que te menciono no lo he probado y no se si los nombres de los metodos del componento aparecen en español o en ingles.
Se dice que se recomiendo usar VBA puesto que WordBasic hace uno de 900 sentencias (dificultado aprenderselas todas) y en cambio VBA hace uso de una jerarquia de objetos en donde se divide de forma mas sencilla a los metodos y propiedades.

Para usar VBA es necesario especificar esta en las referencias y tambien Microsoft Word Object Library.
El mismo ejemplo y que si funciona , hecho con VBA seria:
******************************************

Option Explicit
Private DocWord As Word.Application ' aplicación Word

Private Sub Form_Load()
Label3.Visible = False 'ocultar la etiqueta "Generando cartas..."
End Sub

Private Sub ImprimirCarta_Click()
Dim DatoVariable(1 To 3) As String, fNombre As String
Dim x As Integer 'variable auxiliar
Dim marcadores As Integer 'número de marcadores en el documento

Label3.Visible = True 'visualizar etiqueta "Generando cartas..."
Screen.MousePointer = vbHourglass 'reloj de arena
'Obtener la fecha
DatoVariable(3) = Format(Now, "d-mmmm-yyyy")
'Nombre del documento
fNombre = InputBox("Nombre del documento:", , "carta.doc")
If fNombre = "" Then GoTo Salir
marcadores = InputBox("Nro. de marcadores en el documento:", , 1)
If marcadores <= 0 Then GoTo Salir

'Iniciar una copia de Word
Set DocWord = New Word.Application
DocWord.Application.Visible = True

'Acceder a los registros de la base de datos
While Not Adodc1.Recordset.EOF
'Si algún campo fuera Null el programa causaría un error
If Not IsNull(Adodc1.Recordset.Fields("Nombre")) Then
DatoVariable(1) = Adodc1.Recordset.Fields("Nombre")
Else
DatoVariable(1) = " "
End If
If Not IsNull(Adodc1.Recordset.Fields("Dirección")) Then
DatoVariable(2) = Adodc1.Recordset.Fields("Dirección")
Else
DatoVariable(2) = " "
End If
'Llamar al procedimiento que escribe la carta
Documento DatoVariable(), marcadores, fNombre
Adodc1.Recordset.MoveNext
DoEvents 'ejecutar mensajes de otras aplicaciones
Wend
Adodc1.Recordset.MoveFirst
Salir:
Label3.Visible = False 'ocultar la etiqueta "Generando cartas..."
Form1.SetFocus 'volver al formulario antes del MsgBox
Screen.MousePointer = vbDefault 'restaurar ratón
End Sub

Private Sub Documento(DatoVar() As String, marc As Integer, fNom As String)
Dim x As Integer, mar As String 'variables auxiliares

'Abrir el documento fNom que suponemos en el directorio de app
DocWord.Documents.Open App.Path & "\" & fNom
'Insertar los datos variables en el documento
For x = 1 To marc
'Los marcadores se han nombrado M01 y M02
mar = "M" & Format(x, "00")
DocWord.ActiveDocument.Bookmarks(mar).Select
DocWord.Selection.InsertAfter DatoVar(x)
Next x
DocWord.ActiveDocument.PrintOut 'lanzar la tarea de impresión
DoEvents 'ejecutar mensajes de otras aplicaciones
'Cerrar el documento sin guardarlo
DocWord.ActiveDocument.Close wdDoNotSaveChanges
End Sub

Private Sub Salir_Click()
On Error Resume Next 'por ya estuviera cerrado el documento
'Pregunta al usuario si desea guardar los cambios
DocWord.ActiveDocument.Close wdPromptToSaveChanges
DocWord.Quit
If Not (DocWord Is Nothing) Then Set DocWord = Nothing
End
End Sub

**************************************

Si te interesa puedo pasarte los archivos de los ejemplos mandame un correo.
  #5 (permalink)  
Antiguo 31/12/2002, 06:23
Avatar de Phobos  
Fecha de Ingreso: abril-2001
Ubicación: sentado frente a un pc prestado
Mensajes: 375
Antigüedad: 23 años
Puntos: 2
ok, gracias, lo voy a probar y te cuento.

pero muchas gracias nuevamente.


Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:44.