如何在Excel(VBA)中设置从代码中选择的下拉列表

如何在Excel(VBA)中设置从代码中选择的下拉列表,vba,excel,drop-down-menu,Vba,Excel,Drop Down Menu,我正在尝试为Excel表制作一个过滤器。我有两个下拉框,其中项目列表动态添加到宏中,该宏在刷新表时调用 Set selectBook = Worksheets("Report").DropDowns("DropDownBook") selectBook.RemoveAllItems For Each b In books selectBook.AddItem (b) Next 其中“books”是一个具有新值的数组。另一个带有“authors”的下拉列表的代码与此类似。 运行

我正在尝试为Excel表制作一个过滤器。我有两个下拉框,其中项目列表动态添加到宏中,该宏在刷新表时调用

Set selectBook = Worksheets("Report").DropDowns("DropDownBook")
selectBook.RemoveAllItems

For Each b In books
        selectBook.AddItem (b)
Next
其中“books”是一个具有新值的数组。另一个带有“authors”的下拉列表的代码与此类似。 运行此宏后,不会显示初始选择。我在dropdownchange事件中附加了一个宏,用于读取两个下拉列表中的选择

Set books = Worksheets("Report").DropDowns("DropDownBook")
bookSelect = books.List(books.ListIndex)
并进行必要的过滤。问题是,如果我选择了作者,宏将在上面给出的第二行代码中用

Run time error '1004':
Unable to get the List property of the DropDown class
如果我选择一本书,它也会为作者做同样的事情。我猜这是因为框中没有初始选择,但我似乎找不到一种方法如何在代码中进行选择。我试过了

selectBook.ListIndex = 0, selectBook.Value=0 etc.

,但没有任何效果。我错过了什么明显的东西吗?任何帮助都将不胜感激。

我意识到这个问题发布已经有一段时间了,但由于没有答案,我将尽力提供答案

您可以一次添加所有项目,而不是逐个添加项目。首先创建一个“图书列表”,所有选项用逗号分隔,然后将其添加到单元格中。请参见下面的示例

' Create option list
books = Array("The Very Hungry Caterpillar", "A Christmas Carol", "Ulysses")
booklist = Join(books, ",")

' Set drop down list
With Sheets("Books").Cells(1, 1).Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=booklist
End With
您可以将其包装成一个单独的过程,在需要动态添加下拉列表时可以调用该过程

Sub SetDropDown(cellRef As Range, valueArray As Variant)

    ' Declare variables
    Dim valueFormula

    ' Create formula
    valueFormula = Join(valueArray, ",")

    ' Set dropdown
    With cellRef.Validation
        .Delete
        .Add Type:=xlValidateList, Formula1:=valueFormula
    End With

End Sub

奇怪,它对我有用……我可以看看你的档案吗?如果是,则将其上载到任何文件共享网站并在此处共享链接。不幸的是,它对业务敏感,因此我无法发布真实文件,也没有复制错误的模拟。哪个选项应该有效。ListIndex=0?这也是。。这也是
bookSelect=books.List(books.ListIndex)
感谢您的示例。我想到了如何让它工作。在我选择索引之前,应该选择Book.ListIndex=1来选择第一个项目(我仍然觉得奇怪),然后选择Application.ScreenUpdate=True,而不是在选择索引之后。谢谢您的代码。我想在上面添加一个初始化,因为我的VBA版本需要这样做变暗书本作为变量变暗书本列表作为字符串`