【发布时间】:2019-03-29 21:40:39
【问题描述】:
我正在尝试使代码在包含重复部分内容控件 (RepSecCC) 的 word 文档中运行,其中包含多个嵌套的 CC。我想编写宏,它会为每个 RepSecCC 生成新的 Word 文档(从模板)并用来自嵌套 CC 的信息填充它。
我当前的代码仅生成一个文档并使用上次 RepSecCC 的信息填充它的问题。我不明白为什么它会跳过所有其他 RepSecCC。我应该在哪里调整我的代码?
Dim objWord As Object
Dim objDoc As Object
Dim pack As String, Reg_No As String, VP_name As String,
Dim CC As Word.ContentControl
Dim rCC As Word.ContentControl
Set objWord = CreateObject("Word.Application")
MsgBox "Document's are generated. Please wait"
For Each rCC In ActiveDocument.ContentControls
If rCC.Title = "New_section" Then
For Each CC In rCC.Range.ContentControls
If CC.Tag = "LI_NO" Then
Reg_No = CC.Range.Text
ElseIf CC.Tag = "VP_pav" Then
VP_name = CC.Range.Text
ElseIf CC.Tag = "Pack" Then
pack = CC.Range.Text
pack = UCase(Left(pack, 1)) & Mid(pack, 2)
End If
Next CC
Set objDoc = objWord.Documents.Add(Template:="S:\bendri\VRS\VRS Administravimas\6 Lygiagretus importas\LI registracijos sarasas\LI_sablonasM.dotm", NewTemplate:=False, DocumentType:=0)
objWord.Visible = True
With objDoc
.ContentControls.Item(1).Range.Text = Reg_No
.ContentControls.Item(2).Range.Text = VP_name
.ContentControls.Item(4).Range.Text = pack
End With
End If
Next rCC
MsgBox "Finished. Please continue"
End Sub
【问题讨论】:
-
比较字符串是一个潜在的雷区,尤其是从 Word 文档中提取其中一个字符串时。使用 Instr 功能更安全。例如,使用 'If Instr(CC.Tag,"LI_NO")>0 Then' 而不是 'If CC.Tag = "LI_NO" Then'。如果您需要精确匹配,请添加一个比较两个字符串长度的子句 'If (Instr(CC.Tag,"LI_NO")>0) AND (len(CC.Tag)=len("LI_ON")) Then '
-
这个文档是如何设置的,真的一点都不清楚。重复部分内容控件是否都具有相同的标题?如果是这样,我将使用 SelectContentControlsByTitle 作为重复部分内容控件并循环生成的数组。事实上,在顶层循环中,您正在循环嵌套控件以及部分控件,这可能会导致意外结果。
-
我重新考虑了我的整个代码并执行了一些测试。结束从头开始重写它(几乎)。你说得对,二级循环不能正常工作。同样重复 CC 部分并没有像我应该的那样工作。我会做更多的测试,将来可能会发布另一个关于它的问题。
标签: vba ms-word word-contentcontrol