Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2012, 14h31   #1
Invité régulier
 
Homme Defter Defter
Dessinateur industriel
Inscription : mai 2011
Messages : 35
Détails du profil
Informations personnelles :
Nom : Homme Defter Defter
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 35
Points : 8
Points : 8
Par défaut Combobox dans feuille sans doublon

Bonjour à toutes et à tous,

Un problème me bloque depuis pas mal de temps et impossible d'adapter les macro trouvées dans différent thread..

Celui-ci est tout simple :

J'ai une colonne A composée de diverses valeurs. Exemple : XX1 XX2 XX3 ...
Celles-ci ce répètent plusieurs fois dans la colonne A
J'ai nommé la plage ou ce trouve les valeurs : Gamme

Quand j'intègre "Gamme" à une combobox (Combobox1), ça marche mais tout il y a évidement les valeurs qui ce répètent.

J'ai adapté une macro existante à mon problème :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub RemplirComboBox1()
    Dim Cell As Range
 
    'Supprime les données existantes dans le ComboBox
    Worksheets("Data").ComboBox1.Clear
 
    'Boucle sur les cellules de la plage Gamme pour
    'alimenter le ComboBox
    For Each Cell In Worksheets("Data").Range("Gamme")
        Worksheets("Data").ComboBox1 = Cell
        'remplissage sans doublon
        If Worksheets("Data").ComboBox1.ListIndex = -1 Then _
            Worksheets("Data").ComboBox1.AddItem Cell
    Next Cell
End Sub
En insérant ça dans la feuille "Data" cela ne marche pas.
J'ai essayé différente solution mais la je bloque totalement...

Merci pour vos réponses,
Defter
Defter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 14h48   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Pour ma part, je remplirais d'abord un dictionnaire à partir du range en évitant les doublons (grâce à Exists), puis je remplirais la combobox.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2012, 14h50   #3
Invité régulier
 
Homme Defter Defter
Dessinateur industriel
Inscription : mai 2011
Messages : 35
Détails du profil
Informations personnelles :
Nom : Homme Defter Defter
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 35
Points : 8
Points : 8
Bonjour Zebreloup, et Bonne année !

Merci pour ta réponse mais pourrais-tu être plus précis ? Je suis encore un Novice en VBA et j'avoue ne pas saisir complètement ta réponse.

Cordialement,
Defter
Defter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 14h51   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 920
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 920
Points : 7 237
Points : 7 237
Bonjour,

Une autre version en utilisant Instr

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim Str As String
Dim i As Integer
Dim Str2() As String
 
'on charge dans Str la liste unique des occurrences 
For i = 1 To 100
    If InStr(Str, Range("A" & i).Value) = 0 Then
        If Str <> "" Then Str = Str & ","
        Str = Str & Range("A" & i).Value
    End If
Next
 
'Mise en place des occurrences dans une variable tableau
Str2 = Split(Str, ",")
 
'Insertion dans la combobox
ComboBox1.Clear
For i = 0 To UBound(Str2)
    ComboBox1.AddItem Str2(i)
Next i
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 02/01/2012, 14h59   #5
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Essaie ce code après avoir coché Microsoft Scripting Runtime dans les références :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Sub RemplirComboBox1()
    Dim cbx As ComboBox
    Dim gamme As Range
    Dim d As Dictionary
    Dim c As Range
    Dim v As Variant
 
    'Création du dictionnaire
    Set rg = Worksheets("Data").Range("Gamme")
    Set d = New Dictionary
 
    For Each c In rg
        'On n'ajoute la valeur de la cellule qui si elle n'existe pas déjà
        If Not d.Exists(c.Value) Then d.Add c.Value, c.Value
    Next c
 
    'Remplissage de la comboBox
    Set cbx = Worksheets("Data").ComboBox1
    cbx.Clear
 
    For Each v In d.Items
        cbx.AddItem v
    Next v
End Sub
@jfontaine : Bonne idée ! Il faut juste être sûr qu'il n'y a pas de virgules dans les cellules.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 02/01/2012, 15h10   #6
Invité régulier
 
Homme Defter Defter
Dessinateur industriel
Inscription : mai 2011
Messages : 35
Détails du profil
Informations personnelles :
Nom : Homme Defter Defter
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 35
Points : 8
Points : 8
Bonjour Jfontaine et merci .

Merci Zebreloup !

Mais question bête : Je copie ça ou ?
Directement dans la feuille et je fais clic droit sur la combobox de la feuille et je la met dedans ?

Je ne sais jamais ou mettre les macros ... :/ désolé x).

Encore merci pour vos réponses,
Cordialement,
Defter

Alors j'ai ajouté la macro dans la feuille "Data" et il me dit :

