2013-08-19 5 views
0

Я использую макрос VBA для вставки строк (двух столбцов) в документ слова. Проблема вставленные строки не заполняют всю страницу и все столбцы не имеют одинаковую ширину:Развернуть таблицу Word VBA

enter image description here

Мой вопрос: как дать одинаковую ширину для всех столбцов и расширить таблицу, чтобы заполнить ширину страницы?

Вот моя функция:

Private Function CreateWordDoc(ByVal wrdApp As Word.Application, ByRef Objects() As OwnClass, ByVal sFilename As String, ByVal sPath As String) 
    Dim i As Integer 
    Dim wrdDoc As Word.Document 
    Dim MyObj As OwnClass 

    Dim wrdTppTable As Word.Table 

    Set wrdDoc = wrdApp.Documents.Add(sFilename, Visible:=True) 

    Set wrdTppTable = wrdDoc.Tables(2) 

    For i = 0 To UBound(Objects) - 1 
     Set MyObj = Objects(i) 
     ' Add a row to the table and select it 
     wrdTppTable.Rows.Add.Select 
     ' Work with the selected row 
     With wrdApp.Selection.Range 
      ' Make sure the row is on two columns 
      .Cells.Split 1, 2, True 
      ' Set the text font parameters 
      With .Font 
       .ColorIndex = wdBlack 
       .name = "Arial" 
       .size = 11 
       .Bold = False 
      End With 
      ' Write text in the cell 
      .Text = MyObj.GetKey & ": " & MyObj.GetValue 
      ' Then select the next cell in the row 
      .Next.Select 
     End With 
     ' Work with the second column of the row 
     wrdApp.Selection.Cells.SetWidth 54, RulerStyle:=wdAdjustFirstColumn 
     With wrdApp.Selection.Range 
      With .Font 
       .ColorIndex = wdBlack 
       .name = "Arial" 
       .size = 11 
       .Bold = False 
      End With 
      ' Write the cell 
      .Text = MyObj.GetId 
     End With 
    Next 
End Function 
+0

Вы можете установить ширину столбца, непосредственно влияя на это свойство (.Columns (x) .Width). С другой стороны, у меня нет слишком четких различных частей вашего кода; например: почему вы раскалываете снова и снова, вместо того, чтобы создавать число столбцов, которое вы хотите (а, разумеется, разбивать на определенную строку)? – varocarbas

+0

Я совершенно новый для VBA с Word. Я не уверен, что расщепление - лучший способ сделать это. Я открываю любое предложение кода. Если он у вас есть, я был бы рад увидеть это. Не стесняйтесь отвечать и размещать некоторый код;) Для информации я добавляю строки в шаблон слова, и шаблон уже содержит таблицу с одной строкой (заголовком), но только с одним столбцом. Все остальные строки должны иметь два столбца. – Maxbester

+0

Делает смысл :) Я написал ответ с требуемым кодом, чтобы исправить проблемы с изменением размера; удалите все разделители setWidths из вашего кода и просто напишите это сверху. – varocarbas

ответ

0

Самое лучшее, что вы можете сделать, чтобы выполнить то, что вы после установки размеров столбцов в начале, перед выполнением каких-либо изменений. Пример код:

Dim availableWidth As Integer 
availableWidth = wrdDoc.PageSetup.PageWidth - wrdDoc.PageSetup.LeftMargin - wrdDoc.PageSetup.RightMargin 

With wrdTppTable 
    .Columns.Add 'Adding the required column 
    'Resizing both columns on account of the available space 
    .Columns(1).Width = availableWidth/2 
    .Columns(2).Width = availableWidth/2 
    .Cell(1, 1).Merge .Cell(1, 2) 
End With 

Сразу после этого кода вы можете начать перебор клетки и выполнять действия, которые вы хотите, просто путем добавления строк. Используйте Cells.Split только в случае необходимости; например: в третьей строке вы хотите иметь три столбца, причем два из них устанавливаются внутри основного второго столбца.

+0

У меня все еще есть проблема ... Я обновил свой вопрос. Благодаря! – Maxbester

+0

@Maxbester Я сказал вам: удалите все ваши биты кода, связанные с расщеплением и настройкой ширины. Как вы можете видеть, мой код выводит два одинаковых столбца, если вы не измените это позже, он останется. В вашем новом коде у вас все еще есть «wrdApp.Selection.Cells.SetWidth 54, RulerStyle: = wdAdjustFirstColumn» – varocarbas

+0

О да, извините. Я забыл эту строку. Теперь он отлично работает. Благодаря!! – Maxbester