[英语不是我的第一语言]
我正在开发一个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的答案......
答案 0 :(得分:1)
按照惯例,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