2013-09-23 162 views
3

我正在尝试为Excel表格创建一个过滤器。我有2个下拉框,其中的项目列表动态地添加到一个在刷新表时调用的宏中。如何从Excel中的代码设置下拉选择(VBA)

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

For Each b In books 
     selectBook.AddItem (b) 
Next 

其中“books”是具有新值的数组。其他与“作者”下拉的代码类似。 运行此宏后,没有显示初始选择。我附加了一个宏到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. 

,但没有任何工作。我错过了明显的东西吗?任何帮助将不胜感激。

+0

奇怪的是它适用于我...... –

+0

我可以看到您的文件吗?如果是的话,然后上传到任何文件共享网站,并在这里分享链接.. –

+0

不幸的是,它是商业敏感的,所以我不能发布真正的文件,并没有模拟复制错误。哪个选项是应该工作的选项? .ListIndex = 0? – user2808401

回答

1

我意识到自从发布这个问题已经有一段时间了,但由于它没有答案,我会尽我所能提供一个答案。

与其逐一添加项目,您可以一次添加所有项目。首先创建一个'书签',所有选项用逗号分隔,然后将其添加到单元格中。看下面的例子。

' 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 
+0

感谢您的代码。 我想在上面添加一个初始化,因为我的VBA版本需要这样做。 ' Dim books as Variant Dim booklist As String ' –

相关问题