VBA - Saisie intuitive dans combox

Bonsoir,

Dans mon document Excel, je recherche à faire apparaître une liste déroulante sur certaines plages de données lorsque l'on clique sur l'une des cellules concernées.

Je sais m'y prendre hors VBA, mais je ne sais pas le faire en passant par VBA, c'est pourquoi je me tourne à nouveau vers vous.

Dans mes recherches, je me suis souvenu d'un code qu'avait proposé @Boisgontierjacques ; que j'ai conservé dans un coin persuadé que ça me serait utile. Et en effet, ce qu'il proposait me semble tout à fait convenir !

Le gros problème, c'est que je peine à comprendre ce code. Et le peu de ce que je comprend, je ne parviens pas à le faire fonctionner pour le moment.

Voici le code qu'il avait proposé dans son document :

 Dim f, a(), choix1()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect([a2:a100], Target) Is Nothing And Target.Count = 1 Then
    Set f = Sheets("BD")
    choix1 = f.Range("a2:b" & f.[a65000].End(xlUp).Row).Value
    Me.ComboBox1.List = choix1
    Me.ComboBox1.Height = Target.Height + 3
    Me.ComboBox1.Width = Target.Width
    Me.ComboBox1.Top = Target.Top
    Me.ComboBox1.Left = Target.Left
    Me.ComboBox1 = Target
    Me.ComboBox1.Visible = True
    Me.ComboBox1.Activate
  Else
    Me.ComboBox1.Visible = False
  End If
End Sub
Private Sub ComboBox1_Change()
   If Me.ComboBox1.ListIndex = -1 Then
     Dim b()
     clé = UCase(Me.ComboBox1) & "*"
     n = 0
     For i = LBound(choix1) To UBound(choix1)
       If UCase(choix1(i, 1)) Like clé Then
         n = n + 1: ReDim Preserve b(1 To 2, 1 To n)
         b(1, n) = choix1(i, 1): b(2, n) = choix1(i, 2)
       End If
      Next i
      If n > 0 Then
        ReDim Preserve b(1 To 2, 1 To n)
        Me.ComboBox1.Column = b
      End If
      Me.ComboBox1.DropDown
    End If
End Sub
Private Sub ComboBox1_Click()
       ActiveCell.Value = Me.ComboBox1
       ActiveCell.Offset(, 1) = ComboBox1.Column(1)
End Sub
Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  choix1 = f.Range("a2:a" & f.[a65000].End(xlUp).Row).Value
  Me.ComboBox1.DropDown
End Sub
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then
    ActiveCell.Offset(1).Select
  End If
End Sub

Le document Excel qu'il a partagé est également joint à ce post ("Synonymes").

Dans mon cas, j’essaie d'adapter ce code pour faire ceci :

  • Dans la colonne [J] de la feuille 'A' ; dans les colonnes [J] et [L] de la feuille 'B' : ouvrir une liste de choix pour une saisie automatique.
  • Cette liste de choix sera disponible ici : feuille 'BD Listes' (Colonnes [A:B])

Sauriez-vous comment je peux m'y prendre ?

Pour le moment je n'ai que des erreurs, mais si j'arrive à un résultat quelconque je vous en fait part !

Merci de votre attention,

Bonne soirée !

90synonymes.zip (818.76 Ko)

Bonsoir,

Tu n'as pas besoin du code de Boisgontier pour ce que tu veux faire.

Par ailleurs, si tu n'insères pas un contrôle ActiveX de type Combobox sur tes feuilles, le code ne fonctionnera jamais.

ci-joint exemple pour la feuille A

Bonsoir,

Merci pour votre aide, c'est, en effet, exactement ce que je recherche.

Un petit détail, est-il possible de saisir "1" et d'avoir en correspondance immédiate "Très fort" ou faut-il que je précise :

Si 1 dans la plage de donnée, alors changer en "Très fort" ?

Si vous avez un peu de temps, serait-il possible de m'expliquer le code que vous avez utilisé, je comprend certaines parties, mais pas tout.

Notamment ceci :

If Not Intersect(Me.UsedRange.Columns("J"), Target) Is Nothing And Target.Count = 1

Bonne soirée !

Un petit détail, est-il possible de saisir "1" et d'avoir en correspondance immédiate "Très fort" ou faut-il que je précise :

Il suffit de changer la colonne correspondant à la propriété Value de la Combobox

   Me.ComboBox1.BoundColumn = 2

ci-jointe nouvelle version

If Not Intersect(Me.UsedRange.Columns("J"), Target) Is Nothing And Target.Count = 1

Me représente l'objet Feuille. Me représente toujours l'objet où se trouve le code. Si le code était situé dans un Useform, Me serait le UserForm, si le code était situé dans un Workbook, Me serait le Workbook.

Me.UsedRange représente donc la plage utilisée de la feuille

Me.UsedRange.Columns("J") représente la plage utilisée de la colonne J dans cette feuille.

Merci pour les explications, je vais noter ça avec le code.

Dans le nouveau document que vous avez transmis, j'ai cette erreur qui apparaît dès l'ouverture :

"Variable objet ou variable de bloc With non définie".

Pourtant rien ne semble clocher avec With.

Il surligne ceci : cible = Me.ComboBox1

Si tu veux utiliser ce code sur plusieurs feuilles et plusieurs colonnes, dois-je tout répéter ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Ceci semble indiquer que ça ne se produira que sur la feuille en cours d'utilisation, je dois donc soit mettre ce code dans "Module" et l'activer sur chaque feuille.

Dans le nouveau document que vous avez transmis, j'ai cette erreur qui apparaît dès l'ouverture :

"Variable objet ou variable de bloc With non définie".

erreur corrigée.

Pour utiliser ce code sur une autre feuille, le plus simple est de le recopier et d'y insérer un contrôle ActiveX type Combobox.

Vous ne pouvez pas pas mettre ce code dans un module car la Combobox étant rattachée à la feuille , toute la gestion de ses

événements est propre à la feuille.

ci-jointe version 3

NB :

Une autre solution est de positionner le code au niveau de ThisWorkBook, ce qui évite de le dupliquer pour chaque feuille. Mais le code est beaucoup plus élaboré.

Voir version 4

Merci beaucoup pour l'aide que vous m'avez apporté. Cela répond tout à fait à mes interrogations, avec un niveau que je n'ai pas... Et en plus vous y ajoutez des annotations sur la procédure réalisée, c'est encore flou car je n'ai pas l'habitude d'utiliser ces codes (et VBA en général...) mais formateur. Je vais déjà essayer d'adapter le code pour le comprendre.

Le document n°4 va être conservé précieusement !

Merci encore.

Bonne soirée !

Bonjour,

Une petite précision.

Pourquoi utiliser les objets feuille plutôt que les noms de feuille ?

exemple : Feuil3 plutôt que Sheets(BD Listes)

C'est pour une bonne raison, car le code reste invariant si vous changez le nom de vos feuilles, de même que le sont toutes formules de calcul y faisant référence (car elles sont immédiatement actualisées).

Si vous avez besoin d'explications, n'hésitez pas à me solliciter.

D'accord, cela pose problème donc si je rajoute une feuille en début de document j'imagine.

Je vais tâcher de le garder à l'esprit pour la suite !

D'accord, cela pose problème donc si je rajoute une feuille en début de document j'imagine.

A priori non si vous n'oubliez pas d'y insérer un contrôle ActiveX Combobox .

Par défaut, ce contrôle ne fonctionnera que sur la plage utilisée de la colonne J.

Rechercher des sujets similaires à "vba saisie intuitive combox"