Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

insertar tabla en documento word desde vba

Estas en el tema de insertar tabla en documento word desde vba en el foro de Visual Basic clásico en Foros del Web. Hola a todos. Soy nuevo en esto asi que si no estoy insertando esto en el lugar adecuado, espero que me perdonen. E indicarme si ...
  #1 (permalink)  
Antiguo 25/02/2008, 04:27
 
Fecha de Ingreso: febrero-2008
Mensajes: 37
Antigüedad: 16 años, 2 meses
Puntos: 0
insertar tabla en documento word desde vba

Hola a todos.

Soy nuevo en esto asi que si no estoy insertando esto en el lugar adecuado, espero que me perdonen. E indicarme si sois tan amable el sitio adecuado.


Mi problema es el siguiente:
Estoy desarrollando una aplicación en access 97, y desde la cual quiero insertar una tabla en un documento word. ¿Cómo se podría hacer esto desde código vba?.

Informaros que ya he intentado crear una plantilla de word, meter aquí el cuadro y rellenarlo de datos ya luego desde mi programa, pero no me vale ya que la tabla se debe de definir en tiempo de ejecución porque su tamaño depende del numero de registro que devuelve una consulta.
Y una cosa más, la clase range no la puedo usar, supongo que será porque estoy programando en vba y no en vb puro.


Muchas gracias a todos.
  #2 (permalink)  
Antiguo 25/02/2008, 05:08
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Re: insertar tabla en documento word desde vba

Hola también,

Empezaré por decirte que insertar una tabla en Word desde VB es muy lento (y más aún si quieres formatear las celdas). No sé tus necesidades, pero te aconsejo enviar la tabla a Excel que es mucho más rápido, y con menos código.

Si aún así quieres hacerlo en Word, te puedo poner un ejemplo si lo necesitas, pero en VB6.
  #3 (permalink)  
Antiguo 26/02/2008, 01:05
 
Fecha de Ingreso: febrero-2008
Mensajes: 37
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: insertar tabla en documento word desde vba

Muchas gracias por su ayuda.

Pon me el ejemplo del que me habla por si acaso puedo sacar de él, pero mi problema es que con vba me veo muy limitado ya que hay librerias con las que no cuento (ahora estaba viendo como referenciar librerias para usar las de vb6 en lugar de solo vba).



Un saludo
  #4 (permalink)  
Antiguo 26/02/2008, 02:54
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Re: insertar tabla en documento word desde vba

Bueno, ahí va el ejemplo. En este caso la conexión a la BD es mediante ADO, así que no olvides marcar esta referencia en el proyecto.

Código:
Private Sub Command1_Click()
    Dim oWord As Object
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim iCols As Integer, iFilas As Integer
    Dim i As Integer
    
    Set oWord = CreateObject("Word.Application")
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & App.Path & "\Prueba.mdb;Persist Security Info=False"
    With rs
        .CursorLocation = adUseClient
        ' abrimos el recordset con 5 campos de la tabla 
        .Open "SELECT Id, Codigo, Producto, Origen, Precio FROM Tabla1", cn, adOpenForwardOnly, adLockReadOnly
        iCols = .Fields.Count    ' nº columnas de la tabla = campos del recordset
        iFilas = .RecordCount    ' nº filas de la tabla = registros del recordset
    End With
    Screen.MousePointer = vbHourglass
    With oWord
        .Documents.Add
        ' configuramos la página
        .ActiveDocument.PageSetup.LeftMargin = 70
        .ActiveDocument.PageSetup.RightMargin = 70
        .ActiveDocument.PageSetup.TopMargin = 30
        .Selection.Font.Name = "Verdana"
        .Selection.Font.Size = 8
        Call .Application.ActiveDocument.Tables.Add(.Application.ActiveDocument.Range, iFilas, iCols)
         ' el encabezado en negrita
        For i = 1 To iCols
            .ActiveDocument.Tables(1).Cell(1, i).Select
            .Selection.Font.Bold = True
            .Application.ActiveDocument.Tables(1).Cell(1, i) = rs.Fields(i - 1).Name
        Next i
        ' repetir encabezado en todas las páginas
        .Selection.SelectRow
        .Selection.Rows.HeadingFormat = True
        iFilas = 1
        iCols = 0
        Do While rs.EOF = False
            iFilas = iFilas + 1
            .ActiveDocument.Tables(1).Cell(iFilas, iCols + 1).Select
            .ActiveDocument.Tables(1).Cell(iFilas, iCols + 1).WordWrap = True
            .ActiveDocument.Tables(1).Cell(iFilas, iCols + 1) = rs(0)
            .ActiveDocument.Tables(1).Cell(iFilas, iCols + 2) = IIf(IsNull(rs(1)), "", rs(1))
            .ActiveDocument.Tables(1).Cell(iFilas, iCols + 3) = IIf(IsNull(rs(2)), "", rs(2))
            .ActiveDocument.Tables(1).Cell(iFilas, iCols + 4) = IIf(IsNull(rs(3)), "", rs(3))
            ' formatear la quinta celda (precio) y alinear a la derecha
            .ActiveDocument.Tables(1).Cell(iFilas, iCols + 5) = IIf(IsNull(rs(4)), "", Format(rs(4), "#,##0.00"))
            .ActiveDocument.Tables(1).Cell(iFilas, iCols + 5).Select
            .Selection.ParagraphFormat.Alignment = 2
            ' siguiente registro
            rs.MoveNext
        Loop
        ' ajustar el ancho de las columnas
        .Selection.Tables(1).Select
        .Selection.Tables(1).AutoFitBehavior (1)
        ' nos posicionamos en la primera celda
        .ActiveDocument.Tables(1).Cell(2, 1).Select
        ' guardamos el documento
        .ActiveDocument.SaveAs App.Path & "\Pedidos.doc"
        ' mostramos el documento
        .Application.Visible = True
    End With
    Screen.MousePointer = vbDefault
    ' liberamos recursos
    rs.Close
    Set oWord = Nothing
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub
Como ya te comenté antes, esto es muy lento. En esta prueba, con 250 registros en la tabla tarda aprox. 2 minutos, mientras que enviando lo mismo a Excel tarda apenas unos segundos.
  #5 (permalink)  
Antiguo 11/03/2008, 10:49
 
Fecha de Ingreso: febrero-2008
Mensajes: 37
Antigüedad: 16 años, 2 meses
Puntos: 0
Gracias Avellaneda

Muchas gracias Avellaneda.

Me ha sido de mucha ayuda tu código. Finalmente no he hecho eso exactamente, pero si que ivan por ahi los tiros: Lo que he hecho ha sido una dll en vb6 lo que me pasa es que ahora referencio dicha dll en el proyecto de access y no me pilla la dll. Pero muchas gracias.


Mil gracias y perdona que no te haya contestado antes.
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 23:19.