【问题标题】:Populate MS-Word ContentControl Text Boxes from UserForm TextBoxes with same name/tag?从具有相同名称/标签的用户窗体文本框填充 MS-Word ContentControl 文本框?
【发布时间】:2017-08-08 19:08:55
【问题描述】:

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

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

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

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

我目前通过为每个 TextBox 键入 3 行代码来执行此操作,但这很乏味。我每次复制并粘贴这 3 行代码,但每次都必须编辑每行的一小部分。

我考虑过使用循环,如下面的代码所示,我使用变量x 按名称复制文本框,但我不确定如何继续。

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

提前谢谢你!

【问题讨论】:

    标签: vba ms-word word-2016


    【解决方案1】:

    用户窗体文本框可通过Controls 类访问,而文档内容控制文本框可通过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


    另一种解决方案是循环通过适当的 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
    

    【讨论】:

    • 我只是重写了这个问题。我希望它会更好!如果你认为它是并且你想要它,你可以请你投票!谢谢!我已经想通了,但想把它做得更好,以防其他人需要帮助!
    【解决方案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
    

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

    【讨论】:

    • 我只是重写了这个问题。我希望它会更好!如果你认为它是并且你想要它,你可以请你投票!谢谢!你已经帮我弄清楚了,但我想让它变得更好,以防其他人将来需要帮助!也感谢您为我节省了这么多时间!
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多