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 :

Plusieurs Combobox sur 1 même liste à rafraîchir [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut Plusieurs Combobox sur 1 même liste à rafraîchir
    Bonjour,
    Dans un userform, je dispose de plusieurs combobox Cbox1, Cbox2... se référant chacune à une MEME liste (Rowsource LIST) placée dans une feuille annexe.

    Je souhaiterais mettre à jour cette liste pour Cbox2 afin que les valeurs proposées ne contiennent plus la valeur choisie en Cbox1.
    Autrement dit, si 10 valeurs sont disponibles pour Cbox1 alors Cox2 (tabindex+1) ne proposera que 10 - la valeur choisie en Cbox1 soit 9 valeurs. La valeur précédemment sélectionnée sera exclue. Etc pour Cbox3 (8), Cbox4 (7)....

    Quelqu'un a-t-il une proposition de code VBA ? D'avance, Merci.

  2. #2
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonsoir marcel le forum je vois pas bien ce que tu veus faire!!! il faudrait en savoir plus sur ton projet pour eviter tous les problémes de selection que cela peut engendrer
    une approche tres basique 5 comboboxs donnees sur la méme feuille pour faire simple
    code user:

    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
    Dim t As Variant, c As Range
    Private Sub UserForm_initialize()
    t = Range("a2:a" & Range("a65536").End(xlUp).Row): ComboBox1.List = t
    End Sub
    Private Sub ComboBox1_Click()
    ComboBox2.Clear: ComboBox3.Clear: ComboBox4.Clear: ComboBox5.Clear
    For Each c In Range("A2:a" & Range("A65536").End(xlUp).Row)
    ComboBox2 = c
    If ComboBox2 <> ComboBox1.Value Then ComboBox2.AddItem c
    Next c
    End Sub
    Private Sub ComboBox2_Click()
    ComboBox3.Clear: ComboBox4.Clear: ComboBox5.Clear
    For Each c In Range("A2:a" & Range("A65536").End(xlUp).Row)
    ComboBox3 = c
    If ComboBox3 <> ComboBox2.Value And ComboBox3 <> ComboBox1.Value Then ComboBox3.AddItem c
    Next c
    End Sub
    Private Sub ComboBox3_Click()
    ComboBox4.Clear: ComboBox5.Clear
    For Each c In Range("A2:a" & Range("A65536").End(xlUp).Row)
    ComboBox4 = c
    If ComboBox4 <> ComboBox2.Value And ComboBox4 <> ComboBox1.Value _
    And ComboBox4 <> ComboBox3.Value Then ComboBox4.AddItem c
    Next c
    End Sub
    Private Sub ComboBox4_Click()
    ComboBox5.Clear
    For Each c In Range("A2:a" & Range("A65536").End(xlUp).Row)
    ComboBox5 = c
    If ComboBox5 <> ComboBox2.Value And ComboBox5 <> ComboBox1.Value _
    And ComboBox5 <> ComboBox4.Value And ComboBox5 <> ComboBox3.Value Then ComboBox5.AddItem c
    Next c
    End Sub
    tu remarques que c'est pas simple a mettre en oeuvre on peut optimiser par des boucles assez complexe. module de classe ect..j'espere que tu as pas plus de comboboxs

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour faire ça tu pourrais avantageusement utiliser une collection.
    Contrairement à un tableau dont on ne peut supprimer un indice, seulement l'effacer [Tableau(i) = ""] une collection permet de supprimer un item où qu'il se trouve.
    Ainsi, lors de la première sélection dans le premier combo, si la collection reproduit le combo, il est possible d'en supprimer l'item correspndant à la sélection pour renseigner le combo suivant.
    Et ainsi de suite.
    Le principe de base valable pour tous les combos :
    - sélection d'un item dans un combo -> Listindex fournit l'index de l'item à supprimer ds le combo suivant
    - Remplissage de la collection
    - Suppression de l'item str(Listindex) dans la collection (remove)
    - Utilisation de la collection pour renseigner le combo suivant
    Cette procédure peut être unique pour tous les combos si elle est paramétrée.
    Juste une idée

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    @ laetitia
    Un exemple :
    J'ai 3 Combobox Cbox1 Cbox2 Cbox3 liée chacune à 3 cellules différentes d'une feuille de classeur c1 c2 c3.
    Les 3 Cbox font référence (rowsource) à une MEME liste de valeur v1, v2 v3
    Si je choisis v2 par la Cbox1 pour alimenter c1, alors dans Cbox2 la liste de valeurs proposées sera v1,v3 sachant que v2 a déjà été utilisée par Cbox1
    Ainsi de suite. La liste de choix diminuera à chaque fois de la valeur choisie précédemment.
    Plus généralement : Si la liste initiale a n valeurs, et que j'ai déjà initié (pardon pour les termes techniques) p Combobox alors la Combobox suivante proposera (n - les p valeurs déjà utilisés.) soit n-p valeurs.
    Merci.

    @ ouskel'n'or
    Merci pour cet algorithme
    Ne reste plus qu'à trouver la bonne syntaxe pour les instructions de cette application !...
    Bonne journée. Cordialement. Marcel

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour tous, bonjour Leti (toujours amatrice des classes)
    Une petite chose me chiffone dans l'exposer :
    Pourquoi mettre 3 combo avec la même liste, suffirait simplement d'enlever la ligne qui a déjà été choisie (Remove.Item) ? ou alors j'ai rien compris.
    A+

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par Le Bûcheron
    Pourquoi mettre 3 combo avec la même liste
    Toujours à poser des questions...
    Tiens, Marcel, voici toujours un code qui est fait pour ce que t'as
    J'ai utilisé 10 combos dans un userform et j'ai placé les données de A1 à A10
    Données que je mets afin que tu puisses contrôler le bon fonctionnement du bidule. (je n'ai finalement pas trouvé nécessaire d'utiliser les collections)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	A
    1	un
    2	deux
    3	trois
    4	quatre
    5	cinq
    6	six
    7	sept
    8	huit
    9	neuf
    10	dix
    Tu places le code suivant dans la feuille de code de l'userform nommé userform1
    Tu places 10 combobox (de Combobox1 à ComboBox10) dans l'usf et tu exécutes
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    Private Sub ComboBox1_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox2_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox3_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox4_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox5_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox6_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox7_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox8_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox9_Click()
    Dim Combo As String, NoCombo As Byte
        Combo = ActiveControl.Name 'Le nom du combobox actif
        NoCombo = Mid(Combo, 9, Len(Combo) - 8) 'on récupère le N° du combobox
        ComboSuivant NoCombo
    End Sub
     
    Private Sub ComboBox10_Click()
        MsgBox StrReverse("ruecraf")
    End Sub
     
    Private Sub CommandButton1_Click()
    Unload UserForm1
    End Sub
     
    Private Sub UserForm_Initialize()
        ComboBox1.RowSource = "A1:A10"
    End Sub
     
    Sub ComboSuivant(NoCombo As Byte)
    Dim NoIndex As Byte
        NoIndex = Controls("ComboBox" & NoCombo).ListIndex
        For i = 0 To Controls("ComboBox" & NoCombo).ListCount - 1
            If i <> NoIndex Then Controls("ComboBox" & NoCombo + 1).AddItem Controls("ComboBox" & NoCombo).List(i)
        Next
        Controls("ComboBox" & NoCombo + 1).Visible = True
    End Sub
    Teste tel quel avant de ramener à neuf le nombre de combos. Sinon tu auras un pb que tu découvriras bien assez tôt

    On peut simplifier tous les clics pour n'en avoir qu'un seul mais comme ça demande un module de classe et que je dois me sauver, je compte un pneu sur les anciens pour te guider.
    Bonne soirée
    A+

    Edit
    Avant de lancer, masque les combo de Bombobox2 à 10, sinon certaine lignes ne servent à rien. Tu sélectionnes les 9 combos simultanément et tu passes la Propriété Visible à false.

    Edit bis
    Épi il te faut un bouton sans quoi le code du bouton il sert à rien
    Faut vraiment que G.I.

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

Discussions similaires

  1. [XL-2010] PB remplir une ComboBox avec les valeurs de plusieurs cellules sur la même lignes
    Par eviuss dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/05/2014, 07h01
  2. [PPT-2003] plusieurs combobox sur un même slide
    Par thiefer dans le forum Powerpoint
    Réponses: 7
    Dernier message: 21/05/2010, 13h18
  3. Héberger plusieurs sites sur la même machine
    Par fgiuliano dans le forum Apache
    Réponses: 9
    Dernier message: 27/10/2005, 10h29
  4. [Débutant] Plusieurs versions sur un même système ?
    Par castaka dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 15/02/2005, 10h21
  5. Réponses: 4
    Dernier message: 14/10/2004, 17h36

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