Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: rapbyone en 26 Abril 2021, 16:53 PM

Título: Crear archivo WORD con columnas
Publicado por: rapbyone en 26 Abril 2021, 16:53 PM
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


Título: Re: Crear archivo WORD con columnas
Publicado por: 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
Título: Re: Crear archivo WORD con columnas
Publicado por: rapbyone en 27 Abril 2021, 22:15 PM
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.
Título: Re: Crear archivo WORD con columnas
Publicado por: rapbyone en 2 Mayo 2021, 03:17 AM
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.
Título: Re: Crear archivo WORD con columnas
Publicado por: 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
Título: Re: Crear archivo WORD con columnas
Publicado por: rapbyone en 2 Mayo 2021, 09:31 AM
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
Título: Re: Crear archivo WORD con columnas
Publicado por: 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
Título: Re: Crear archivo WORD con columnas
Publicado por: rapbyone en 2 Mayo 2021, 19:33 PM
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  ;-)