2016-11-15 40 views
0

我在工作表上使用'生成'按鈕。當我點擊按鈕時,會彈出一個窗體(窗體),其中包含兩個組合框。根據第一個組合框中的選擇,第二個組合框選項列表已填充。如何使組合框項目列表動態化?

對於第一個組合框,當我硬編碼項目值時,它工作正常。表單代碼如下:

Private Sub UserForm_Initialize() 

With ComboBox_DL 
    .AddItem "DL1" 
    .AddItem "DL2" 
End With 

End Sub 

我試圖使這個項目清單動態由一列獲取組合框項值的使用下面的表單代碼Excel工作表:

Private Sub UserForm_Initialize() 

With ComboBox_DL 
For Each c In ActiveSheet.Range(Range("AE"), Range("AE").End(xlDown)) 
.AddItem c.Value 
Next 
End With 

End Sub 

但上面的代碼拋出錯誤:運行時錯誤「1004」:對象的方法'範圍「_Global」失敗

I modified the code adding sheet details: 
With ComboBox_DL 
    For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range(Range("AE"), Range("AE").End(xlDown)) 
     .AddItem c.Value 
Next 

它仍然拋出了同樣的錯誤。

有人可以幫忙嗎?另外,我想知道如何查找與combobox1中的選擇對應的值,並在combobox2中填充列表?

回答

0

如果你的組合框條目是工作表上的一個列表,您不需要使用VBA來填充它們。相反,您可以創建一個動態命名範圍,並將其用作ComboBox的Rowsource。

假設您的列表從Sheet3的A1單元格開始。轉到公式|名稱管理器創建一個命名範圍。給它一個有用的名稱,如「Combo」,然後將下列公式放入RefersTo:=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet3!$A:$A),1)保存並關閉命名範圍對話框。

在您的組合框的屬性中,查找「RowSource」行。將其設置爲=Combo或您用於命名範圍的任何名稱。

對列表的任何更改(包括延長或縮短列表)現在都會立即自動反映在組合框中。

編輯補充:

要使用在第一個組合框中選擇的值,以確定哪些列表在第二組合框使用,我們需要做兩件事情。

首先是在第一列表中的所有可能的選擇創建一個名爲範圍:
enter image description here

在圖像中,列A是我們的第一個組合框的源;其他列包含第二個組合框的可能來源。

然後我們只需要把代碼一點點在第一組合框Change事件:每當ComboBox1改變

Private Sub ComboBox1_Change() 
    Me.ComboBox2.Value = "" 
    Me.ComboBox2.RowSource = "=" & Me.ComboBox1.Value 
End Sub 

此代碼將被觸發。首先清除ComboBox2中的任何現有值,然後將ComboBox2的行源屬性設置爲=符號的組合,並在第一個框中選擇任何值。由於這些值也是命名範圍,因此第二個框將使用選定的命名範圍作爲其列表源。

如果需要,您可以添加更多級聯選項級別,併爲每個選項指定不同的命名範圍。然而,超過幾個級別可能會變得難以管理 - 在這一點上,我們可能想要看另一種方法。

+0

謝謝Werf。如何顯示包含第一個組合框中的選擇列表的第二個組合框? –

+0

通常情況下,如果我們使用數據驗證下拉菜單執行此操作,則只需根據第一個範圍內的可能值創建其他命名範圍,然後使用指向第一個範圍的源結果的間接公式其他。 Comboboxes在表單上,​​它稍微複雜一些;我將編輯爲您包含一些代碼。 – Werrf

+0

@Werf - 它工作。乾杯! –

1

未經測試,因爲我還沒有創建用戶表單在相同的條件下測試,但應該工作受到較小的改動。

Dim n As Long 
n = Sheets("Business_Input_Data").Cells(Rows.Count, "AE").End(xlUp).Row 

With ComboBox_DL 
    For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range("AE" & n) 
     .AddItem c.Value 
Next 
+0

感謝mo.h如何顯示第二個組合框,其中包含列表的基礎上第一個組合框的選擇?假設我有一個DL名稱和相應的combobox2列表選項的表格? –

+0

不是問題!如果您發現它有用,請將其標記爲答案:)。關於你上面的問題,你是什麼意思?請澄清 – user1

+0

在同樣的形式中,我有另一個combobox2,它列出了取決於我在combobox1中選擇的值。假設DL1對應於A1,B1,C1項目。而DL2對應於A2,B2,C2。如果我在組合框1中選擇DL1,組合框應僅列出選項A1,B1和C1。類似地,對於combobox1中選擇的DL2,combbox2應列出A2,B2和C2。 –

1

你錯過了行索引 「AE」 任何Range參考此外總是使用明確的工作資格

Private Sub UserForm_Initialize() 
    Dim c As Range 

    With ComboBox_DL 
     For Each c In For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range(ThisWorkbook.Worksheets("Business_Input_Data").Range("AE1"), ThisWorkbook.Worksheets("Business_Input_Data").Range("AE1").End(xlDown)) 
     .AddItem c.Value 
     Next 
    End With 
End Sub 

但更優雅的解決方案是:

Private Sub UserForm_Initialize()   
    With ThisWorkbook.Worksheets("Business_Input_Data") 
     ComboBox_DL.RowSource = .Range("AE1", .Range("AE1").End(xlDown)).Address 
    End With   
End Sub 


Private Sub UserForm_Initialize()   
    With ThisWorkbook.Worksheets("Business_Input_Data") 
     ComboBox_DL.List = .Range("AE1", .Range("AE1").End(xlDown)).Value 
    End With   
End Sub 

哪裏:

  • 結合ComboBox列表的範圍值,其地址是作爲ComboBoxRowSource財產

  • 後者則採用給定範圍的值作爲Combobox

+0

非常感謝。如何只填充組合框2中的特定值基於combobox1中的選擇? –

+0

這是一個新問題,然後發佈新問題 – user3598756

相關問題