2

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

它由一个带有大约 30 个文本框的用户窗体和一个提交按钮组成。每个文本框都有一个唯一的名称和标签。

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

当用户单击提交时,我所追求的是一种更好的方法来从 UserForm TextBoxes 填充文档文本框。

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

先感谢您!

4

2 回答 2

2

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,则需要替换wdContentControlTextwdContentControlRichText.


另一种解决方案是遍历适当的文本并按标签复制:

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
于 2017-08-17T09:38:49.080 回答
1

所有的文本框都存储在一个 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

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

于 2017-08-08T20:28:09.197 回答