2013-09-23 185 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 ' –

相關問題