I want the following in Excel:
Two dropdown lists in adjacent cells:
Dropdown list #1 | Dropdown list #1
Dropdown list 1: One Two Three
If I select One in the first cell, the list in the second cell should contain these choices:
One: 1.1 1.2 1.3
If I select Two in the first cell, the list in the second cell should contain these choices:
Two: 2.1 2.2 2.3
And so on. There are a lot of tutorials around, but I’m having some hassle figuring out which of them addresses this exact question.
Update: An example. When selecting f.ex. Group 1 under the Group heading (col A), the entries listed under Group 1 to the right (col D) should appear under the Item heading (col B). And the same for the other Groups.
Update as promised:
When you’re using a List for validation, you have to input a range as shown below.
OFFSET function allows to to dynamically set a range based on its input criteria.
If you consider this:
- Argument 1 = Anchor cell
- Argument 2 = Number of rows to move, you can use minus number here to move rows up and positive numbers to move down
- Argument 3 = Number of columns to move. Negative is left, positive to the right.
- Argument 4 = Height of the range (can’t be negative and is optional, default is 1)
- Argument 5 = Width of the range (can’t be negative and is optional, default is 1)
In this instance, the range returned would be
C1 as we have no row or column offset and height and width is set to 1
MATCH function will return an index of where a value appears in a range of cells (range must be either 1 cell wide or 1 cell high)
Based on the above screen print
=MATCH("Group2",D1:F1,0) will return 2, as “Group2” appears in the second cell in the
D1:F1 range. (“Group1” would return 1, “Group3” would return 3, and “Group4” would return #N/A as it doesn’t exist).
So based on that we can put the
MATCH function in as our 2nd argument in the
OFFSET function, and pick the column that matches the first argument in the
=OFFSET(C1,0,MATCH("Group2",D1:F1,0),1,1) will return back range
E1 as we’ve shifted the columns by 2 from
C1 because of the
=OFFSET(C1,1,MATCH("Group2",D1:F1,0),3,1) will now return back
E2:E4 as we’ve increased the height of the range to 3 and the row offset to 1.
And finally we can change the “Group2” value in the
MATCH function to a cell value that will mean the range will dynamically change.
Here I’ve used Cell
=OFFSET(C1,1,MATCH(A2,D1:F1,0),3,1) so whatever value is in cell
A2 will be used to offset the range.
And the last thing to do is to put the dynamic range into the validation (I used
This will dynamically set the validation range.
When I’m using
OFFSET function with multiple arguments and I’m not sure that it’s returning back the right range, I wrote a small helper User Defined Function that I just put in a VBA module.
Public Function GetAddress(rng As Range) As String GetAddress = rng.Address End Function
This allows me to put the offset formula in and it will return back the range address. So I can make sure it’s right.
There may be a built in function for this, but I’ve never found it.
This solution avoids the use of the volatile
For the first Data
Validation located at
A2 use this formula:
For the second Data
Validation located at
B2 use this formula:
= INDEX( $D$2:$F$4, 0, MATCH( $A$2, $D$1:$F$1, 0 ) )
The second formula uses the value selected from the data
MATCH the corresponding column in
D1:F1 and applies the column number to the
INDEX function to return the whole column in range
INDEX( reference, row number, column number ) returns the entire
row of the
referenceby entering 0 as the
row number or
column number respectively.