"Caveat: If the user commences typing in the combobox then the Change event fires with the first character typed." This is the situation I have currently. These are all my Subs:
Private Sub cmbx_siteName_AfterUpdate()
If cmbx_siteName.Value <> "" Then
Me.txtbx_siteID.Value = WorksheetFunction.VLookup(Me.cmbx_siteName.Value, Sheet5.Range("I:J"), 2, 0)
Me.txtbx_siteID.SetFocus
End If
End Sub
Private Sub cmbx_SiteName_Change()
Dim strSelected As String
strSelected = Me.cmbx_siteName.Value
If strSelected = "" Then
Me.cmbx_siteName.List = varArr
Else
Me.cmbx_siteName.List = SearchAndAppend(strSelected)
End If
Me.cmbx_siteName.DropDown
End Sub
Private Sub cmdClose_Click()
Unload Me
End Sub
Private Sub cmbx_SiteName_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Me.cmbx_siteName.List = varArr
End Sub
Private Sub UserForm_Initialize()
'-- Assing your list to array here.
varArr = Intersect(Sheet5.Range("I1").CurrentRegion, Sheet5.Range("I1").CurrentRegion.Offset(1)).Columns(1)
Me.cmbx_siteName.List = varArr
End Sub
Function SearchAndAppend(strSubString As String)
Dim lngR As Long
Dim varResult
For lngR = LBound(varArr) To UBound(varArr)
If varArr(lngR, 1) Like "*" & strSubString & "*" Then
If Not IsArray(varResult) Then
ReDim varResult(0)
Else
ReDim Preserve varResult(UBound(varResult) + 1)
End If
varResult(UBound(varResult)) = varArr(lngR, 1)
End If
Next lngR
If Not IsArray(varResult) Then
ReDim varResult(0)
varResult(0) = "No Match"
End If
SearchAndAppend = varResult
End Function