IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Code pour alimenter 2 ComboBox en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut Code pour alimenter 2 ComboBox en VBA
    Bonjour à tous,

    Voici mon problème : Dans un classeur Excel, il y un formulaire (FrmOp) avec 2 Combox (Cb1 et Cb2), 2 TextBox (T4 et T5).
    Une Feuille de calcul (Données) dans laquelle il y a des données qui alimentent Cb1.
    Je voudrais que selon le choix fait en Cb1, les données alimentant Cb2 soient différentes.
    Exemple : Données de Cb1 : Allocations, Billeterie, etc...
    Je choisi "Allocations", dans Cb2 doivent apparaitre que les données correspondant à "Allocations" soit "Mariage, PACS, décès, etc...). Ensuite, selon le choix fait en Cb2 un prix soit affiché dans T4 (Prix d'achat) et dans T5 (Prix de vente). J'avais pensé faire cela en nommant chaque groupe de données, mais cela me paraît lourd.
    Pouvez-vous m'aider s'il vous plait ?
    Merci par avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 191
    Par défaut
    Bonjour,

    tu peux peut être utiliser l'instruction select case (aide F1 pour plus de détails). Cela te permettra de choisir en fonction de Cb1 les données de Cb2.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Select Case Cb1.Text
    Case "Allocations"
         Cb2.AddItem "Mariage"
         Cb2.AddItem "PACs"
    Case "Billeterie"
         ... 'Ce que tu veux mettre
    Case Else
         ... 'Pour les autres cas
    End Select
    Tu peux également insérer les données dans Cb2 en utilisant d'autres méthodes. A toi de voir !

    Et pour Cb2 tu peux faire de même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select Case Cb2.Text
    Case "Mariage"
         T4.value = PrixAchat
         T5.Value = PrixVente
    End Select
    Qu'en dis tu ??

    Bonne continuation,

    Lyonel

  3. #3
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Merci, c'est une idée. Je vais voir ce que cela donne. Je te tiens informé

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 191
    Par défaut
    Juste une petite remarque:

    Cette méthode fonctionne si tous les noms sont entrés correctement sans fautes d'orthographe et il faut que se soit les mêmes dans la feuille "données". C'est le premier inconvénient.
    Le deuxième est que si tu rajoutes une catégorie dans ta liste sur la feuille "données", tu devras aussi la rajouté en dur dans le code VBA.
    Pour remédier à cela je te conseillerais de mettre en forme tes données sur la feuille Excel (si c'est possible) et d'utiliser des boucles et l'indice ComboBox1.ListIndex pour ensuite aller chercher les données de Cb2 dans la colonne suivante. Je sais pas si j'ai été assez clair...
    Dès que j'ai le temps (et surtout Excel à porter de main) je fais une maquette et post le code, ok?

    Bon courage !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Ok merci pour ton aide

    J'ai écris ce code, mais il me met le message d'erreur suivant :
    "Incompatibilité de Type" sur la ligne Frmop.Cb3.Text=A3()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Cb2_Change()
    Dim cell As Range
    Dim A3(0 To 50, 0 To 1) As String
    Dim L As Byte
    Dim I As Byte
        If FrmOp.Cb2.Value <> "" Then
            L = Len(Cb2)
                For Each cell In Sheets("Données").Range("A2:D70")
                If UCase(Left(cell.Text, L)) = UCase(Cb2.Text) Then
                A3(I, 0) = cell.Offset(0, 1).Text
            I = I + 1
            End If
        Next
    FrmOp.Cb3.Text = A3()
    End If
    End Sub
    Je ne comprend pas, pouvez-vous m'aider à comprendre

  6. #6
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Bonjour,

    J'ai trouvé ce code et je voudrais l'adapter à mon problème, pouvez-vous m'apporter votre lumière ?
    La feuille où se trouve les données se nomme "Données". La Colonne A concerne l'alimentation du CombBox1, la colonne B celle du ComboBox2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Address = "$B$2" And Target.Count = 1 Then
            If IsError(Application.Match(Target.Value, [choix1], 0)) Then
              If MsgBox("On ajoute?", vbYesNo) = vbYes Then
               [choix1].End(xlToRight).Offset(0, 1) = Target.Value
              Else
               Application.Undo
              End If
            Else
              Target.Offset(0, 1) = Sheets("listes").Range("choix2")(1).Offset(1, Application.Match(Target, [choix1], 0) - 1)
            End If
      End If
      If Target.Address = "$C$2" And Target.Count = 1 Then
            d = Application.Match(Target.Offset(0, -1), [choix1], 0) - 1
            If IsError(Application.Match(Target.Value, [choix2].Offset(0, d), 0)) Then
              If MsgBox("On ajoute?", vbYesNo) = vbYes Then
               n = Application.CountA([choix2].Offset(0, d))
               c = Sheets("listes").Range("choix2").Column
               Sheets("listes").Cells(n + 1, c + d) = Target.Value
              Else
               Application.Undo
              End If
       End If
      End If
    End Sub

  7. #7
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Bonjour à tous,

    J'ai travaillé encore tard hier soir pour résoudre ce problème.
    Je vous mets en pièce jointe une partie de mon fichier avec l'UserForm et la feuille "Données" afin que vous puissiez vous rendre compte où ça bug.
    Je n'y arrive pas et cela me désespère.

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Bonjour,

    Ca vaut ce que ça vaut, et je débute en vba, mais je procède comme ça (à placer dans ton userform et à adapter à ton cas, bien sûr):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Public i As Long, DerLig As Long
    Private Sub ComboBox1_Afterupdate()
    DerLig = Sheets("Feuil1").[A65536].End(xlUp).Row
    For i = 2 To DerLig
        If Sheets("Feuil1").Cells(i, 7) = ComboBox1.Value Then
            ComboBox2.AddItem (Sheets("Feuil1").Cells(i, 2))
        End If
    Next
    End Sub
    Private Sub ComboBox2_Afterupdate()
    For i = 2 To DerLig
        If Sheets("Feuil1").Cells(i, 2) = ComboBox2.Value Then
            TextBox1 = Sheets("Feuil1").Cells(i, 1)
        End If
    Next
    End Sub
    Et j'ai placé ceci dans un module standard (à adapter aussi):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Formulaire()
    Application.DisplayAlerts = False
    Dim j As Integer
    Load FrmConditionsClients
        For j = 2 To Sheets("Feuil1").[G65536].End(xlUp).Row
            FrmConditionsClients.ComboBox1 = Sheets("Feuil1").Range("G" & j)
    '        Filtrage des doublons
            If FrmConditionsClients.ComboBox1.ListIndex = -1 Then _
                FrmConditionsClients.ComboBox1.AddItem Sheets("Feul1").Range("G" & j)
        Next j
        FrmConditionsClients.Show
    Application.DisplayAlerts = True
    End Sub

    Je prendrai bonne note des remarques aussi.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Bonjour neiluj26,

    Merci pour ton code. Peux-tu m'apporter quelques explications car ce matin je patauge un peu dans la semoule.

    A quoi se réfère For i =2, Cells(i,7), Cells(i,2) et Cells(i,1) ?

    Cela va peut-être te paraitre idiot, mais je n'arrive pas à décripter ton code, dur dur ce matin

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Bonjour,

    En gros, j'ai une feuille récapitulative (que j'ai nommée Feuil1 dans le code que je t'ai donné) où je stocke diverses informations sur les clients export de mon entreprise. Pour que des utilisateurs puissent effectuer des recherches ou des modifications plus facilement, j'ai créé un formulaire.

    Au déclenchement de la macro (le code du module standard), je charge le formulaire, puis ajoute les items de la colonne G (qui contient les différents pays de nos clients) de Feuil1 en éliminant les doublons.
    Le For j = 2 To Sheets("Feuil1").[G65536].End(xlUp).Row me permet de balayer les items de Feuil1 de la ligne 2 à la dernière ligne.

    Puis, pour le code que j'ai mis dans le formulaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public i As Long, DerLig As Long ' Déclaration des variables
    Private Sub ComboBox1_Afterupdate() 'Routine qui se déclenche quand l'utilisateur a choisi une valeur de combobox1
     
    'Définition de la dernière ligne de Feuil1 pour pouvoir balayer tout le tableau
    DerLig = Sheets("Feuil1").[A65536].End(xlUp).Row 
     
    'Je commence à la ligne 2 et je vais jusqu'à la dernière ligne définie à la ligne de code du dessus
    For i = 2 To DerLig 
     
    'Si la valeur de la colonne 7 (donc la colonne des pays dont je parlais) de la ligne courante (i) est égale à la valeur choisie dans Combobox1, alors j'ajoute la valeur de la colonne B (celle des noms des clients) de la même courante dans combobox2
        If Sheets("Feuil1").Cells(i, 7) = ComboBox1.Value Then
            ComboBox2.AddItem (Sheets("Feuil1").Cells(i, 2))
        End If
    Au final, si l'utilisateur choisit par exemple "Italie" dans Combobox1, seuls les clients italiens, dans combobox2.

    Next
    End Sub

  11. #11
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Merci pour ces explications, je comprends mieux.
    Voilà le code tel qu'il est chez moi, mais ça ne marche pas.
    Les données qui doivent alimenter le ComboBox1 sont dans la feuille "Données", colonne A. Les données pour ComboBox2, en colonne B.
    Mais rien ne se passe, où ai-je fais une erreur ?

    Dans l'UserForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Public i As Long, DerLig As Long
    Private Sub ComboBox1_AfterUpdate()
    DerLig = Sheets("Données").[A65530].End(xlUp).Row
    For i = 2 To DerLig
        If Sheets("Données").Cells(i, 7) = ComboBox1.Value Then
            ComboBox2.AddItem (Sheets("Données").Cells(i, 2))
            End If
        Next
    End Sub
    Private Sub ComboBox2_AfterUpdate()
    For i = 2 To DerLig
        If Sheets("Données").Cells(i, 2) = ComboBox2.Value Then
            ComboBox1 = Sheets("Données").Cells(i, 1)
        End If
    Next
    End Sub
    Dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Formulaire()
    Application.DisplayAlerts = False
    Dim j As Integer
    Load frmop
        For j = 2 To Sheets("Données").[A65530].End(xlUp).Row
        frmop.ComboBox1 = Sheets("Données").Range("A" & j)
     
        If frmop.ComboBox1.ListIndex = -1 Then
            frmop.ComboBox1.AddItem Sheets("Données").Range("A" & j)
        Next j
        frmop.Show
    Application.DisplayAlerts = True
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Split sur fichier texte pour alimenter une combobox
    Par ludo40190 dans le forum VB.NET
    Réponses: 8
    Dernier message: 23/07/2012, 20h14
  2. [XL-2010] Code VBA pour trier sur combobox
    Par duplaly dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/04/2011, 17h56
  3. Réponses: 2
    Dernier message: 23/10/2009, 10h29
  4. [AC-2007] Code pour convertir mes macros en VBA.
    Par solaar dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/08/2009, 19h09
  5. [VBA][SQL] code pour requete sql update en vba
    Par titocv723 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 24/10/2006, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo