如何通过VBA填充Type5(wdContentControlBuildingBlockGallery)内容控件?
解决Word VBA填充wdContentControlBuildingBlockGallery(Type5)控件的问题
问题根源
wdContentControlBuildingBlockGallery(Type=5)属于构建块库控件,和下拉列表控件(Type=3)的机制完全不同——它根本没有DropdownListEntries属性,所以你之前写的cc.DropdownListEntries(1).Text必然会报错。
两种解决方案
根据你的需求,提供两种可行的实现方式:
1. 插入控件关联构建块库的第一个构建块
如果你的目标是调用该控件预设构建块库中的第一个内容,可以通过模板的构建块集合获取并插入:
ElseIf cc.Type = 5 Then Dim bbColl As BuildingBlocks ' 获取控件绑定的构建块分类集合 Set bbColl = wrdDoc.AttachedTemplate.BuildingBlockTypes(cc.BuildingBlockType).Categories(cc.BuildingBlockCategory).BuildingBlocks ' 集合不为空时插入第一个构建块 If bbColl.Count > 0 Then bbColl(1).Insert cc.Range, True End If End If
2. 直接填充自定义文本
如果不需要依赖预设构建块,只是想给控件填充指定文本,直接用你熟悉的Range.Text即可,逻辑和处理其他控件一致:
ElseIf cc.Type = 5 Then ' 示例:从工作表取值,也可以直接写死文本 cc.Range.Text = ThisWorkbook.Sheets("Stella").Cells(XX, XX).Value End If
整合后的完整代码
把方案整合到你的原有代码中,示例如下:
For Each cc In wrdDoc.ContentControls If cc.Title = "DockID" Then cc.Range.Text = ThisWorkbook.Sheets("Stella").Cells(20, 1).Value ElseIf cc.Title = "Adress" Then cc.Range.Text = ThisWorkbook.Sheets("Stella").Cells(10, 1).Value ElseIf cc.Title = "Postnr" Then cc.Range.Text = ThisWorkbook.Sheets("Stella").Cells(11, 1).Value ElseIf cc.Title = "Namn" Then cc.Range.Text = ThisWorkbook.Sheets("Stella").Cells(4, 1).Value ElseIf cc.Title = "Date" Then cc.Range.Text = Format(Date, "yyyy-mm-dd") ElseIf cc.Title = "dueDate" Then Dim dueDate As Date dueDate = DateAdd("d", 24, Date) ' 跳过周末,确保到期日为工作日 While Weekday(dueDate, vbMonday) >= 6 dueDate = DateAdd("d", 1, dueDate) Wend cc.Range.Text = Format(dueDate, "yyyy-mm-dd") ElseIf cc.Type = 5 Then ' 二选一:要么插入构建块,要么直接设置文本 ' --- 插入构建块的方式 --- Dim bbColl As BuildingBlocks Set bbColl = wrdDoc.AttachedTemplate.BuildingBlockTypes(cc.BuildingBlockType).Categories(cc.BuildingBlockCategory).BuildingBlocks If bbColl.Count > 0 Then bbColl(1).Insert cc.Range, True End If ' --- 直接设置文本的方式(注释上面的代码后启用)--- ' cc.Range.Text = "你需要填充的文本内容" End If Next cc
注意事项
- 使用构建块方式时,要确保控件的
BuildingBlockCategory和BuildingBlockType配置正确,且模板中存在对应的构建块 - 直接设置文本的方式会覆盖控件原有内容,适合不需要依赖预设构建块的场景
内容的提问来源于stack exchange,提问作者Ben Dover
相关产品推荐
相关产品推荐

