Вставка автотекста как строки в MS Word с использованием VBA - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь создать кнопку «Добавить строку» в форме MS Word 2016, которая добавит еще одну строку в конец таблицы, содержащей элементы управления текстовым содержимым.

Простое добавление строки не включает элементы управления содержимым, а копирование предыдущей строки также копирует любой текст, который был добавлен в эти элементы управления содержимым, ни того, ни другого.

Я где-то читал, что можно сохранить незаполненную строку как Автотекст, а затем вставить Автотекст как новую строку. Я просто не могу найти, как это сделать. У меня есть незаполненная строка, сохраненная как автотекст, я просто не знаю, как добавить ее в конец таблицы с помощью VBA.

Кроме того, форма будет защищена от редактирования. Код VBA, необходимый для разблокировки формы, а затем для ее разблокировки у меня уже есть. Я просто оставляю это сейчас, пока пытаюсь это выяснить.

Я попробовал приведенный ниже код, но получаю ошибку несоответствия типов.

Private Sub AddInmate_Click()

ActiveDocument.Tables(2).Select
NormalTemplate.AutoTextEntries("Inmate_Row").Insert _
    Where:=ActiveDocument.Tables(2).Range.Rows.Last

End Sub

Будем весьма благодарны за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Попытка очень близка - она ​​пытается вставить новую строку «поверх» или «в» последней строке. Хитрость заключается в том, чтобы получить Range таблицы, а затем свернуть ее так, чтобы целевая точка вставки была сразу после таблицы. Когда строки таблицы вставляются / вставляются сразу после существующей таблицы, внутри той же метки абзаца, Word автоматически включает их в существующую таблицу.

Private Sub AddInmate_Click()
    Dim tmpl As Word.Template
    Dim rngTbl As Word.Range

    Set rngTbl = ActiveDocument.Tables(2).Range
    rngTbl.Collapse wdCollapseEnd
    Set tmpl = NormalTemplate
    tmpl.BuildingBlockEntries("Inmate_Row").Insert _
        Where:=rngTbl, RichText:=True
End Sub
0 голосов
/ 06 сентября 2018

Я бы выбрал такой подход:

 With Selection.Tables(1).Rows
    'Insert an empty paragraph after our table, then replace it with a replica of the last row
    With .Last.Range
      .Next.InsertBefore vbCr
      .Next.FormattedText = .FormattedText
    End With
    'Reset all content controls in the new last row
    For Each CCtrl In .Last.Range.ContentControls
      With CCtrl
        If .Type = wdContentControlCheckBox Then .Checked = False
        If .Type = wdContentControlRichText Or .Type = wdContentControlText Then .Range.Text = ""
        If .Type = wdContentControlDropdownList Then .DropdownListEntries(1).Select
        If .Type = wdContentControlComboBox Then .DropdownListEntries(1).Select
        If .Type = wdContentControlDate Then .Range.Text = ""
      End With
    Next
  End With

Полный макрос ContentControlOnExit, реализующий это в ситуации, аналогичной вашей, см. http://www.msofficeforums.com/word-vba/27809-code-add-new-row-table.html#post87989

...