Crear archivo WORD con columnas

Iniciado por rapbyone, 26 Abril 2021, 16:53 PM

0 Miembros y 1 Visitante están viendo este tema.

rapbyone

Estimados, tengo la siguiente función con la cual creo un archivo word (.doc) pero no consigo dar con el codigo para insertar una tabla.

Agradecería su ayuda.  :rolleyes:
Gracias amigos

Código (vb) [Seleccionar]

Private Sub MakeWordDoc(ByVal file_name As String, ByVal title As String, ByVal body As String)
On Error Resume Next
Dim word_app As Word.Application
Dim word_doc As Word.Document

' Open Word and create a document.
Set word_app = New Word.Application
Set word_doc = word_app.Documents.Add(DocumentType:=wdNewBlankDocument)


    ' Write the title.


    word_app.ActiveWindow.Selection.Font.Size = 25
    word_app.ActiveWindow.Selection.Font.Name = "Arial"
        word_app.Selection.TypeText title
    'word_app.ActiveWindow.Selection.Font.Size = 24
   
   
    ' Save the file.
    word_doc.SaveAs FileName:=file_name

    ' Close the document and Word.
    word_doc.Close True
    word_app.Quit False
End Sub



EdePC

Saludos,

Debes tener la referencia a mano: https://docs.microsoft.com/es-es/office/vba/api/word.table

Para tu ejemplo quedaría más o menos así:

Código (vb, 4,5,10,11,12) [Seleccionar]
Private Sub mkdoc()
  Dim word_app As Word.Application
  Dim word_doc As Word.Document
  Dim tbl As Word.Table
  Dim rng As Word.Range

  Set word_app = New Word.Application
  Set word_doc = word_app.Documents.Add(DocumentType:=wdNewBlankDocument)

  Set rng = word_doc.Range(Start:=0, End:=0)
  Set tbl = word_doc.Tables.Add(Range:=rng, NumRows:=3, NumColumns:=4)
  tbl.AutoFormat Format:=wdTableFormatElegant

  word_doc.SaveAs FileName:="docu"
  word_doc.Close True
  word_app.Quit False
End Sub

rapbyone

Cita de: EdePC en 27 Abril 2021, 18:35 PM
Saludos,

Debes tener la referencia a mano: https://docs.microsoft.com/es-es/office/vba/api/word.table

Para tu ejemplo quedaría más o menos así:

Código (vb, 4,5,10,11,12) [Seleccionar]
Private Sub mkdoc()
  Dim word_app As Word.Application
  Dim word_doc As Word.Document
  Dim tbl As Word.Table
  Dim rng As Word.Range

  Set word_app = New Word.Application
  Set word_doc = word_app.Documents.Add(DocumentType:=wdNewBlankDocument)

  Set rng = word_doc.Range(Start:=0, End:=0)
  Set tbl = word_doc.Tables.Add(Range:=rng, NumRows:=3, NumColumns:=4)
  tbl.AutoFormat Format:=wdTableFormatElegant

  word_doc.SaveAs FileName:="docu"
  word_doc.Close True
  word_app.Quit False
End Sub


Muchas gracias estimado, funcionó de maravilla.

rapbyone

Cita de: EdePC en 27 Abril 2021, 18:35 PM
Saludos,

Debes tener la referencia a mano: https://docs.microsoft.com/es-es/office/vba/api/word.table

Para tu ejemplo quedaría más o menos así:

Código (vb, 4,5,10,11,12) [Seleccionar]
Private Sub mkdoc()
  Dim word_app As Word.Application
  Dim word_doc As Word.Document
  Dim tbl As Word.Table
  Dim rng As Word.Range

  Set word_app = New Word.Application
  Set word_doc = word_app.Documents.Add(DocumentType:=wdNewBlankDocument)

  Set rng = word_doc.Range(Start:=0, End:=0)
  Set tbl = word_doc.Tables.Add(Range:=rng, NumRows:=3, NumColumns:=4)
  tbl.AutoFormat Format:=wdTableFormatElegant

  word_doc.SaveAs FileName:="docu"
  word_doc.Close True
  word_app.Quit False
End Sub


Estimado, como puedo hacer para crear la tabla como continuación de otro elemento. al establecer el rango (.Range(Start:=0, End:=0)) la tabla se crea al principio del documento. mi idea es que la tabla salga después de un título por ejemplo, pero no a través de un rango especifico, por que el texto previo va variando y por ende el rango irá cambiando también, espero me haya dado a entender.

Gracias por tu ayuda.

EdePC

Siempre puedes referirte a objetos del documento como palabras o párrafos para obtener un Rango adecuado, por ejemplo tomemos como primer párrafo a tu Título, entonces obtenemos un Rango que sea el último elemento de dicho párrafo (el salto de línea) e insertamos ahí la tabla:

