Scripting Dictionary

Le
Nyck0las
Bonjour,

Je suis en train d'écrire une macro excel dans laquelle j'utilise un
dictionnaire.
Je le remplis sans doublons en parcourant une liste dont je choisis
certains éléments avec un test.

Set mondico = CreateObject("Scripting.Dictionary")

For i = 2 To [A65000].End(xlUp).Row
cle = Sht.Cells(i, Chp("Collect")) & "|" & Sht.Cells(i,
Chp("Dom"))
tst = True
If Me.cmbDom <> "" And tst Then
If Sht.Cells(i, Chp("Dom")) <> Me.cmbDom Then tst = False
End If
If tst Then
If Not mondico.exists(cle) Then
mondico.Add cle, i
Else
y = mondico.Item(cle)
mondico.Remove (cle)
mondico.Add cle, y & "|" & i
End If
End If
Next

Quand il y a doublon, je stocke le numéro des lignes correspondantes
dans le champ élément de la paire (clé, élément) en les séparant=
par
"|".
Comme ce sont en fait les éléments doubles qui m'intéressent, je
souhaite ensuite retirer les éléments qui ne sont pas doubles.

n = mondico.Count
a = mondico.keys
b = mondico.items

For i = 0 To n - 1
If Not b(i) Like "*|*" Then
mondico.Remove (a(i))
i = i - 1
End If
i = i + 1
Next

(Quand je ne mets pas la ligne i=i-1, il me reste des éléments non
doublons)

Là çà semble fonctionner mais par contre le dernier élément de la
liste, qui n'est pas un doublon dans mon cas, n'est pas supprimé.

Quelqu'un aurait-il une idée ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MichDenis
Le #6768441
D'abord tu te serts d'un filtre élaboré et tu utilises une petite formule
du genre =Nb.Si($A$2:$A$65536;A2) > 1 ou égale 2 selon que
tu t'intéresses à toutes les entrées dont l'occurence est plus grande que 1
ou seulement aux entrées qui ont un double.

P.S. La dernière cellule de la colonne A peut facilement être déterminée par
programmation. Cela emêche d'inclure des plages disproportionnées par rapport
à la réalité !

Comme tu n'auras que la première occuence de chacun des doublons, tu oublies
ton machin de dictionnaire et tu boucles seulement sur les cellules visibles de
la colonne A.

Est-ce assez simple ?
;-)



"Nyck0las"
Bonjour,

Je suis en train d'écrire une macro excel dans laquelle j'utilise un
dictionnaire.
Je le remplis sans doublons en parcourant une liste dont je choisis
certains éléments avec un test.

Set mondico = CreateObject("Scripting.Dictionary")

For i = 2 To [A65000].End(xlUp).Row
cle = Sht.Cells(i, Chp("Collect")) & "|" & Sht.Cells(i,
Chp("Dom"))
tst = True
If Me.cmbDom <> "" And tst Then
If Sht.Cells(i, Chp("Dom")) <> Me.cmbDom Then tst = False
End If
If tst Then
If Not mondico.exists(cle) Then
mondico.Add cle, i
Else
y = mondico.Item(cle)
mondico.Remove (cle)
mondico.Add cle, y & "|" & i
End If
End If
Next

Quand il y a doublon, je stocke le numéro des lignes correspondantes
dans le champ élément de la paire (clé, élément) en les séparant par
"|".
Comme ce sont en fait les éléments doubles qui m'intéressent, je
souhaite ensuite retirer les éléments qui ne sont pas doubles.

n = mondico.Count
a = mondico.keys
b = mondico.items

For i = 0 To n - 1
If Not b(i) Like "*|*" Then
mondico.Remove (a(i))
i = i - 1
End If
i = i + 1
Next

(Quand je ne mets pas la ligne i=i-1, il me reste des éléments non
doublons)

Là çà semble fonctionner mais par contre le dernier élément de la
liste, qui n'est pas un doublon dans mon cas, n'est pas supprimé.

Quelqu'un aurait-il une idée ?
Nyck0las
Le #6791161
ouais la solution du filtre élaboré, c'est pas bête :-)
J'ai dejà posté quelques questions du même style et c'est la premièr e
fois qu'on me suggère çà.

mais du coup si je pars dans cette voie, je vais devoir faire quelques
modifs :-(

En particulier, cette requete multicritère me permettait de réaliser
une sélection d'un échantillon dans ma base de données.

En gros le filtre va me supprimer les lignes indésirables, et je
souhaiterais afficher dans une listbox le résultat de la recherche
mais en affichant uniquement certaines colonnes.

Je pense qu'il faut utiliser la propriété lstbox.Rowsource = "plage de
données"
Publicité
Poster une réponse
Anonyme