Consulting

Results 1 to 5 of 5

Thread: "flexible" table help

  1. #1

    "flexible" table help

    I have the following data.
    col1 col2
    AA 10
    BB 20
    CC 30

    and the total for the above is 60 (for col2).

    I am using a table to declare like this
    Set Tbl1 = objApp.ActiveDocument.Tables.Add(Range:=Selection.Range, _
    NumRows:=50, NumColumns:=2)
    therefore the minimum is 50 lines. The problem I have is the maximum of lines could be 500 or even 1. And I would put the total of lines after the table.
    Could any one tell me how I could have a flexible number of lines table.
    (Could it be possible to have ONLY one row by creating a table for every row!?)
    Thanks.

  2. #2
    VBAX Wizard
    Joined
    May 2004
    Posts
    6,713
    Location
    Uh, please try and post what you want. However, since you asked....

    How can you have a flexible number of lines (rows)?

    Make the number of rows a variable...., and then use it.

    Dim i As Integer
    ' make i = whatever you like
    Set Tbl1 = objApp.ActiveDocument.Tables.Add(Range:=Selection.Range, _
    NumRows:=i, NumColumns:=2)

    I am pretty sure this is not exactly what you want...but that is what you asked for.

    Is it possible to have only ONE row? Sure - make NumRows:=1.

    Could you create a table for every row? Sure, you can make a bunch of tables, if you are so inclined.

    Oh, and

    Set Tbl1 = objApp.ActiveDocument.Tables.Add(Range:=Selection.Range, _
    NumRows:=50, NumColumns:=2)

    does not make a minimum of 50. It makes a table with - quite explicitly - 50 rows. Not 49, or 51, but 50.

    The real question is: do you know the number of rows you need BEFORE you create the table? If the answer is yes, well then use that known numer as the number of rows. If the answer is no, you do NOT know the number of rows needed before you create the table, then.....

    Ask a better question.

  3. #3
    Sorry for not being clear.
    "flexible" means I do not have a "certain" number of rows. And I do not know how many I would have before creating the table.
    My idea is to create one-row table(s) as long as the loop goes (from sql query) so as not to put ie. 50 rows even I am not using only less than 50 rows.
    Also I understand I need to put "something" like
    Selection.EndKey Unit:=wdStory
    Selection.TypeParagraph
    in between tables, but that "something" would mean a gap between rows of the same table.
    Therefore, I need to get a way to "glue" all the "one-row" table(s) into a big "flexible" table seaminglessly.
    Thanks.

  4. #4
    VBAX Wizard
    Joined
    May 2004
    Posts
    6,713
    Location
    Ah, this reminds me of another current thread.....

    If you have a loop, surely there must be a way to get the number of iterations. However, even so, how about making ONE table and adding rows - rather than individual tables for each record. You can not "glue" one row tables together.

    You could build a new table with the number of rows equal to the total existing table count. That is, if there are 30 one row tables, make a new table with 30 rows, then move the contents of each one row table, one at a time, into the appropriate row of the new 30 row table.

    It can be done, but it is sloppy design. Here it is.
    [vba]Sub SmooshNewTable()
    Dim i As Integer
    Dim var
    i = ActiveDocument.Tables.Count
    ActiveDocument.Tables.Add Range:=Selection.Range, _
    NumRows:=i, NumColumns:=1, _
    DefaultTableBehavior:=wdWord9TableBehavior, _
    AutoFitBehavior:=wdAutoFitFixed
    For var = 2 To i + 1
    ActiveDocument.Tables(1).Rows(var - 1).Range.Text = _
    Left(ActiveDocument.Tables(var).Rows(1).Range.Text, _
    Len(ActiveDocument.Tables(var).Rows(1).Range.Text) - 4)
    Next
    End Sub[/vba]

    Notes:

    This creates the new table at the Selection point. As written the selection point is BEFORE the existing tables. That is why For var = 2 to i + 1; when the new table is created IT becomes Tables(1), the existing ones now start at 2.

    If you are going to have the new table in a different location, this MUST be adjusted.

    The reason for the range.text using Len(blah blah, -4) is that you need to trim off the end-of-cell marker (which is two characters), and the end-of-row marker (also two characters).

  5. #5
    Thank you for the suggestion.

    I have another one that seems to be working as followed. Please advice.

    [vba]

    Public objApp As Word.Application
    Public Tbl1 As Table

    Private Sub Command1_Click()

    On Error Resume Next
    Set objApp = GetObject(, "Word.Application")
    If objApp Is Nothing Then
    Set objApp = CreateObject("Word.Application")
    End If
    With objApp
    .Documents.Add , , , True
    .Visible = False
    End With

    For intCounter1 = 1 To 3
    If intCounter1 = 1 Then
    Set Tbl1 = objApp.ActiveDocument.Tables.Add _
    (Range:=Selection.Range, NumRows:=1, NumColumns:=2)
    Tbl1.Columns(1).Width = 100
    Tbl1.Columns(2).Width = 100
    Else
    Selection.MoveDown Unit:=wdLine, Count:=1
    Selection.InsertRows 1
    End If

    Tbl1.Cell(intCounter1, 1).Range.Text = "Table1 - col1" & intCounter1
    Tbl1.Cell(intCounter1, 2).Range.Text = "Table1 - col2"


    Next


    objApp.ActiveDocument.SaveAs FileName:="c:\test1.doc"

    objApp.Quit False
    Set objApp = Nothing

    MsgBox "done"
    Set Tbl1 = Nothing

    objApp.Selection.MoveEnd Unit:=wdTable, Count:=1 _
    '<- move to end of table
    objApp.Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdMove _
    '<- move foward 1 line
    End Sub



    [/vba]

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •