具有.docm扩展名

时间:2016-02-19 06:07:15

标签: vba ms-word word-vba

我有一个.docm格式的Microsoft Word文档。乍一看它不包含任何宏(如在功能区上单击以下内容时; View - > Macros - > View macros弹出一个具有空列表的窗口)。

但是,在启用Developer功能区选项卡并单击其中的Visual Basic图标,然后从VB窗口的下拉列表中选择DocumentContentControlonEnter时,请执行以下操作代码出现:

Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl)
Dim i As Long, j As Long
With ActiveDocument
  If ContentControl.Title = "Classification" Then
ContentControl.DropdownListEntries.Clear
For i = 1 To .ContentControls.Count
  If Left(.ContentControls(i).Title, 5) = "Level" Then
    j = j + 1
    ContentControl.DropdownListEntries.Add Text:=j & " - " & .ContentControls(i).Range.Text
  End If
Next
  End If
End With
End Sub

选择下拉列表中的其他选项仅提供“空白”代码(即它们仅包含函数声明,后跟End关键字)。

我的问题是代码的意图是什么?

*

  • 详细说明:
  • 相关Word文档包含指向同一文档部分的超链接以及指向同一文件夹的Word文件和Excel文件的几个链接。它还包含许多内容控制框,我猜这是代码的重点(因为代码包含ContentControl关键字)

2 个答案:

答案 0 :(得分:2)

内容控件可以在用户进入和退出时触发宏。 Microsoft做出了设计决定,即所有内容控件都应触发相同的“事件” - Document_ContentControlOnEnter / Document_ContentControlOnExit - 并且事件中的代码需要检查输入/退出的内容控件。

内容控件被视为文档的一部分,因为文档可以触发事件。这就是为什么他们在(并且必须在)ThisDocument 模块中。

(注意:查看宏只能显示没有参数的PUBLIC SUB过程,这些参数位于“普通”代码模块中。任何私有子,任何函数,任何带参数的东西以及类模块中的任何内容都不会出现在那个列表。所以你不能使用该列表来确定文档是否包含任何代码。)

If ContentControl.Title = "Classification" Then检查输入了哪些内容控件。 (注意:使用Select Case而不是If通常更有意义,特别是当事件需要区分多个内容控件时。)If中的内容只有在具有Title“Classification”的内容控件时才会执行。 (请注意,多个内容控件可以具有相同的标题,因此可以运行多个内容控件。)

如果输入了另一个内容控件,事件仍然会被触发,但没有任何反应(在这种情况下)。

Catalin Pop正确地解释说,代码实际上是“重置”下拉列表。

旧版表单字段使用类似的模式 - 当用户进入/退出表单字段时,宏可以触发。但是设计的原因是您必须创建一个Public Sub并将其分配给Properties中的表单字段。

答案 1 :(得分:1)

我认为这里的逻辑非常简单。 基本上,代码在整个文档中搜索名为Classification的内容控件。 找到它之后,它会清除所有的drowdown条目 - 比如重置。 在清理部分之后,它再次在整个文档中搜索以“Level”开头的所有内容控件,并收集这些控件的文本及其外观顺序。

收集此信息后,填写上面的分类控制的下拉菜单。 (例如,1级X,2级Y .. - 基于它在文档中找到的名称中以Level开头的控件)