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 :

Creation ComboBox : comment la faire pointer vers une liste mofiable


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut Creation ComboBox : comment la faire pointer vers une liste mofiable
    Salut,

    Je voudrais creer une ComboBox dans laquelle la liste change en fonction d'une case qui est selectionnee.

    Pour l'instant j'essaye avec des Drop Down List, mais on ne peut prendre qu'un nom de liste.

    Est-ce qu'avec une ComboBox on peut pointer vers une cellule qui va par exemple donner le nom de la liste de choix.
    (exemple : Marque1+Pays1 renvoie vers la liste1 de 28 elements, Marque1+Pays2 renvoie vers la liste2 de 6 elements)

    J'avais aborde le sujet ici :
    http://www.developpez.net/forums/sho...d.php?t=347137

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour Enricoo,

    Dans le sujet que vous citez votre question concernait la flèche qui n'apparaissait pas pour un ComboBox :

    Par rapport a un probleme que j'ai poste un peu plus tot, j'essaie desesperemment d'autres trucs, et ce topic m'a semble pas mal.

    Le probleme, c'est qu'une fois que j'ai cree la ComboBox, dans mon fichier Excel, je ne peux pas cliquer sur la fleche pour voir apparaitre les choix.

    Il doit y avoir une manipe a la con mais je sais pas ou je peux la trouver.
    Est-ce que ce problème est maintenant solutionné ?

    Maintenant vous écrivez :

    Est-ce qu'avec une ComboBox on peut pointer vers une cellule qui va par exemple donner le nom de la liste de choix.
    (exemple : Marque1+Pays1 renvoie vers la liste1 de 28 elements, Marque1+Pays2 renvoie vers la liste2 de 6 elements)
    Voulez-vous dire que dans "x" cellules vous indiquez une plage de cellule qui va constituer une liste de choix ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Oui desole, je m'embrouille vite !

    J'ai reussi a rendre active la fleche.

    Pour la suite du probleme c'est ca.
    En gros le mec qui rempli la feuille Excel choisi la marque et le pays (y'a 3 marques et 2 pays donc 6 choix).
    Ensuite il doit choisir le "sales representant". La liste des sales rep. varie en fonction du choix fait a la cellule "marque/pays".

    Dans un drop-down, par exemple on va (je suis sur un Excel anglais) dans data-> validation, on choisit list et on rentre le nom de la liste de choix. Mais on peut pas mettre de IF.
    Est-ce qu'avec une ComboBox on peut mettre genre :
    =IF(Marque1+Pays1=1,"SalesRep1",on fait des teste par rapport aux autres marques et autrs pays) ou SalesRep1 est la liste de sales representant liee a la marque 1 dans le pays1. Sachant que les listes n'ont pas la meme taille.

    Voila ma pricipale question !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Re Henricoo,

    A priori je ne vois pas d'impossibilité pour votre demande mais je pense ne pas pouvoir vous répondre sans un exemple, mais d'autres le pourront peut-être.

    Sinon si vous pouvez joindre un fichier exemple en remplaçant toutes données confidentielles.

    Amicalement.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Bonjour,
    Juste une idee sur un principe (non teste donc):
    Sous VBA:
    Une premiere ComboBox remplie au demarrage ou via ou bouton grace a la methode "ListFillRange"

    A l'evenement "Change" de cette premiere Combobox, remplir la deuxieme avec la meme methode (peut etre besoin de la vider avant).

    Essayes de tester ca si tu veux, ca pourrait marcher.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    ExempleSansComboBox.xls

    Voila, j'ai refait une petite feuille avec les principales informations.
    L'ideal (si c'est faisable) ce serait que lorsque je choisis une marque et un pays dans la case de selection, ca "dise" a la ComboBox d'aller chercher la liste associee.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour Henricoo,

    Vous collez ce code dans votre feuille "Sheet1"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     
    If Target.Address = "$E$3" Then
     
    Call Maj_ComboBox1
    End If
    End Sub
    Puis dans un module vous collez celui-ci :

    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
    Option Explicit
     
     
    Sub Maj_ComboBox1()
     
    Dim pcrep, dcrep, c As Byte
    Dim plrep, dlrep, i As Long
    Dim rep, txt1, txt2 As String
    Sheets("Sheet1").Activate
     
    pcrep = 7
    dcrep = 12
    plrep = 3
    dlrep = 31
     
    txt1 = Cells(3, 5)
      If txt1 = "" Then
      MsgBox "Aucune sélection Marques/Pays n'a été faite !"
      Exit Sub
    End If
     
    Sheets("Sheet1").ComboBox1.Clear
    For c = pcrep To dcrep
    txt2 = Cells(plrep, c)
      If txt2 = txt1 Then
        For i = plrep + 1 To dlrep
        rep = Cells(i, c)
             If rep <> "" Then
             Sheets("Sheet1").ComboBox1.AddItem rep
             End If
        Next i
      End If
    Next c
     
    End Sub
    Vous modifiez le code Marque/pays puis vous double-cliquez sur la cellule.

    Amicalement.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    OUAH mortel, ca fonctionne sur la page de test !!!

    Par contre je comprends pas vraiment ou tu rentres (desole, depuis aue je suis chez les britons j'ai vraiment du mal avec le vouvoiement !) les parametres de liste.

    A quoi correspondent ces parametres :
    pcrep = 7
    dcrep = 12
    plrep = 3
    dlrep = 31
    De ce que je crois comprendre, pcrep est la colonne ou on va chercher la premiere liste (a=1, g=7), 12 est la derniere colonne, 3 la premiere ligne et 31 la derniere ligne.

    Bon en fait je crois que je vais changer ma question !

    Comment je fais pour dire que la liste des rep est dans une autre feuille ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Sheet5").ComboBox1.Clear
    Juste a changer le nom de la feuille (Sheet5) si les listes sont sur la Feuille5 ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Re Enricoo,

    Content que ça fonctionne.

    Pour ce qui est des variables, je procède cette façon pour que vous n'ayez qu'à modifier la valeur affectée en cas de modification de la structure de votre feuille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '1ère colonne contenant les représentants par marque/Pays (vous pouvez modifier) 
    pcrep = 7
    'dernière colonne contenant les représentants par marque/Pays (vous pouvez modifier) 
    dcrep = 12
    '1ère ligne contenant les représentants par marque/Pays
    'ici elle indique la ligne de titre, c'est la raison pour laquelle dans
    'la ligne  For i = plrep + 1 To dlrep j'utilise plrep + 1 (vous pouvez modifier) 
    plrep = 3
    'dernière ligne contenant les représentants par marque/Pays (vous pouvez modifier) 
    dlrep = 31
    Pour :

    Sheets("Sheet5").ComboBox1.Clear
    Oui il suffit de changer le nom de la feuille.

    Pour terminer en ce qui concerne le tutoiement, aucun problème, au contraire continuez et ne soyez pas choqué si je ne l'emploie pas, je ne sais pas faire et je n'ai jamais su.

    Amicalement

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Alors en fait ma premiere case de choix (marque et pays) est dans une feuille et la liste des sales rep est dans une autre feuille.
    Et la pour joindre les deux je seche !

    J'ai essayer de modifier le nom des feuille a differents endroits mais ca ne fonctionne pas.
    La feuille ACD_Info correspond a la feuille qui regroupe les tables de sales rep, la feuille ACD est la feuille que les area manager remplissent (feuille ou ils choisissent la marque et le pays et feuille ou il choisissent le sales rep)
    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
    Sub Maj_ComboBox1()
     
    Dim pcrep, dcrep, c As Byte
    Dim plrep, dlrep, i As Long
    Dim rep, txt1, txt2 As String
    'La je rentre le nom de la feuille ou se trouve la liste des sales rep, mais j'ai pas l'impression que ce soit correct (put-etre mettre le nom de la feuille ou ils rentrent les choix)
    Sheets("ACD_Info").Activate
     
    'La j'ai fais mes changements de lieu de cellules (ca pas de probleme !)
    pcrep = 19
    dcrep = 49
    plrep = 2
    dlrep = 28
     
    'La je rentre la cellule de choix de marque et pays (dans la feuille ACD)
    txt1 = Cells(8, 7)
      If txt1 = "" Then
      MsgBox "Please choose a brand and a country."
      Exit Sub
    End If
     
    'La je rentre le nom de la feuille ou est presente la ComboBox (differente de la feuille qui contient les sales rep)
    Sheets("ACD").ComboBox1.Clear
    For c = pcrep To dcrep
    txt2 = Cells(plrep, c)
      If txt2 = txt1 Then
        For i = plrep + 1 To dlrep
        rep = Cells(i, c)
             If rep <> "" Then
    'Ici je remet le nom de la feuille ou est la ComboBox
             Sheets("ACD").ComboBox1.AddItem rep
             End If
        Next i
      End If
    Next c
     
    End Sub
    Et la ca fonctionne pas !

    Autre question, je sais pas si ca doit etre dans un autre sujet, mais une fois que ca fonctionnera, comment je peux recuperer le nom qui est dans la ComboBox pour l'utiliser dans s'autres cellules ?

    En tout cas merci de tout ce temps consacre !

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour Enricoo,

    En fonction de vos informations, j'ai modifié le code :

    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
    Option Explicit
    Public pcrep, dcrep, c As Byte
    Public plrep, dlrep, i As Long
    Public rep, txt1, txt2 As String
    Sub Maj_ComboBox1()
     
    Sheets("ACD_Info").Activate
     
    pcrep = 19
    dcrep = 49
    plrep = 2
    dlrep = 28
     
    txt1 = Cells(8, 7)
      If txt1 = "" Then
      MsgBox "Please choose a brand and a country."
      Exit Sub
    End If
     
    Sheets("ACD").Activate
    Sheets("ACD").ComboBox1.Clear
    For c = pcrep To dcrep
    txt2 = Cells(plrep, c)
      If txt2 = txt1 Then
        For i = plrep + 1 To dlrep
        rep = Sheets("ACD_Info").Cells(i, c)
             If rep <> "" Then
             Sheets("ACD").ComboBox1.AddItem rep
             End If
        Next i
      End If
    Next c
     
    End Sub
    J'ai mis les variables en "Public" car elles pourront être récupérées dans d'autres procédures.
    Si ça fonctionne on reverra le cas de la réutilisation du nom.

    Amicalement.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Bon malheureusement, ca ne fonctionne plus :'(

    Cette ligne la, c'est numero de la ligne puis numero de la colonne ?
    En fait j'ai ma case de choix (marque et pays) en G8 (cellule fusionnee avec H8) sur la feuille ACD, et meme si elle est remplie, quand je double clic dessus il me met le message d'erreur quand une case est vide.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    En fait je viens de comprendre que le txt1 il va le chercher dans ACD_Info au lieu de prendre celui qui est dans ACD (celui que le aera manager rempli).

    J'ai fait une petite ruse en copiant la valeur de ACD!$G$8 dans la case ACD_Inof!$G$8, mais ca ne m'affiche toujours pas la liste des SalesRep dans la ComboBox.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    CA FONCTIONNE !!!!
    MERCI jacques_jean !!!

    En fait il manquait une ligne pour lui dire d'aller faire la recherche dans ACD_Info.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sheets("ACD").Activate
    Sheets("ACD").ComboBox1.Clear
    For c = pcrep To dcrep
    'J'ai rajoute le "Sheets("ACD_Info")."
    txt2 = Sheets("ACD_Info").Cells(plrep, c)
      If txt2 = txt1 Then
        For i = plrep + 1 To dlrep
        rep = Sheets("ACD_Info").Cells(i, c)
             If rep <> "" Then
             Sheets("ACD").ComboBox1.AddItem rep
             End If
    Maintenant on peut passer a la seconde etape !
    Voir ce sujet :
    http://www.developpez.net/forums/sho...d.php?t=349567

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Une petite derniere question pour la route !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    La on lui dit de mettre a jour la ComboBox quand y'a un double clic, est-ce qu'on peut mettre a jour la ComboBox quand il y a un changement de valeur.

    En gros est-ce qu'on peut eviter d'avoir a double cliquer sur la valeur apres l'avoir rentree ?

  16. #16
    Invité
    Invité(e)
    Par défaut
    Re Henricoo,

    Il y a bien cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Remplacer :
    Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Par :
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Mais dans ce cas il faut : changer la sélection dans la zone de liste.

    Cliquer sur une cellule autre puis cliquer sur la cellule contenant la sélection.

    Il y a bien sur aussi la solution de créer un bouton pour lancer la macro (il n'y aura plus besoin du code de la feuille, on affecte directement la macro contenue dans le module.

    Une 3ème solution, oui, peut-être ou sans doute. Je ne trouve pas pour l'instant.

    Amicalement.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Ca fonctionne mais le probleme c'est qu'il faut "valider" la cellule, ce qui revient un peu au double-click.

    Qu'estce que tu entendais par modifier la zone de liste ?

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour Enricoo,

    Qu'estce que tu entendais par modifier la zone de liste ?

    Je voulais dire sélectionner Marque/pays dans la cellule contenant la liste.

    Mais en fait j'ai trouvé une solution qui vous permet de lancer la mise à jour sur une simple sélection :

    -Vous supprimez la liste se trouvant sous "Case de sélection" dans la feuille ACD
    -vous créez à la place une Zone de liste puis clic droit sur cette zone de liste puis vous cliquez sur propriétés.
    -dans la ligne "ListFillRange" vous tapez =plage de cellules contenant Marque/pays. Exemple = C3:C8
    -vous remplacez le code se trouvant dans la feuille "ACD" par le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub ListBox1_Click()
    Call Maj_ComboBox1
    End Sub
    -dans la procédure : Sub Maj_ComboBox1() du module vous remplacez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    txt1 = Cells(8, 7)
     
    par :
     
    txt1 = Sheets("ACD").ListBox1
    Dès que vous sélectionnez une Marque dans la zone de liste la procédure de mise à jour se lance.

    Amicalement.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    J'ai teste et ca fonctionne, mais faut pas seulement faire defiler avec les fleches, faut le mettre en surbrillance, et ca ils risquent d'oublier de le faire.

    Du coup j'ai fait un bouton update, je pense que c'est plus simple !

    Grand merci !

  20. #20
    Invité
    Invité(e)
    Par défaut
    Re Henricoo,

    J'ai teste et ca fonctionne, mais faut pas seulement faire defiler avec les fleches, faut le mettre en surbrillance, et ca ils risquent d'oublier de le faire.
    Mais cela doit se faire pour sélectionner que ce soit une cellule ou un élément d'une liste créée avec Données, Validation ou d'une ListBox ou ComboBox.

    Donc s'ils oublient de le faire, ne risquent t'ils pas de cliquer sur le bouton pour rien ?

    Amicalement.

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

Discussions similaires

  1. comment diriger un lien vers une autre base de donnee
    Par blueice dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/07/2007, 13h13
  2. Comment créer un lien vers une url ?
    Par Teddy dans le forum Delphi
    Réponses: 5
    Dernier message: 28/11/2006, 18h43
  3. Réponses: 11
    Dernier message: 17/10/2006, 17h55
  4. cherche comment copier le champ vers une autre champ
    Par khier dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 01/07/2005, 12h20

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