'------------------------------------------------------------
'Chargement d'une ComboBox à partir d'un Range ou d'une Table
'en s'assurant que les items de la ComboBox sont tous de type
'String pour éviter les comportements étranges sur les items
'de type valeurs numériques.
'------------------------------------------------------------
'https://www.excel-downloads.com/threads/vba-curiosite-combobox.20051806/
'------------------------------------------------------------
Sub ComboBoxListLoad(ByRef Cmb As ComboBox, ByRef RngOrTab As Variant, Optional ItemFormat As String = "@")
Dim TabVal() As Variant
Dim TabValArea() As Variant
Dim Area As Range
Dim i As Long
Dim k As Long
Dim ErrNumber As Variant
'Suppression du ListFillRange / RowSource éventuel
On Error Resume Next
Cmb.ListFillRange = "" 'ComboBox non UserForm
Cmb.RowSource = "" 'ComboBox UserForm
On Error GoTo 0
'L'argument est de type Range
If TypeOf RngOrTab Is Range Then
'D'une seule cellule
If RngOrTab.Cells.Count = 1 Then
ReDim TabVal(1 To 1)
TabVal(1) = RngOrTab.Value
'De plusieurs cellules
Else
ReDim TabVal(1 To RngOrTab.Cells.Count)
k = 0
'Parcours des Areas du Range
For Each Area In RngOrTab.Areas
TabValArea = Area.Columns(1).Value
For i = 1 To UBound(TabValArea, 1)
TabVal(k + i) = TabValArea(i, 1)
Next i
k = k + UBound(TabValArea, 1)
Next Area
End If
'L'argument est de type Tableau
Else
On Error Resume Next
i = UBound(RngOrTab, 2)
ErrNumber = Err.Number
On Error GoTo 0
'Table à 1 dimension
If ErrNumber <> 0 Then
TabVal = RngOrTab
'Table à 2 dimensions
Else
For i = LBound(TabVal, 1) To UBound(TabVal, 1)
TabVal(i) = RngOrTab(i, 1)
Next i
End If
End If
'Conversion des valeurs en String ou mise au format
For i = LBound(TabVal) To UBound(TabVal)
TabVal(i) = Format(TabVal(i), ItemFormat)
Next i
'Chargement de la ComboBox
Cmb.List = TabVal
End Sub