Good afternoon,
I am using the following code to populate a combobox from a data validation list.
Code provided by contextures:
The above works fine with one combobox, but my worksheet contains three.
I thought i could just duplicate the code, changing any reference of 'combobox1' to 'combobox2' and 'combobox3'.
I have since found out that I can only use 'Worksheet_SelectionChange' once, so I tried changing the name on each of the procedures but it didn't work, so it seems the only answer i can think of is to combine the code. I have no idea how to do this.
For each combobox, there is a data validation drop-down list pointing to a unique named range. I want the code to react with combobox2 and 3 the same as it does with 1 - the only thing that is the different between the three comboboxes is the named range.
If someone could show me where and how to combine the code, i would be very grateful.
Best regards
manc
I am using the following code to populate a combobox from a data validation list.
Code provided by contextures:
Code:
Option Explicit' Developed by Contextures Inc.
' www.contextures.com
Private Sub ComboBox1_KeyDown(ByVal _
KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
'Hide combo box and move to next cell on Enter and Tab
Select Case KeyCode
Case 9
ActiveCell.Offset(0, 1).Activate
Case 13
ActiveCell.Offset(1, 0).Activate
Case Else
'do nothing
End Select
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim str As String
Dim cboTemp As OLEObject
Dim ws As Worksheet
Dim Tgt As Range
Dim TgtMrg As Range
Dim c As Range
Dim TgtW As Double
Dim AddW As Long
Dim AddH As Long
Set ws = ActiveSheet
On Error Resume Next
'extra width to cover drop down arrow
AddW = 15
'extra height to cover cell
AddH = 5
If Target.Rows.Count > 1 Then GoTo exitHandler
Set Tgt = Target.Cells(1, 1)
Set TgtMrg = Tgt.MergeArea
On Error GoTo errHandler
Set cboTemp = ws.OLEObjects("ComboBox1")
On Error Resume Next
If cboTemp.Visible = True Then
With cboTemp
.Top = 10
.Left = 10
.ListFillRange = ""
.LinkedCell = ""
.Visible = False
.Value = ""
End With
End If
On Error GoTo errHandler
If Tgt.Validation.Type = 3 Then
Application.EnableEvents = False
If Not TgtMrg Is Nothing Then
'get total width of merged cells
TgtW = 0
For Each c In TgtMrg.Cells
TgtW = TgtW + c.Width
Next c
End If
str = Tgt.Validation.Formula1
str = Right(str, Len(str) - 1)
With cboTemp
.Visible = True
.Left = Tgt.Left
.Top = Tgt.Top
If TgtW <> 0 Then
'use total width for merged cells
.Width = TgtW + AddW
Else
.Width = Tgt.Width + AddW
End If
.Height = Tgt.Height + AddH
.ListFillRange = str
.LinkedCell = Tgt.Address
End With
cboTemp.Activate
Me.ComboBox1.DropDown
End If
exitHandler:
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
errHandler:
Resume exitHandler
End Sub
The above works fine with one combobox, but my worksheet contains three.
I thought i could just duplicate the code, changing any reference of 'combobox1' to 'combobox2' and 'combobox3'.
I have since found out that I can only use 'Worksheet_SelectionChange' once, so I tried changing the name on each of the procedures but it didn't work, so it seems the only answer i can think of is to combine the code. I have no idea how to do this.
For each combobox, there is a data validation drop-down list pointing to a unique named range. I want the code to react with combobox2 and 3 the same as it does with 1 - the only thing that is the different between the three comboboxes is the named range.
If someone could show me where and how to combine the code, i would be very grateful.
Best regards
manc