[VBA] Supprimer elements communs 2 listes
Fermé
mrsmith1
-
11 janv. 2012 à 12:07
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 11 janv. 2012 à 14:06
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 11 janv. 2012 à 14:06
A voir également:
- [VBA] Supprimer elements communs 2 listes
- Supprimer une page word - Guide
- Supprimer compte instagram - Guide
- Supprimer liste déroulante excel - Guide
- Supprimer edge - Guide
- 2 comptes whatsapp - Guide
3 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 744
11 janv. 2012 à 13:18
11 janv. 2012 à 13:18
Pour te donner une réponse complète et adaptée à ton cas, du moins ce que tu nous présente, voici un code d'effacement d'items de collection.
Il te faut stocker, dans une variable tableau, les item d'une des deux collections pour ne pas bugguer... Effectivement, lors de la suppression, dans ton code du premier tableau_B.Remove (i), To tableau_B.count, s'il était à 10 éléments par exemple, passe à 9. Ok? Or tu continue dans la boucle k à dire : Si tableau_B0(k) = tableau_B(i). Si i était égal à tableau_B.count initial, soit 10, tableau_B(10) n'existant plus, tu va beugguuer.....
Il te faut stocker, dans une variable tableau, les item d'une des deux collections pour ne pas bugguer... Effectivement, lors de la suppression, dans ton code du premier tableau_B.Remove (i), To tableau_B.count, s'il était à 10 éléments par exemple, passe à 9. Ok? Or tu continue dans la boucle k à dire : Si tableau_B0(k) = tableau_B(i). Si i était égal à tableau_B.count initial, soit 10, tableau_B(10) n'existant plus, tu va beugguuer.....
Dim tableau_B As New Collection Dim tableau_B0 As New Collection Dim Tabl() As Integer Dim i As Integer, k As Integer, Cpt As Integer For i = tableau_B.Count To 1 Step -1 For k = tableau_B0.Count To 1 Step -1 If tableau_B0(k) = tableau_B(i) Then ReDim Preserve Tabl(Cpt) Tabl(Cpt) = i Cpt = Cpt + 1 tableau_B0.Remove k End If Next k Next i For i = 0 To UBound(Tabl) tableau_B.Remove Tabl(i) Next
leen.net
Messages postés
212
Date d'inscription
lundi 31 janvier 2011
Statut
Membre
Dernière intervention
14 mai 2014
13
11 janv. 2012 à 12:57
11 janv. 2012 à 12:57
je pense que tu compares chaque cellule de B par B0,
c.a.d que si B[1]==B0[4], il ne les supprime pas... c'est ça ce que tu voudrais??
c.a.d que si B[1]==B0[4], il ne les supprime pas... c'est ça ce que tu voudrais??
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 744
11 janv. 2012 à 13:01
11 janv. 2012 à 13:01
Bon...
Ou as tu été chercher la syntaxe RemoveAt???
La bonne syntaxe pour supprimer un élément d'une collection est :
Variable.Remove item:=index
Soit dans ton cas : tableau_B.Remove i
Mais quel est l'intérêt de boucler sur tes collections si tu souhaites juste éviter les doublons? L'intérêt d'une collection est justement de créer des listes sans doublons.
Et si avant de te lancer tête baissée dans des macros que tu ne maîtrise pas, tu te renseignait un minimum. Ou alors si tu nous disais exactement :
- ce que tu as au départ
- ce que tu veux en faire...
Ou as tu été chercher la syntaxe RemoveAt???
La bonne syntaxe pour supprimer un élément d'une collection est :
Variable.Remove item:=index
Soit dans ton cas : tableau_B.Remove i
Mais quel est l'intérêt de boucler sur tes collections si tu souhaites juste éviter les doublons? L'intérêt d'une collection est justement de créer des listes sans doublons.
Et si avant de te lancer tête baissée dans des macros que tu ne maîtrise pas, tu te renseignait un minimum. Ou alors si tu nous disais exactement :
- ce que tu as au départ
- ce que tu veux en faire...
j'avais trouvé :
C- Éliminer, insérer un élément dans une collection.
L.Remove("toto") 'On enlève un élément de la liste
L.RemoveAt(0) 'On enlève l'élément 0 de la liste
Insert permet d'insérer à un index spécifié.
L.Insert( position, Ainserrer)
Du coup, ce que je cherche a faire est de prendre une feuille excel B, après j'en tire une liste qui peut avoir des doublons, je dois supprimer les doublons et je doit extraire le nombre d'elements de la liste.
Ensuite, je fais la meme chose avec la feuille excel B0.
A partir de la, jai 2 collections (B et B0), et je souhaite, dans les 2 collections, supprimer les éléments communs.
C- Éliminer, insérer un élément dans une collection.
L.Remove("toto") 'On enlève un élément de la liste
L.RemoveAt(0) 'On enlève l'élément 0 de la liste
Insert permet d'insérer à un index spécifié.
L.Insert( position, Ainserrer)
Du coup, ce que je cherche a faire est de prendre une feuille excel B, après j'en tire une liste qui peut avoir des doublons, je dois supprimer les doublons et je doit extraire le nombre d'elements de la liste.
Ensuite, je fais la meme chose avec la feuille excel B0.
A partir de la, jai 2 collections (B et B0), et je souhaite, dans les 2 collections, supprimer les éléments communs.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 744
11 janv. 2012 à 13:56
11 janv. 2012 à 13:56
Pour remplir une collection sans doublon, il te faut utiliser le paramètre Key.
Exemple :
Avec l'option Key, on peut interdire les doublons dans une collection. Et Remove pour supprimer :
En clair, l'ajour d'un élément possédant le même Item ne fait rien. Si par contre le même paramètre Key apparait plusieurs fois, ton code Buggue : Erreur d'exécution 457 cette clé est déjà associée à un élément de la collection. En ajoutant donc On error resume next, cet élément n'est pas enregistré dans la collection et donc =====> Pas de doublons!
Source : http://boisgontierjacques.free.fr/pages_site/Collection.htm
Sources pour l'explication : Michel_m
Exemple :
Avec l'option Key, on peut interdire les doublons dans une collection. Et Remove pour supprimer :
Sub CollectionSansDoublons() Dim MaListe As New Collection On Error Resume Next MaListe.Add Item:="Dupont", key:="Dupont" MaListe.Add Item:="Durand", key:="Durand" MaListe.Add Item:="Martin", key:="Martin" MaListe.Add Item:="Martin", key:="Martin" MaListe.Remove 2 For i = 1 To MaListe.count Cells(i, 5) = MaListe(i) Next i End Sub
En clair, l'ajour d'un élément possédant le même Item ne fait rien. Si par contre le même paramètre Key apparait plusieurs fois, ton code Buggue : Erreur d'exécution 457 cette clé est déjà associée à un élément de la collection. En ajoutant donc On error resume next, cet élément n'est pas enregistré dans la collection et donc =====> Pas de doublons!
Source : http://boisgontierjacques.free.fr/pages_site/Collection.htm
Sources pour l'explication : Michel_m
Modifié par michel_m le 11/01/2012 à 13:49
pijaku
Si tu instancies par New collection, il faut fermer par
set lacollection=nothing
sinon tu risques de garder en mémoire les item de la collection (expérience perso)
mais il vaut mieux utiliser les dictionary
(pas le temps d'écrire le code)
2 dico
creer la liste des keys de dico1
liste=dico1.keys
parcourir liste en testant dico2 par if exists
si oui, tu supprimes la key testée des 2 dicos
ala fin tu fais 2 liste.keys que ttu colles à l'endroit voulu
11 janv. 2012 à 13:42
Merci de l'info. Ca ils le disent pas sur boisgontierjacques.free.fr...
Très bon à savoir.
Merci
A+
11 janv. 2012 à 13:51
11 janv. 2012 à 13:58
https://www.cjoint.com/?3Aln6pVpZ9r
11 janv. 2012 à 14:06
J'ai lu.
Très bon topo, explicite, j'ai tout compris, du moins je le crois...
Du coup, faut que je change partout mes :
Par :
Ou par :
Merci du tuyau