如何从 VBA (Word) 中的 Legacy 下拉结果中填充 ComboBox
How to populate a ComboBox from a Legacy dropdown result in VBA (Word)
我有一个 Word 表单(不是用户表单),其中包含 Legacy DropDownList (FormField ).
我可以使用我为它们设置的书签来访问它们。 (例如:书签为 "bookmark")
ActiveDocument.FormFields("bookmark")
我使用了 Legacy 下拉列表 而不是 ActiveX ComboBox 因为我需要更改其他 Legacy 的值dropdowns 使用彼此的 Result 等等。
例如:
If ActiveDocument.FormFields("bookmark").Result <> "whatever" Then
Select Case ActiveDocument.FormFields("bookmark").Result
Case "Test"
With ActiveDocument.FormFields("bookmark2").DropDown.ListEntries
.Clear
.Add "Whatever string I want"
.Add "Another string I need"
End With
'Let's not put them all but there is more cases than one
End Select
End If
换句话说,下一篇的内容取决于上一篇的内容。
也就是说,我现在需要对这些 Dropdowns 中的最后一个做一些多 selection。问题是,根据我所阅读的内容,我无法使用 Legacy Dropdowns 执行 multi-select。根据我的阅读,再次使用 ActiveX ComboBox 是可能的。
问题是,我制作 "dependant" 下拉菜单的方式是,当用户 select 是一个值时,调用 模块 来执行以上代码。不幸的是,我不能在这些 Modules 中使用 ActiveX ComboBox,只能在 ThisDocument 中使用。如果可以的话,我只需要更改
ActiveDocument.FormFields("bookmark2").DropDown.ListEntries
为
Me.ComboBoxWhatever
,
使用 AddItem 而不是 Add 并找到如何从那里进行 multi-selection。但我不能。
据我所知 tried/read,我无法从 ThisDocument 调用 Sub 方法(在用户 selects 来自 Legacy Dropdowns.
的值之后,这里会执行我需要使用 ComboBox 的代码)
当用户 select 从 Legacy Dropdowns 中获取值时,我如何才能做到这一点,我可以检查 Result 并用适当的值填充我的 ActiveX ComboBox,这样用户就可以 select 从 ComboBox ?
编辑: Cindy Meister 的回答适用于任何 ActiveX 控件,例如 ListBox 等。
您可以通过 InlineShape 或包含它的 Shape 对象访问 ThisDocument
之外的 ActiveX 控件。 Word 通过 "wrapping" 图形对象中的非 Word 内容来管理它们。
这里有一些示例代码,演示了如何使用 "normal" 模块中的过程将项目添加到组合框列表的末尾。请注意它如何使用 OLEFormat.Object
获取 "into" ActiveX 控件的属性和方法。
Sub AddItemToExistingCombo()
Dim doc As word.Document
Dim obj1 As String, oIndex As Long
Dim of As word.OLEFormat
Dim cb As ComboBox
Set doc = ActiveDocument
Set of = ActiveDocument.InlineShapes(1).OLEFormat
'Set of = ActiveDocument.Bookmarks("combobox").Range.InlineShapes(1).OLEFormat
Set cb = of.Object
If Not cb Is Nothing Then
oIndex = cb.ListCount
obj1 = "item" & oIndex + 1
cb.AddItem obj1, oIndex
End If
End Sub
当然,使用 InlineShape 的索引值并不理想,您可能需要 select 并添加书签。为此,请进入 "Design mode"、select 控件并插入书签。
我有一个 Word 表单(不是用户表单),其中包含 Legacy DropDownList (FormField ).
我可以使用我为它们设置的书签来访问它们。 (例如:书签为 "bookmark")
ActiveDocument.FormFields("bookmark")
我使用了 Legacy 下拉列表 而不是 ActiveX ComboBox 因为我需要更改其他 Legacy 的值dropdowns 使用彼此的 Result 等等。
例如:
If ActiveDocument.FormFields("bookmark").Result <> "whatever" Then
Select Case ActiveDocument.FormFields("bookmark").Result
Case "Test"
With ActiveDocument.FormFields("bookmark2").DropDown.ListEntries
.Clear
.Add "Whatever string I want"
.Add "Another string I need"
End With
'Let's not put them all but there is more cases than one
End Select
End If
换句话说,下一篇的内容取决于上一篇的内容。
也就是说,我现在需要对这些 Dropdowns 中的最后一个做一些多 selection。问题是,根据我所阅读的内容,我无法使用 Legacy Dropdowns 执行 multi-select。根据我的阅读,再次使用 ActiveX ComboBox 是可能的。
问题是,我制作 "dependant" 下拉菜单的方式是,当用户 select 是一个值时,调用 模块 来执行以上代码。不幸的是,我不能在这些 Modules 中使用 ActiveX ComboBox,只能在 ThisDocument 中使用。如果可以的话,我只需要更改
ActiveDocument.FormFields("bookmark2").DropDown.ListEntries
为
Me.ComboBoxWhatever
,
使用 AddItem 而不是 Add 并找到如何从那里进行 multi-selection。但我不能。
据我所知 tried/read,我无法从 ThisDocument 调用 Sub 方法(在用户 selects 来自 Legacy Dropdowns.
的值之后,这里会执行我需要使用 ComboBox 的代码)当用户 select 从 Legacy Dropdowns 中获取值时,我如何才能做到这一点,我可以检查 Result 并用适当的值填充我的 ActiveX ComboBox,这样用户就可以 select 从 ComboBox ?
编辑: Cindy Meister 的回答适用于任何 ActiveX 控件,例如 ListBox 等。
您可以通过 InlineShape 或包含它的 Shape 对象访问 ThisDocument
之外的 ActiveX 控件。 Word 通过 "wrapping" 图形对象中的非 Word 内容来管理它们。
这里有一些示例代码,演示了如何使用 "normal" 模块中的过程将项目添加到组合框列表的末尾。请注意它如何使用 OLEFormat.Object
获取 "into" ActiveX 控件的属性和方法。
Sub AddItemToExistingCombo()
Dim doc As word.Document
Dim obj1 As String, oIndex As Long
Dim of As word.OLEFormat
Dim cb As ComboBox
Set doc = ActiveDocument
Set of = ActiveDocument.InlineShapes(1).OLEFormat
'Set of = ActiveDocument.Bookmarks("combobox").Range.InlineShapes(1).OLEFormat
Set cb = of.Object
If Not cb Is Nothing Then
oIndex = cb.ListCount
obj1 = "item" & oIndex + 1
cb.AddItem obj1, oIndex
End If
End Sub
当然,使用 InlineShape 的索引值并不理想,您可能需要 select 并添加书签。为此,请进入 "Design mode"、select 控件并插入书签。