Propriétée ou méthode non gérée par cet Objet
Code Erreur 438
...

J'ai coché Microsoft scipting runtime.

Cordialement,
Defter
Defter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h10   #7
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour à tous

Ci-joint code de ZebreLoup modifié en utilisant une seule boucle
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Public Sub RemplirComboBox1()
Dim Cbx As ComboBox
Dim c As Range
Dim d As New Dictionary
 
'Création du dictionnaire
With Worksheets("Data")
    Set Cbx = .ComboBox1
    Cbx.Clear
    For Each c In Worksheets("Data").Range("Gamme")
        'On n'ajoute la valeur de la cellule qui si elle n'existe pas déjà
        If Not d.Exists(c.Value) And c.Value <> "" Then
            d.Add c.Value, c.Value
            Cbx.AddItem c.Value
        End If
    Next c
    Set d = Nothing
    Set Cbx = Nothing
End With
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2012, 15h46   #8
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Tu pouvais mettre ce code dans un module. Si tu veux le mettre sur la feuille "Data", tu peux même remplacer les Worksheets("Data") par Me.
En fait ça dépend d'où tu veux appeler cette macro.

Pour ton erreur elle intervient sur quelle ligne ?
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h55   #9
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

Pour les Combobox, astucieux et concis :

Citation:
Envoyé par SilkyRoad
Code :
1
2
3
4
5
6
7
8
9
10
11
 
Private Sub UserForm_Initialize()
    Dim j As Integer
 
    'Récupère les données de la colonne A...
    For j = 1 To Range("A65536").End(xlUp).Row
        ComboBox1 = Range("A" & j)
        '...et filtre les doublons
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Range("A" & j)
    Next j
End Sub
dans la FAQ : http://excel.developpez.com/faq/?pag...stIndexNegatif

Cordialement,

Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 02/01/2012, 15h56   #10
Invité régulier
 
Homme Defter Defter
Dessinateur industriel
Inscription : mai 2011
Messages : 35
Détails du profil
Informations personnelles :
Nom : Homme Defter Defter
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 35
Points : 8
Points : 8
La ligne n'est pas précisée, quand je la test avec "Lecture" le message d'erreur apparaît sans plus de précision.

Enfaite j'aimerai que cette macro s'exécute à l'ouverture du fichier, cela est il possible ?

Merci pour ton suivis et pour ton aide.


Cordialement,
Defter
Defter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h08   #11
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
@Ormonth : oui, c'est vrai, je n'avais pas pensé à demander pourquoi le premier code ne marchait pas.

@Defter : Normalement, quand il y a un message d'erreur à l'exécution d'une macro, il te proposer de l'arrêter ou de déboguer. Si tu choisis cette dernière option, tu devrais te retrouver sur la ligne qui pose problème.

De manière générale, on peut mettre son code sur les feuilles, dans un module ou dans un module de classe. J'exclue le module de classe pour le moment car je pense que tu n'en es pas encore là.
Par principe (après, chacun fait comme il veut), j'essaie de mettre le code dans un module, sauf quand il s'agit de petites opérations concernant seulement une feuille et déclenchées par un évènement de cette feuille.
Si tu ne sais pas ce qu'est un évènement, tu trouveras de bonnes explications en cherchant un peu dans les cours de ce site, mais en gros, c'est un code (une macro) qui se déclenche quand un évènement se produit (click sur un bouton, changement dans une feuille...). C'est là justement qu'on rejoint ta dernière question : en plus de toutes les feuilles de ton classeur, tu as par défaut un objet ThisWorkbook, qui possède l'évènement Open. Donc si dans ThisWorkbook tu places :
Code :
1
2
3
Private Sub Workbook_Open()
'Le code mis ici se déclenchera à l'ouverture du classeur
End Sub
Tu pourras exécuter qq chose à l'ouverture. Encore une fois, il vaut mieux créer une procédure dans un module et l'appeler dans cet évènement que de mettre directement ici le code complet de ce que tu veux faire.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2012, 09h55   #12
Invité régulier
 
Homme Defter Defter
Dessinateur industriel
Inscription : mai 2011
Messages : 35
Détails du profil
Informations personnelles :
Nom : Homme Defter Defter
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Bâtiment

Informations forums :
Inscription : mai 2011
Messages : 35
Points : 8
Points : 8
Bonjour à tous,

Excusez moi pour le manque de réponse, j'ai du m'absenter.

J'ai finalement trouver une solution à mon problème sans utiliser de code,

Avec la fonction INDEX et des conditions j'ai pu aboutir à ce que je cherchais,

Merci pour l'attention porté au sujet

Cordialement,
Defter
Defter est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h39.


 
 
 
 
Partenaires

Hébergement Web