Procédure à suivre sur feuille vierge
1-création du contrôle Combobox
menu Développeur --> Insérer --> Contrôles ActiveX --> Choisir Zone de Liste déroulante --> La créer sur la feuille
Par défaut, son nom est Combobox1. En cliquant sur le bouton Propriétés du menu Développeur, son nom apparaît et peut être changé auquel le code devra être modifié en conséquence.
Terminer en cliquant sur le bouton "Mode Création" pour revenir au mode normal.
2-copie du code
Dans l'éditeur VBA, copier le code suivant dans la feuille concernée a priori Feuil1, et changer les valeurs des constantes selon le fichier.
'************* Constantes à définir selon fichier ********************************
Const valeur_cellule_départ As String = "A1"
Const valeur_plage_action_cbx As String = "C3:C995" 'valeur de la plage où agira la ComboBox
Const valeur_plage_liste_cbx As String = "M:M" 'valeur de la plage où se trouvera la liste de la ComboBox
Const décalage_ligne_liste_cbx As String = 3 'valeur du décalage pour obtenir la première ligne de la liste de la ComboBox
'************* Définition variables relatives à la feuille ***********************
Dim nb_items As Integer
Dim plage As Range, champ_maj As Range
Private Sub Worksheet_Activate()
'RAB Combobox1
ComboBox1.Clear
'Nombre d'items de la liste
nb_items = Application.CountA(Range(valeur_plage_liste_cbx))
'Affectation Liste Combobox1
ComboBox1.List = Range(valeur_plage_liste_cbx).Resize(nb_items).Offset(décalage_ligne_liste_cbx).Value
'Initialisation Combobox
Call Combobox1_LostFocus
'Positionnement sur la cellule de départ
Range(valeur_cellule_départ).Select
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'plage de modification des champs du tableau via Combobox
Set plage = Range(valeur_plage_action_cbx)
'positionnement et affichage Combobox selon cellule sélectionnée
If Not Intersect(Target, plage) Is Nothing And Target.Count = 1 Then
'positionnement Combobox
ComboBox1.Value = Target.Value
ComboBox1.Height = Target.Height
ComboBox1.Width = Target.Width
ComboBox1.Top = Target.Top
ComboBox1.Left = Target.Left
ComboBox1.Visible = True
'activation de la Combobox
With ComboBox1
.Activate
.SelStart = 0
.SelLength = Len(.Text)
End With
'affectation champ à mettre à jour
Set champ_maj = Target
End If
End Sub
Private Sub Combobox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'RAB champ tableau
If KeyCode = vbKeyDelete Then champ_maj.Value = Empty: Range(valeur_cellule_départ).Select
'Pas de mise à jour champ tableau
If KeyCode = vbKeyEscape Then Range(valeur_cellule_départ).Select
End Sub
Private Sub Combobox1_Change()
'mise à jour champ tableau
If champ_maj Is Nothing Then Exit Sub
If ComboBox1.Value <> Empty Then
champ_maj.Value = ComboBox1.Value 'mise à jour
champ_maj.Offset(1).Select 'sélection champ ligne suivante
End If
End Sub
Private Sub Combobox1_LostFocus()
'initialisation Combobox
ComboBox1.Value = Empty
ComboBox1.Visible = False
'désaffectation champ à mettre à jour
Set champ_maj = Nothing
End Sub
3-exécution à l'ouverture du fichier, de la procédure relative à l'événement d'activation de la feuille
recopier le code suivant dans ThisWorkBook en supposant que la feuille est Feuil1
Private Sub Workbook_Open()
Application.Run "Feuil1.Worksheet_Activate"
End Sub