Слово VBA - вставьте вторую таблицу, затем начните ее заполнять - PullRequest
0 голосов
/ 30 апреля 2020

в Access VBA у меня есть следующее создание и заполнение таблицы Word без проблем.

oWord.ActiveDocument.Tables.Add Range:=oDoc.Bookmarks("\endofdoc").Range, NumRows:=1, NumColumns:=5
   rs.MoveFirst
   r = 0 'current row counter

  'start the recordset loop reserving the top two rows for header type stuff.
   With oWord.Selection
    .TypeText "Control Identifier"
    .MoveRight Unit:=wdCell
    .TypeText "Control Name"
    .MoveRight Unit:=wdCell
    .MoveRight Unit:=wdCell
    .MoveRight Unit:=wdCell

    'first data row
    .MoveRight Unit:=wdCell
    .TypeText rs("Control_Main")
    .MoveRight Unit:=wdCell
    .TypeText rs("Title")
    .MoveRight Unit:=wdCell
    .MoveRight Unit:=wdCell
    .MoveRight Unit:=wdCell
    ......

и т. Д., Когда таблица заполнена, я вставляю разрыв страницы и некоторый текст, затем я вставляю вторая таблица.

oWord.ActiveDocument.Tables.Add Range:=oDoc.Bookmarks("\endofdoc").Range, NumRows:=1, NumColumns:=3   
rs.MoveFirst   
With oWord.Selection
  'first data row
  .MoveRight Unit:=wdCell
  .TypeText rs("Control_main")
  .MoveRight Unit:=wdCell
  .TypeText rs("Title")
  .MoveRight Unit:=wdCell
  ......

Вторая таблица создается, но в ней ничего не заполняется. Если я добавлю oWord.Selection.Style = "Table Grid" после создания моей второй таблицы - он создаст сетку вокруг первой таблицы, но никакой дополнительный текст или строки не будут добавлены в первую таблицу.

Я знаю, что могу сделать тип set oTable = создание таблицы, но затем, когда я пытаюсь выбрать ее, кажется, что она выбирается из Word.Document вместо Word.Application, а мое последующее с .Selection не подходит для .moveright для моего динамического создания c.

Есть идеи, где я ошибаюсь?

--- Обновление пост-работы --- Особая благодарность @freeflow за его терпение и помощь. Его код был великолепен, мне просто нужно было немного поэкспериментировать с этой частью. ... Модуль перемещения wdRow работал, но без дополнительной строки он покинул таблицу. У меня также были проблемы со ссылкой на .Cells (2) для 2-го столбца в этой строке - но перемещение сначала, а затем ввод текста работало нормально.

this.

myRow.Move unit:=wdRow, Count:=1
myRow.Cells(1).Range.Text = rs("Control_Main")
myRow.Cells(2).Range.Text = rs("Title")

стало этим.

  oDoc.Tables(1).Rows.Add
  myRow.Move Unit:=wdRow, Count:=1
  myRow.Cells(1).Range.Text = rs("Control_main")
  myRow.Move Unit:=wdCell, Count:=1
  myRow.Cells(1).Range.Text = rs("Title")

1 Ответ

1 голос
/ 30 апреля 2020

Это потому, что вы не выбираете таблицу c, с которой будете работать sh. Для ваших первых и последующих таблиц попробуйте

Dim myRange as Word.range
with oWord.ActiveDocument.Tables
    set myRange=.Item(.Count).Range
end with

with myRange.Tables(1)

etc

Обновление 2020 / апр / 30

Надеюсь, следующее обновление будет более понятным.

rs.MoveFirst
r = 0 'current row counter

'start the recordset loop reserving the top two rows for header type stuff.
'Add the first table at the end of the document
oDoc.Tables.Add Range:=oDoc.Bookmarks("\endofdoc").Range, NumRows:=1, NumColumns:=5

'set myRow to the range of the first row in the last table in the document
Dim myRow As Word.Range
' .First is sugar for .Item(1)
Set myRow = oDoc.Tables.Item(oDoc.Tables.Count).Range.Rows.First.Range

myRow.Cells(1).Range.Text = "Control Identifier"
myRow.Cells(2).Range.Text = "Control Name"

myRow.Move unit:=wdRow, Count:=1

'first data row - its not clear from your code if you are entering data into the first column or not
' so the 1 and 2 below may need adjusting
' such is the difficulties introduced by emulating keyboard movements.
myRow.Cells(1).Range.Text = rs("Control_Main")
myRow.Cells(2).Range.Text = rs("Title")

etc

'add the next table at the end of the document

oDoc.Tables.Add Range:=oDoc.Bookmarks("\endofdoc").Range, NumRows:=1, NumColumns:=5

'set myRow to the range of the first row in the last table in the document
Dim myRow As Word.Range
' .First is sugar for .Item(1)
Set myRow = oDoc.Tables.Item(oDoc.Tables.Count).Range.Rows.First.Range

myRow.Cells(1).Range.Text = "Control Identifier"
myRow.Cells(2).Range.Text = "Control Name"

myRow.Move unit:=wdRow, Count:=1

'first data row - its not clear from your code if you are entering data into the first column or not
' so the 1 and 2 below may need adjusting
' such is the difficulties introduced by emulating keyboard movements.
myRow.Cells(1).Range.Text = rs("Control_Main")
myRow.Cells(2).Range.Text = rs("Title")

etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...