Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Scripting Dictionary

2 réponses
Avatar
Nyck0las
Bonjour,

Je suis en train d'=E9crire une macro excel dans laquelle j'utilise un
dictionnaire.
Je le remplis sans doublons en parcourant une liste dont je choisis
certains =E9l=E9ments avec un test.

Set mondico =3D CreateObject("Scripting.Dictionary")

For i =3D 2 To [A65000].End(xlUp).Row
cle =3D Sht.Cells(i, Chp("Collect")) & "|" & Sht.Cells(i,
Chp("Dom"))
tst =3D True
If Me.cmbDom <> "" And tst Then
If Sht.Cells(i, Chp("Dom")) <> Me.cmbDom Then tst =3D False
End If
If tst Then
If Not mondico.exists(cle) Then
mondico.Add cle, i
Else
y =3D 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=E9ro des lignes correspondantes
dans le champ =E9l=E9ment de la paire (cl=E9, =E9l=E9ment) en les s=E9parant=
par
"|".
Comme ce sont en fait les =E9l=E9ments doubles qui m'int=E9ressent, je
souhaite ensuite retirer les =E9l=E9ments qui ne sont pas doubles.

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

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

(Quand je ne mets pas la ligne i=3Di-1, il me reste des =E9l=E9ments non
doublons)

L=E0 =E7=E0 semble fonctionner mais par contre le dernier =E9l=E9ment de la
liste, qui n'est pas un doublon dans mon cas, n'est pas supprim=E9.

Quelqu'un aurait-il une id=E9e ?

2 réponses

Avatar
MichDenis
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" a écrit dans le message de news:

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 ?
Avatar
Nyck0las
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"