从UserForm TextBoxes填充具有相同名称/标签的MS-Word ContentControl文本框?

时间:2017-08-08 19:08:55

标签: vba ms-word word-vba word-2016

我在Microsoft Word(2016,64bit,Windows 10)中创建了一个Visual Basic for Applications程序

它包含一个包含大约30个TextBox的UserForm和一个提交按钮。每个TextBox都有一个唯一的名称和标记。

我在word文档中也有相同数量的ContentControl文本框,每个文本框都与其对应的UserForm TextBox具有相同的标题和标记。

当用户点击提交时,我所使用的是从UserForm TextBox中填充文档文本框的更好方法。

我目前正在通过为每个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

提前谢谢!

2 个答案:

答案 0 :(得分:1)

所有TextBox都存储在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

您需要为文本框命名,以便将它们标识为文本框,然后在写入文本框之前可以检查它们是否为文本框。

答案 1 :(得分:1)

UserForm文本框可以通过Controls类访问,而文档ContentControl文本框可以通过ContentControls属性或SelectContentControlsByTag函数访问。

没有必要特别命名文本框,因为它们很容易通过类型识别。


一种解决方案是循环访问相应的ContentControl并按名称/标题进行复制:

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


另一个解决方案是遍历相应的 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