Заполнить текстовые поля 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