Заполнить текстовые поля MS-Word ContentControl из текстовых полей UserForm с тем же именем / тегом?

Я создал программу Visual Basic для приложений в Microsoft Word (2016, 64-разрядная версия, Windows 10)

Он состоит из пользовательской формы с 30 текстовыми полями и кнопкой отправки. Каждый TextBox имеет уникальное имя и тег.

У меня также есть такое же количество текстовых полей ContentControl в текстовом документе, каждое из них имеет тот же заголовок и тег, что и соответствующий ему текстовый блок UserForm.

Что мне нужно, так это лучший способ заполнить текстовые поля документа из текстовых полей пользовательской формы, когда пользователь нажимает кнопку "Отправить".

В настоящее время я делаю это, набирая 3 строки кода для каждого TextBox, но это утомительно. Я копирую и вставляю 3 строки кода каждый раз, но каждый раз должен редактировать небольшую часть каждой строки.

Я думал об использовании цикла, как показано в коде ниже, где я использую переменную x скопировать TextBox по имени, но я не уверен, что делать дальше.

Dim doc As Document
Dim ccs As ContentControls
Dim cc As ContentControl
Set doc = ActiveDocument

For … 
' Somehow find each text box, put the name of one into variable x then

    Set ccs = doc.SelectContentControlsByTag(x)
    Set cc = ccs(1)
    cc.Range.Text = x.Text

Next

Заранее спасибо!

2 ответа

Решение

Все текстовые поля хранятся в классе Shapes, к которому вы можете получить доступ следующим образом:

Sub Test()
Dim shape As Shape
Dim str As String

For Each shape In ActiveDocument.Shapes
    str = "My name is " & shape.Name
    str = str & " My EditID is " & shape.EditID
    shape.TextFrame.TextRange.Text = str
Next
End Sub

Вам нужно назвать свои текстовые поля так, чтобы вы могли идентифицировать их как текстовые, а затем проверить, являются ли они текстовыми полями, прежде чем писать в них.

Текстовые поля UserForm доступны через Controls класс, в то время как текстовые поля ContentControl документа доступны через ContentControls собственность или SelectContentControlsByTag функция.

Нет необходимости специально называть текстовые поля, так как они легко различимы по типу.


Одним из решений является циклический просмотр соответствующих ContentControls и копирование по имени / названию:

Private Sub cmdSubmit_Click()

  Dim cc As Word.ContentControl

  For Each cc In Word.ActiveDocument.ContentControls
    If cc.Type = Word.WdContentControlType.wdContentControlText Then
      cc.Range.Text = Me.Controls(cc.Title).Text
    End If
  Next cc

End Sub

Если вы используете расширенный текст ContentControls, то вам нужно заменить wdContentControlText с wdContentControlRichText,


Другое решение состоит в том, чтобы пройти через соответствующие текстовые поля и скопировать по тегу:

Private Sub cmdSubmit_Click()

  Dim doc As Word.Document
  Dim cc As Word.ContentControl
  Dim c As MSForms.Control

  Set doc = Word.ActiveDocument
  For Each c In Me.Controls
    If TypeName(c) = "TextBox" Then
      Set cc = doc.SelectContentControlsByTag(c.Tag)(1)
      cc.Range.Text = c.Text
    End If
  Next c

End Sub
Другие вопросы по тегам