Home > Validation > Drop Downs > Combo Box Data Validation Combo Box using Named RangesFor Excel data entry, overcome the limitations of a data validation drop down list, by using a combo box, that refers to named ranges which contain the list items. NOTE: You can't use ActiveX controls on a Macintosh. Prof. Lee Townsend shows how to create drop downs using Form control combo boxes. |
You can use Data Validation to create a dropdown list of options in a cell.
However, the built-in drop down has several limitations:
To overcome these limitations, you can add a combo box to your worksheet, and use programming to make it appear for cells that contain a data validation list.
With this combo box feature added, you can:
Note: If the worksheet is protected, allow users to Edit Objects, and they will be able to use the combobox.
To see how the combo box works, and appears when you double-click a data validation cell, watch this short video.
Two worksheets are required in this workbook.
IMPORTANT: Keep both sheets (ValidationSample and ValidationLists) at the same zoom setting, to avoid crashing Excel. There is a strange bug connected to combo boxes and zoom levels, in some versions of Excel.
On the ValidationLists sheet, type the lists that will be used in the data validation dropdowns:
Tip: Use the AutoFill feature to create the drop-down list of weekdays and months
Next, you'll create names for the cells that contain the lists.
If your lists are on the worksheet, but NOT in a named Excel table, follow these steps.
NOTE: There are Naming instructions here: Name a Range
If your lists are in named Excel tables, you'll need to create a second set of names.
Otherwise, the combo box lists will be empty.
See detailed instructions on the Excel Worksheet Comboboxes page.
The next step is to create the dropdown lists. There are detailed instructions here: Excel Data Validation Introduction
To add or edit the Combobox, follow these steps:
To format the combo box, open the properties window:
Visual Basic for Applications (VBA) code is required to make the combo box appear when you double-click in a cell that contains a data validation list. See details in the next section, for How the Code Works.
Copy the following code
NOTE: For dates or numbers in the data validation, you can use the KeyDown code in the Code for Numbers section below.
'========================== Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, _ Cancel As Boolean) Dim str As String Dim cboTemp As OLEObject Dim ws As Worksheet Set ws = ActiveSheet Set cboTemp = ws.OLEObjects("TempCombo") On Error Resume Next With cboTemp 'clear and hide the combo box .ListFillRange = "" .LinkedCell = "" .Visible = False End With On Error GoTo errHandler If Target.Validation.Type = 3 Then 'if the cell contains 'a data validation list Cancel = True Application.EnableEvents = False 'get the data validation formula str = Target.Validation.Formula1 str = Right(str, Len(str) - 1) With cboTemp 'show the combobox with the list .Visible = True .Left = Target.Left .Top = Target.Top .Width = Target.Width + 5 .Height = Target.Height + 5 .ListFillRange = str .LinkedCell = Target.Address End With cboTemp.Activate 'open the drop down list automatically Me.TempCombo.DropDown End If errHandler: Application.EnableEvents = True Exit Sub End Sub '========================================= Private Sub TempCombo_LostFocus() With Me.TempCombo .Top = 10 .Left = 10 .Width = 0 .ListFillRange = "" .LinkedCell = "" .Visible = False .Value = "" End With End Sub '==================================== 'Optional code to move to next cell 'if Tab or Enter are pressed 'from code by Ted Lanham '***NOTE: if KeyDown causes problems, 'change to KeyUp 'Table with numbers for other keys 'such as Right Arrow (39) 'https://msdn.microsoft.com/en-us/ library/aa243025%28v=vs.60%29.aspx Private Sub TempCombo_KeyDown(ByVal _ KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) Select Case KeyCode Case 9 'Tab ActiveCell.Offset(0, 1).Activate Case 13 'Enter ActiveCell.Offset(1, 0).Activate Case Else 'do nothing End Select End Sub '====================================
Here are some details on how the code works.
This code runs when a cell is double-clicked.
Variables are set for the active sheet, and the combo box named TempCombo -- be sure to use that name for your combo box.
Set ws = ActiveSheet Set cboTemp = ws.OLEObjects("TempCombo")
The combo box is hidden, and its linked cell and ListFillRange are cleared.
With cboTemp 'clear and hide the combo box .ListFillRange = "" .LinkedCell = "" .Visible = False End With
The data validation type for the Target cell (the active cell) is checked. If it is Type 3 (a drop down list), the rest of the code runs.
If Target.Validation.Type = 3 Then
The str variable gets the data validation formula for the Target cell. For example: "=MonthList". Then, the equal sign is removed, by using the Right function. That leaves just the Range name for the data validation list -- "MonthList"
str = Target.Validation.Formula1 str = Right(str, Len(str) - 1)
The combo box is made visible, an is positioned at the top left of the Target cell
With cboTemp 'show the combobox with the list .Visible = True .Left = Target.Left .Top = Target.Top
The combo box width and height are determined by the Target cell's width and height, with a small amount added. You can change the "+5" to a different number:
.Width = Target.Width + 5 .Height = Target.Height + 5
The ListFillRange is changed to the str variable -- MonthList -- so the combo box will show the items from that named range.
.ListFillRange = str
The LinkedCell is changed to the Target cell's address.
.LinkedCell = Target.Address
The combo box is activated, and the drop down list is opened.
cboTemp.Activate Me.TempCombo.DropDown End If
This code runs when you exit the combo box
The combo box is hidden, moved to the top left of the worksheet, and its linked cell and ListFillRange are cleared.
With Me.TempCombo .Top = 10 .Left = 10 .Width = 0 .ListFillRange = "" .LinkedCell = "" .Visible = False .Value = "" End With
IMPORTANT: Keep both sheets (ValidationSample and ValidationLists) at the same zoom setting, to avoid crashing Excel. There is a strange bug connected to combo boxes and zoom levels.
If you decide to change the combo box properties later, it might be difficult to find the combo box on the worksheet, because the code changes its width to zero.
Follow these steps to locate the combo box, and adjust its properties:
NOTE: The combo box width and height are set in the macro -- changing these values in the property window will not have a long term effect. Edit the code, if you want the size to change.
The values that you select in a combo box are treated as text, and that can cause problems if your drop down list contains numbers (including dates and times).
In the screen shot below, a time has been selected from the combo box list. Even though the cell is formatted for Time, the cell contains a long decimal number. The entry is really text, not a number, so that's why the number formatting is not applied to it.
If you're using the combo box for numbers, you can add a bit more code to your workbook.
NOTE: If you alternate between using the keyboard, and using the mouse, you can add the code from both sections.
If you use the Tab or Enter key to leave the combo box, use the following code, instead of the TempCombo_KeyDown code above.
Then, after you select a number (or date or time) in the combo box drop down list, press the Enter key or the Tab key, to move to the next cell.
This code will run, and it will change the text value to a real number. Then it will activate the cell below, if you pressed Enter, or it will activate the cell to the right, if you pressed Tab.
'==================================== 'Optional code to move to next cell 'if Tab or Enter are pressed 'from code by Ted Lanham '***NOTE: if KeyDown causes problems, 'change to KeyUp Private Sub TempCombo_KeyDown(ByVal _ KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) 'move to next cell on Enter and Tab Dim varVal As Variant On Error Resume Next 'change text value to number, if possible varVal = --ActiveCell.Value If IsEmpty(varVal) Then varVal = ActiveCell.Value End If Select Case KeyCode Case 9 'tab ActiveCell.Value = varVal ActiveCell.Offset(0, 1).Activate Case 13 'enter ActiveCell.Value = varVal ActiveCell.Offset(1, 0).Activate Case Else 'do nothing End Select End Sub '====================================
If you use the Mouse to leave the combo box, use the following code, instead of the TempCombo_LostFocus code above.
Then, after you select a number (or date or time) in the combo box drop down list, press the Enter key or the Tab key, to move to the next cell.
This code will run, and it will change the text value to a real number.
'==================================== Private Sub TempCombo_LostFocus() ''if you use mouse to select in '' combo box, use this code '' to change text to real numbers Dim varVal As Variant On Error Resume Next If Not myCell Is Nothing Then 'change text value to number, ' if possible If myCell.Value <> "" Then varVal = --myCell.Value If IsEmpty(varVal) Then varVal = myCell.Value End If myCell.Value = varVal End If Set myCell = Nothing End If With Me.TempCombo .Top = 10 .Left = 10 .Width = 0 .ListFillRange = "" .LinkedCell = "" .Visible = False .Value = "" End With End Sub '====================================
If some of your drop down lists have dependent data validation, using a simple INDIRECT formula, you can add a few lines of code to handle those lists.
In the existing code on the ValidationSample sheet module, look for the following lines:
Application.EnableEvents = False str = Target.Validation.Formula1 str = Right(str, Len(str) - 1)
Below those lines, add the following lines of code, to handle simple INDIRECT formulas, such as =INDIRECT(E2)
This is used for the City drop down list in the Dependent Combo sample file below.
'for simple INDIRECT function (English) ' e.g. =INDIRECT(B2) 'will create dependent list of items If Left(str, 4) = "INDI" Then lSplit = InStr(1, str, "(") str = Right(str, Len(str) - lSplit) str = Left(str, Len(str) - 1) str = Range(str).Value End If
For drop down lists that are based on dynamic named ranges, add a few more lines of code to handle those lists. Excel won't let you use some dynamic range names in the ListFillRange property for the combo box, so this workaround adds all the items from the dynamic list.
Download the sample file, to see the full code for the dependent lists with dynamic ranges:
.ListFillRange = str If .ListFillRange <> str Then 'for dynamic named ranges str = Target.Validation.Formula1 str = Right(str, Len(str) - 1) Set wb = ActiveWorkbook Set nm = wb.Names(str) Set wsNm = wb.Worksheets _ (nm.RefersToRange.Parent.Name) Set rng = wsNm.Range _ (nm.RefersToRange.Address) .ListFillRange = "'" & wsNm.Name _ & "'!" & rng.Address End If
1. To test the combo box code, you can download the zipped sample file.
2. For the Dependent Combo sample, click here to download.
3. This sample file shows a combo box for dependent drop downs based on a dynamic named range.
4. This sample has a Dependent Combo box, in a column with merged cells.
Last updated: July 24, 2023 4:17 PM