使用相同的 name/tag 从用户窗体文本框填充 MS-Word ContentControl 文本框?
Populate MS-Word ContentControl Text Boxes from UserForm TextBoxes with same name/tag?
我已经在 Microsoft Word(2016,64 位,Windows10)中创建了一个 Visual Basic for Applications 程序
它由一个带有大约 30 个文本框的用户窗体和一个提交按钮组成。每个 TextBox 都有唯一的名称和标签。
我在word文档中也有相同数量的ContentControl文本框,每个文本框都有与其对应的UserForm TextBox相同的标题和标签。
我所追求的是在用户单击提交时从用户窗体文本框填充文档文本框的更好方法。
我目前通过为每个文本框键入 3 行代码来执行此操作,但这很乏味。我每次都复制并粘贴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
提前致谢!
所有文本框都存储在 class 个形状中,您可以像这样访问它们:
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
您需要为您的文本框命名,以便您可以将它们识别为文本框,然后您可以在写入之前检查它们是否是文本框。
用户窗体文本框可通过 Controls
class 访问,而文档 ContentControl 文本框可通过 ContentControls
属性 或 SelectContentControlsByTag
访问功能。
无需特别命名文本框,因为它们很容易按类型区分。
一种解决方案是遍历适当的 ContentControls 并按 name/title:
复制
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
如果您使用富文本内容控件,则需要将 wdContentControlText
替换为 wdContentControlRichText
。
另一种解决方案是遍历适当的 TextBoxes 并按标签复制:
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
我已经在 Microsoft Word(2016,64 位,Windows10)中创建了一个 Visual Basic for Applications 程序
它由一个带有大约 30 个文本框的用户窗体和一个提交按钮组成。每个 TextBox 都有唯一的名称和标签。
我在word文档中也有相同数量的ContentControl文本框,每个文本框都有与其对应的UserForm TextBox相同的标题和标签。
我所追求的是在用户单击提交时从用户窗体文本框填充文档文本框的更好方法。
我目前通过为每个文本框键入 3 行代码来执行此操作,但这很乏味。我每次都复制并粘贴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
提前致谢!
所有文本框都存储在 class 个形状中,您可以像这样访问它们:
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
您需要为您的文本框命名,以便您可以将它们识别为文本框,然后您可以在写入之前检查它们是否是文本框。
用户窗体文本框可通过 Controls
class 访问,而文档 ContentControl 文本框可通过 ContentControls
属性 或 SelectContentControlsByTag
访问功能。
无需特别命名文本框,因为它们很容易按类型区分。
一种解决方案是遍历适当的 ContentControls 并按 name/title:
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
如果您使用富文本内容控件,则需要将 wdContentControlText
替换为 wdContentControlRichText
。
另一种解决方案是遍历适当的 TextBoxes 并按标签复制:
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