VBA, чтобы добавить строку в конец таблицы и вставить Rich Text Content Control

У меня есть форма в Word 2013. В ней представлены различные таблицы, и я хочу, чтобы пользователи могли добавлять строки в конец таблицы. Я сделал это с помощью следующего кода:

`Dim oTable As table
Dim oCell As Cell
Dim oPrevRow as Row, oNewRow As Row
Dim iColumn As Long
Set oTable = ActiveDocument.tables (1)
Set oPrevRow = oTable.Rows(oTable.Rpws.Count)
oTable.Rows.Add
Set oNewRow = oTable.Rows(oTable.rows.Count)`

Я хочу, чтобы во все 7 ячеек в новой строке был вставлен элемент управления Rich Text Content. Как мне это сделать?

1 ответ

Следующий код будет работать с таблицей, отмеченной как 'TblBkMk' в любом месте тела документа. Комментарии в коде показывают, как вместо этого вы можете протестировать определенную таблицу. Просто добавьте код в модуль кода ThisDocument документа или его шаблона. Макрос срабатывает при выходе из последнего элемента управления содержимым в таблице. Код также предусматривает, что документ должен иметь защиту "только для чтения" или "заполнение форм" (добавьте пароль к коду, где он указан, если вы его используете)

Private Sub Document_ContentControlOnExit(ByVal CCtrl As ContentControl, Cancel As Boolean)
'The following code conditionally adds a new row, with content controls, to the designated table.
Dim i As Long, j As Long, Prot As Long
Const Pwd As String = "" 'Insert password (if any) here
'Bookmarking the table provides the flexibility of being able to deal with the addition/deletion
' of other tables before the one we want to process.
Const StrBkMk As String = "TblBkMk"
'Exit if we're not in a table - we don't really need this is using a bookmarked table,
' but it's a safeguard against the bookmark having been expanded/moved.
If CCtrl.Range.Information(wdWithInTable) = False Then Exit Sub
With ActiveDocument
  If .Bookmarks.Exists(StrBkMk) = False Then
    MsgBox "The table bookmark: '" & StrBkMk & "' is missing." & vbCr & _
    "Please add it to the relevant table before continuing.", vbExclamation
    Exit Sub
  End If
End With
With CCtrl
  'Check that the Content Control is within our bookmarked table's range.
  If .Range.InRange(ActiveDocument.Bookmarks(StrBkMk).Range) = False Then Exit Sub
  ' One could test for a particular table instead, in which case all the code dealing
  ' with wdWithInTable & StrBkMk can be deleted. For example:
  'If .Range.InRange(ActiveDocument.Tables(1).Range) = False Then Exit Sub
  'Get the number of ContentControls in the table
  i = .Range.Tables(1).Range.ContentControls.Count
  'Get our ContentControl's index # in the table
  j = ActiveDocument.Range(.Range.Tables(1).Range.Start, .Range.End).ContentControls.Count
  'Check that we're using the last content control
  If i <> j Then Exit Sub
End With
'Solicit user input
If MsgBox("Add new row?", vbQuestion + vbYesNo) <> vbYes Then Exit Sub
With ActiveDocument
  ' Un-protect the document, if applicable
  Prot = .ProtectionType
  If .ProtectionType <> wdNoProtection Then
    Prot = .ProtectionType
    .Unprotect Password:=Pwd
  End If
  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
  'Update the bookmarked range
  .Bookmarks.Add Name:=StrBkMk, Range:=Selection.Tables(1).Range
  ' Re-protect the document, if applicable
  .Protect Type:=Prot, Password:=Pwd
End With
End Sub
Другие вопросы по тегам