我在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
提前谢谢!
答案 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