如何从 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 控件并插入书签。