SelectContentControlsByTitle和.item()如何工作?

时间:2017-09-13 16:06:36

标签: vba excel-vba word-vba excel

[英语不是我的第一语言]

我正在开发一个Word文档,用户在内容控件富文本框中输入信息。然后,这些输入将显示为下方几个下拉列表(组合框)中的选项。

看起来如下:

位置:
[在此处插入位置1]
[在此处插入位置2]
[在此处插入位置3]
[在此处插入位置4]
[在此处插入位置5]


(每个人的CC标题是" LocationMenu")
(每个人的CC标签必须是" Header")

用户可以使用一个或多个位置。

我正在编写一个循环,它将检查已填充的内容控件的数量,然后将使用填充的内容控件作为下拉列表的列表条目。我的计划是在初始菜单中为每个内容控件使用相同的TITLE,然后遍历.SelectContentControlsByTitle(" LocationMenu")。Item(x)。

然而......

为什么当我尝试这个时:

MsgBox (ActiveDocument.SelectContentControlsByTitle("LocationMenu").Item(2).Range.Text)

我[在此处插入位置3]而不是[在此处插入位置2]?

当我尝试:

MsgBox (ActiveDocument.SelectContentControlsByTitle("LocationMenu").Item(1).Range.Text)

我在[此处插入位置2]而不是[在此处插入位置1]?

(它也不是数组启动时的问题)

有人可以向我提供有关如何使用" item()"的详细信息。代码的一部分?人们似乎通过为每个内容控件添加一个唯一的标题并将.item(x)保留在.item(1)...来解决它...但这不会起作用我想做什么......我们如何使用.item(x)???

非常感谢你

这是我咨询的页面,但没有找到答案:

http://www.vbaexpress.com/forum/archive/index.php/t-50894.html

http://gregmaxey.com/word_tip_pages/interactive_userforms.html

msdn.microsoft.com的东西没有帮助。 无法找到Stack Overflow的答案......

1 个答案:

答案 0 :(得分:1)

关于Item属性和迭代集合类型

按照惯例,Item是在[可以/应该]包含对象引用的集合对象类型中定义的特殊Property Get成员。

如果您可以查看该属性getter的定义,您会看到如下内容:

Public Property Get Item(ByVal index As Variant) As Variant
Attribute Item.VB_Description = "Gets or sets the element at the specified index."
Attribute Item.VB_UserMemId = 0
    'implementation
End Property

Attribute Item.VB_UserMemId = 0隐藏属性将COM类型成员的DispId属性设置为0,使其成为类' 默认会员

换句话说:

Debug.Print myCollection.Item(1).Range.Text

与此完全相同:

Debug.Print myCollection(1).Range.Text

Item属性如何与给定索引一起使用的具体细节是特定于实现的,即取决于集合类的实现方式。

但是所有集合类都有一个共同点,就是隐藏的[_NewEnum]属性,其隐藏属性为VB_UserMemId = -4,告诉VB6 / VBA使用该方法获取枚举器用于迭代该集合。

如何使用For Each循环迭代集合。

它的效率非常高。比使用For循环通过索引迭代集合快〜27倍。

使用它!

Dim ctrl As ContentControl
For Each ctrl In ActiveDocument.SelectContentControlsByTitle("LocationMenu")
    Debug.Print ctrl.Range.Text
Next

您的问题(及其解决方案)

现在,问题在于您认为您正在迭代下拉列表项,但您实际上正在迭代ContentControl项,.Range.Text是什么返回是每个控件中的当前值(即ActiveDocument不仅包含一个标题为" LocationMenu")的下拉内容控件。

如果要迭代下拉值,则需要查看ContentControl.DropdownListEntries集合:

Dim ctrl As ContentControl
For Each ctrl In ActiveDocument.SelectContentControlsByTitle("LocationMenu")
    Dim ddItem As ContentControlListEntry
    For Each ddItem In ctrl.DropdownListEntries
        Debug.Print ddItem.Text, ddItem.Value
    Next
Next