Forum Discussion
1 List with 2 dependent Combo boxes...is it possible?
- Aug 14, 2024
cking1333 There's a few ways this can be accomplished. In the following example, I've used a structured Excel table on Sheet1 to hold the 2-column list, and I've named the two combo boxes cboType (parent) and cboOptions (dependent)...
UserForm with Dependent ComboBox
The code used in the module for UserForm1 was:
Option Explicit Private Sub cmdCancel_Click() Unload Me End Sub Private Sub cboType_AfterUpdate() Dim arr As Variant, i As Long, str As String arr = Sheet1.ListObjects(1).DataBodyRange.Value str = Me.cboType.Value Me.cboOptions.Clear For i = LBound(arr, 1) To UBound(arr, 1) If arr(i, 1) = str Then Me.cboOptions.AddItem arr(i, 2) End If Next i End Sub Private Sub UserForm_Initialize() Dim dict As Object, arr As Variant, i As Long, str As String Set dict = CreateObject("Scripting.Dictionary") arr = Sheet1.ListObjects(1).DataBodyRange.Value For i = LBound(arr, 1) To UBound(arr, 1) str = arr(i, 1) If Not dict.Exists(str) Then dict.Add str, str Me.cboType.AddItem str End If Next i Set dict = Nothing End SubWhen the user form is first initialized, the parent combo box is populated with the unique items from column 1. Each time the parent combo box is updated, the dependent combo box is cleared and re-populated with the matching options. Cheers!
cking1333 Only 3 things come to mind that could be causing the "Subscript out of range" error, and all 3 are related to the definition of the arr variable.
(1) Did you format your list data as an Excel table (ListObject)? If not, you can do so by selecting a cell within the list range, then going to Insert > Table on the ribbon (Ctrl+T). Be sure to check "My table has headers", if applicable.
Insert > Table
(2) Is Sheet10 actually Sheet10? Worksheet objects have 2 different name properties: Name and CodeName. The Name property refers to the sheet "tab" shown in the Excel workbook, whereas the CodeName is shown in the Properties Window of the Visual Basic Editor. It's entirely possible for them to differ. When using Sheet10 in this manner, you're referring to the CodeName.
Sheet Name vs CodeName Property
(3) Is there more than one Excel Table (ListObject) on Sheet10? If so, refer to the desired table by name, rather than index number, to make sure you're referencing the correct table (e.g. Sheet10.ListObjects("Table1")). If ListObject(1) only contains a single column, you'll get the "Subscript out of range" error when changing the parent combo box.
So, I didn't realize I needed to set up a table which I have now done. I verified the sheet name per Step 2 of your reply and tried Step 3 but that didn't change any results.
I am now getting a different error:
Run-time error: '-2147467259 (80004005)': Unspecified error.
The section that is highlighted when I select debug is this:
Me.amendedcharge.Clear
When I load the form, the legislation type show up in Combo box 1 (AKA leg) and I can select an option however when I go to select a charge from Combo box 2 (AKA amendedcharge) I get the error.
Also, when I load the form, Combo box 2 shows the legislation types and so does Combo box 1. I have verified the name of box Combo boxes against the code and they match so I'm not sure what I'm doing wrong here.
We got rid of one error which is good but now there's another! 😞
- djclementsAug 15, 2024Silver Contributor
cking1333 The new error you're getting is most likely due to the RowSource property of the amendedcharge combo box. This property should NOT be set. If you've previously set it to reference a range in the workbook, remove the setting (do this with the parent combo box too). The code I've used will programmatically populate both combo boxes, so there is no need to set the RowSource property for either one.
RowSource Property
Hopefully that solves it! 😉
- cking1333Aug 15, 2024Copper Contributor
BOOM!

That's exactly what it was. I copied the Combo Box from another form and didn't even think of that. Nor would ever have thought of that.
Your code works totally awesome now!!! Thanks for your assistance and your patience!!!!