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

  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
    Bon toujours au même point, c'est-à-dire rien. Je ne trouve pas la solution.
    L'idée du code proposé plus haut par peaceandloveman01 me paraît très difficile à mettre en place compte tenu du nombre de données.
    J'en ai mal au crâne de chercher, je teste et reteste mais sans résultat.
    Si ça continue, je vais aller me pendre.

  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,

    Ben toujours le même problème avec mes Combo, je n'arrive pas à alimenter ma 2ème combo selon le choix fait dans ma première. Comme dans ma première il y a 28 choix possible et dans la seconde aussi vous comprenez que je ne puisse pas taper 28 fois la même procédure, alors je cherche un raccourci. Je suis allé sur les FAQ mais je n'ai rien trouvé ou alors j'ai mal cherché. Bon j'espère y arriver dans la journée.
    Si quelqu'un à une idée ou a fait quelque chose de similaire cela m'arrangerai bien car je suis complètement bloqué.
    Merci à vous tous

  8. #8
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Bonjour,

    tes donnees devant remplir tes combobox elles sont où ? ne pourrai tu pas les mettre dans une feuille excel. Si oui , commment est organisé cette feuille une colonne ComboBox1 , et une Colonne Combobox2 ?

  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 JackOuYa,

    Mes données sont dans une feuille Excel nommée ("Données").
    Dans Cb2 il y a les données de la colonne A, dans Cb3 les données de la colonne B, dans T4 (TextBox) les données de la colonne C, dans T5 les données de la colonne D.
    Par exemple : En colonne A j'ai entré "Allocation" dans les cellules 7,8,9,10,etc.
    En B "Mariage", "PACS", "Naissance", "Aide enfant handicapés", "Vacances", "Retraite". Ces données sont au même niveau (ligne 7,8,9,etc.)
    Donc, lorsque je clique dans Cb2 et sélectionne "Allocation", je voudrai qu'en Cb3 n'apparaisse que ces données.
    Il y a 28 données différentes en A et autant de choix en B.

  10. #10
    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
    J'ai trouvé ce code que j'essaie d'adapter à ma situation, mais mes Combo restent désespérément vides
    Pouvez-vous m'apporter votre lumière ?
    Merci

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Dim WS As Worksheet
    Dim Nblignes As Integer
    Private Sub Cb2_Change()
    'remplissage de Cb3
    Alim_Combo 1, Cb2.Value
    End Sub
    Private Sub FrmOp_Initialize()
     Set WS = Worksheets("Données")
     Nblignes = WS.Range("A655363").End(xlUp).Row
     Alim_Combo 1
    End Sub
    'Procédure pour alimenter les ComboBox
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
    Dim j As Integer
    Dim Obj As Control
     
    'Définit le ComboBox à remplir
    Set Obj = Me.Controls("ComboBox" & CbxIndex)
    'Supprime les anciennes données
    Obj.Clear
     
    'Alimente le ComboBox initial(Cb2)
    If CbxIndex = 1 Then
        'Boucle sur les lignes de la colonne A (à partir de la 2ème ligne)
        For j = 2 To Nblignes
        Obj = WS.Range("A" & j)
        'Remplit le Combo sans doublons
        If Obj.ListIndex = -1 Then Obj.AddItem WS.Range("A" & j)
        Next j
    Else
        'Alimentation conditionnelle des autres Combo en fonction
        'de ce qui est sélectionné dans le contrôle précedent :
        '(la sélection du Cb2 définit le contenu du Cb3)
        For j = 2 To Nblignes
            If WS.Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
                Obj = WS.Range("A" & j).Offset(0, CbxIndex - 1)
                    If Obj.ListIndex = -1 Then Obj.AddItem WS.Range("A" & j).Offset(0, CbxIndex - 1)
                    End If
                Next j
            End If
        'Enlève la sélection dans le ComboBox
        Obj.ListIndex = -1
    End Sub

  11. #11
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Bonjour,

    NEC, l'on va travailler sur ton dernier code.

    Le premier probléme et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub FrmOp_Initialize()
    en VBA les procédure événemetielle de form , s'appellent toutes Userform_ ..quelque soit le nom de la form pour toi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Initialize()
     Set WS = Worksheets("Données")
     Nblignes = WS.Range("A65535").End(xlUp).Row
     Alim_Combo 1
    End Sub
    j'ai aussi modifié le nombre de ligne 65535, pour être compatible versions excel antérieures à 2007.


    pour le Cb2_change, il n'est pas trés logique, je verrai plutôt un CB1_Change, permettant la mise à jour de la 2° liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Cb1_Change()
      Alim_Combo 2, Cb1.Value
    End Sub

    tu dis quoi ...

  12. #12
    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 fait tout comme tu m'as dit, mais rien ne se passe, les Combo restent vides.
    J'ai renommé mes Combo afin que le code soit le plus approchant possible de celui que j'ai trouvé sur la toile.
    Fichier joint le code d'origine

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Option Explicit
    Dim Ws As Worksheet
    Dim NLignes As Integer
    'Les données sont dans les colonnes A à D, d'un onglet nommé "Données".
    'La procédure effectue un remplissage conditionnel des ComboBox en fonction
    'de ce qui est sélectionné dans le contrôle précédent :
    'La sélection du Combox1 (données colonne A) définit le contenu du ComboBox2
     
     
    Private Sub UserForm_Initialize()
        'Définit la feuille contenant les données
        Set Ws = Worksheets("Données")
        'Définit le nombre de lignes dans la colonne A
        Nblignes = Ws.Range("A65535").End(xlUp).Row
        'Remplissage du ComboBox1
        Alim_Combo 1
    End Sub
     
    Private Sub ComboBox1_Change()
    'Remplissage Comb2
    Alim_Combo 2, ComboBox1.Value
    End Sub
     
     
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
    Dim j As Integer
    Dim obj As Control
     
    'Définit le ComboBox à remplir
    Set obj = Me.Controls("ComboBox" & CbxIndex)
     'Supprime les anciennes données
    obj.Clear
     
    'Alimente le ComboBox initial(ComboBox1)
    If CbxIndex = 1 Then
        'Boucle sur les lignes de la colonne A (à partir de la 2ème ligne)
        For j = 2 To Nblignes
            obj = Ws.Range("A" & j)
            'Remplit le ComboBox sans doublons
        If obj.ListIndex = -1 Then obj.AddItem Ws.Range("A" & j)
        Next j
    Else
        'Alimentation conditionnelle des autres CoboBox en fonction de
        'ce qui est sélectionné dans le contrôle précédent :
        '(La sélection du ComboBox1 conditionne le contenu du ComboBox2)
        For j = 2 To Nblignes
            If Ws.Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
                obj = Ws.Range("A" & j).Offset(0, CbxIndex - 1)
            If obj.ListIndex = -1 Then obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
        End If
        Next j
    End If
     'Enlève la sélection dans le ComboBox
     obj.ListIndex = -1
    End Sub

  13. #13
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Il ne se passe rien à l'ouverture de l'userform ..?

    pas de message d'erreur ?


    tu as bien une feuille Données dans ton classeur?

  14. #14
    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
    J'ai bien une feuille données dans mon classeur.
    Pas de message d'erreur, il ne se passe rien. Mes Combo sont vides.
    J'ai refais le code en entier mais avec toujours le même résultat.

    Je viens d'essayer à nouveau, il y a effectivement un message d'erreur sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
    Erreur "70" - Accès refusé

  15. #15
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    tes combobox sont bien sur un userform, et le code que tu nous montre est le code de cet userform ?

  16. #16
    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
    Oui pour les 2 questions

  17. #17
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Citation Envoyé par NEC14 Voir le message
    ...

    Je viens d'essayer à nouveau, il y a effectivement un message d'erreur sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
    Erreur "70" - Accès refusé
    j'avais pas vu l'édit .., mais ce code ne doit s'exécuter que dans le cas où tu as quelque chose dans la 1° combo-box, il arrive quand ce message.

    au moment où il arrive,clique sur débugger et passer la souris sur les variables J et CbxIndex voir leur valeurs?

  18. #18
    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
    ça arrive au moment où l'UserForm est activité

  19. #19
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    essai de renommer (ou supprimer) provisioirement la sub : ComboBox1_Change , pour l'inhiber et être sur qu'elle ne s'exécute pas ..

  20. #20
    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
    Lorsque je supprime ComboBox1_Change, la ComboBox1 est alimentée par les données se trouvant en colonne A de la feuille donnée.
    C'est déjà une étape

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

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