我有一个.docm
格式的Microsoft Word文档。乍一看它不包含任何宏(如在功能区上单击以下内容时; View
- > Macros
- > View macros
弹出一个具有空列表的窗口)。
但是,在启用Developer
功能区选项卡并单击其中的Visual Basic
图标,然后从VB窗口的下拉列表中选择Document
和ContentControlonEnter
时,请执行以下操作代码出现:
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
关键字)。
我的问题是代码的意图是什么?
*
ContentControl
关键字)答案 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开头的控件)