Código (vb,11,14) [Seleccionar]
Private Sub mkdoc()
  Dim word_app As Word.Application
  Dim word_doc As Word.Document
  Dim tbl As Word.Table
  Dim rng As Word.Range

  Set word_app = New Word.Application
  Set word_doc = word_app.Documents.Add(DocumentType:=wdNewBlankDocument)

  ' Inserta un título al final del documento (al inicio porque está vacío)
  word_doc.Content.InsertAfter "Mi Título"
 
  ' Inserta una tabla despues del primer párrafo (despues del título)
  Set rng = word_doc.Range(word_doc.Paragraphs(1).Range.End - 1, word_doc.Paragraphs(1).Range.End)
  Set tbl = word_doc.Tables.Add(Range:=rng, NumRows:=3, NumColumns:=4)
  tbl.AutoFormat Format:=wdTableFormatElegant

  word_doc.SaveAs FileName:="docu"
  word_doc.Close True
  word_app.Quit False
End Sub

rapbyone

Cita de: EdePC en  2 Mayo 2021, 05:04 AM
Siempre puedes referirte a objetos del documento como palabras o párrafos para obtener un Rango adecuado, por ejemplo tomemos como primer párrafo a tu Título, entonces obtenemos un Rango que sea el último elemento de dicho párrafo (el salto de línea) e insertamos ahí la tabla:

Código (vb,11,14) [Seleccionar]
Private Sub mkdoc()
  Dim word_app As Word.Application
  Dim word_doc As Word.Document
  Dim tbl As Word.Table
  Dim rng As Word.Range

  Set word_app = New Word.Application
  Set word_doc = word_app.Documents.Add(DocumentType:=wdNewBlankDocument)

  ' Inserta un título al final del documento (al inicio porque está vacío)
  word_doc.Content.InsertAfter "Mi Título"
 
  ' Inserta una tabla despues del primer párrafo (despues del título)
  Set rng = word_doc.Range(word_doc.Paragraphs(1).Range.End - 1, word_doc.Paragraphs(1).Range.End)
  Set tbl = word_doc.Tables.Add(Range:=rng, NumRows:=3, NumColumns:=4)
  tbl.AutoFormat Format:=wdTableFormatElegant

  word_doc.SaveAs FileName:="docu"
  word_doc.Close True
  word_app.Quit False
End Sub


Entiendo, el problema es que el contenido del word va variando y los párrafos van cambiando, hay alguna manera de que por ejemplo el rango se defina a través de una palabra? por ejemplo, que inserte la tabla después de la palabra "casa".

Gracias por la ayuda amigo

EdePC

Es ese caso puedes buscar (.Find) en el documento la palabra que quieras, obtener a partir de esa palabra un nuevo Rango e insertar ahí tu tabla:

Código (vb) [Seleccionar]
Private Sub mkdoc2()
  Dim word_app As Word.Application
  Dim word_doc As Word.Document
  Dim tbl As Word.Table
  Dim rng As Word.Range

  Set word_app = New Word.Application
  Set word_doc = word_app.Documents.Add(DocumentType:=wdNewBlankDocument)

  ' Inserta un título al final del documento (al inicio porque está vacío)
  word_doc.Content.InsertAfter "Son escasas las casas, pero mi casa es mi casa"

  ' Inserta una tabla despues de la primera palabra "casa"
  Set rng = word_doc.Content
  rng.Find.Execute FindText:="casa", MatchWholeWord:=True
 
  If rng.Find.Found = True Then
    Set rng = word_doc.Range(Start:=rng.End, End:=rng.End)
    Set tbl = word_doc.Tables.Add(Range:=rng, NumRows:=3, NumColumns:=4)
    tbl.AutoFormat Format:=wdTableFormatElegant
  End If
 
  word_doc.SaveAs FileName:="docu"
  word_doc.Close True
  word_app.Quit False
End Sub

rapbyone

Cita de: EdePC en  2 Mayo 2021, 17:44 PM
Es ese caso puedes buscar (.Find) en el documento la palabra que quieras, obtener a partir de esa palabra un nuevo Rango e insertar ahí tu tabla:

Código (vb) [Seleccionar]
Private Sub mkdoc2()
  Dim word_app As Word.Application
  Dim word_doc As Word.Document
  Dim tbl As Word.Table
  Dim rng As Word.Range

  Set word_app = New Word.Application
  Set word_doc = word_app.Documents.Add(DocumentType:=wdNewBlankDocument)

  ' Inserta un título al final del documento (al inicio porque está vacío)
  word_doc.Content.InsertAfter "Son escasas las casas, pero mi casa es mi casa"

  ' Inserta una tabla despues de la primera palabra "casa"
  Set rng = word_doc.Content
  rng.Find.Execute FindText:="casa", MatchWholeWord:=True
 
  If rng.Find.Found = True Then
    Set rng = word_doc.Range(Start:=rng.End, End:=rng.End)
    Set tbl = word_doc.Tables.Add(Range:=rng, NumRows:=3, NumColumns:=4)
    tbl.AutoFormat Format:=wdTableFormatElegant
  End If
 
  word_doc.SaveAs FileName:="docu"
  word_doc.Close True
  word_app.Quit False
End Sub


Estimado, agradezco la ayuda, funcionó perfecto, muchas gracias amigo  ;-)