Tri formules matricielles vs "Scripting.Dictionary"

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonjour,

Je veux trier une liste (par orfre alphabétique et sans doublons). Pour ce faire j'ai, dans un premier temps, utilisé des formules matricielles glanées dans le forum. Ça marche parfaitement.
Je me demandais, découvrant le fameux "Scripting.Dictionary", si c'était possible d'y parvenir par ce biais. Je n'en doute pas et, avant de me lancer dans cette nouvelle aventure passionnante, je me suis plongé dans des aides trouvées sur le Net. Il y en a beaucoup dans toutes les langues. J'ai essentiellement retenu celles d'"Excellabo" et de BOISGONTIER.
Je signale que dans VBA menu "Outils/références" j'ai bien coché "Microsoft Scripting Runtime" (curieux, du reste, que ça ne le soit pas par défaut... Envoyez votre classeur à votre belle-mère, je la vois mal, pour que ça marche, cocher ce truc-là...).
Dans un premier temps je me suis attelé à virer les doublons. L'ordre alphabétique viendra après.
J'ai à peu près compris la "philosophie" du "Scripting.Dictionary", il n'empêche que ce que j'ai tenté de faire pour l'instant échoue lamentablement, comme d'hab...

Ci-joint mes tentatives.

Un grand merci pour me tirer d'affaire.
 

Pièces jointes

Re : Tri formules matricielles vs "Scripting.Dictionary"

Bonjour Magic_Doctor

Un modeste essai

Note: Je n'obtiens pas le même resultat que notre ami JB pour 2 raisons
1) Mon tri (à bulle je crois) mets le E accentué en fin de liste (j'ignore pourquoi)
2) Mon dictionnaire fais les eventuels cumuls (Voir la glycerine )
 

Pièces jointes

Dernière édition:
Re : Tri formules matricielles vs "Scripting.Dictionary"

Bonjour Magic_Doctor,

Tu travailles tous azimuts, tu n'as pas fini avec VBA 🙂

Code:
Sub ListeSansDoublons()
Dim dico As Object, c As Range
Set dico = CreateObject("scripting.dictionary")
For Each c In [BigListe1].Columns(1).Cells
  dico(c.Value) = dico(c.Value) + c(1, 2)
Next
With [BigListe2]
  Application.ScreenUpdating = False
  .ClearContents
  .Columns(1).Resize(dico.Count) = Application.Transpose(dico.keys)
  .Columns(2).Resize(dico.Count) = Application.Transpose(dico.items)
  .Sort .Columns(1)
End With
End Sub
Edit : salut JB et Pierre, je ne vous avais pas vus 🙂

A+
 
Dernière édition:
Re : Tri formules matricielles vs "Scripting.Dictionary"

bonjour tous 🙂🙂
seulemement pour saluer mes amis Pierre jean & Job🙂🙂

en complement pas la peine la ref.scri.... dans ce cas la

tu la cree deja avec CreateObject
par contre si tu ecris comme cela

Code:
  Dim dico As Dictionary

Code:
Set dico = New Dictionary
la oblige d'activer la ref..
d'ailleurs ecris comme cela le code peut etre beaucoup rapide en temps d'execution sur des grandes plages

autrement bien vu ton code Job simple rapide ect... comme dab..
 
Re : Tri formules matricielles vs "Scripting.Dictionary"

Amigos buenas tardes,

Merci à tous pour vos réponses.

BOISGONTIER, j'avoue que votre formule matricielle m'a surpris pour sa simplicité comparée à la précédente que j'avais utilisée.
Mais curieusement, si je rajoute un solvant et sa mv, la liste triée ne s'actualise pas.

pierrejean, ta solution marche très bien sans le "Scripting.Dictionary". J'ai seulement dû rajouter au début :
VB:
Option Compare Text
en raison de voyelles accentuées au début de certains mots apparaissant en début de phrase.

Ya lo sé job, soy un gaucho anarquista que se desparrama por doquier sin haber asimilado la bases elementales.
Plus sérieusement, d'une part ce "Scripting.Dictionary" m'intrigue depuis un moment, mais j'ai compris que je pouvais ainsi me débarrasser de 2 colonnes (d'autant plus que je ne suis pas un fana des formules), ce qui, par la suite simplifie pas mal les opérations (ça m'évite un copier-coller).
Ta solution est redoutablement rapide.
Pour qu'elle soit parfaite, serait-il possible d'éviter qu'en fin de liste, triée par ordre alphabétique et sans doublons, qu'il y ait un "0" (dont je ne comprends pas la présence. J'ai cru que c'était en raison du doublon "Glycérine" ; j'ai créé un autre doublon pensant qu'il y aurait un autre "0", et bien non) ?

laetitia90, je n'ai pas très bien compris (concernant un "truc" qu'à peine j'appréhende...). Mais pourquoi pas. Il faudrait m'approfondir cette subtilité, mais il est vrai que j'ai déjà vu des dictionnaires déclarés comme "Dictionary" et non comme "Object". Mais si ça permet d'aller encore plus vite, alors tant mieux !
 
Re : Tri formules matricielles vs "Scripting.Dictionary"

J'ai tenté de régler le problème du "0" à ma façon. Ma foi, ça a l'air de marcher.

VB:
Sub ListeSansDoublons()
'job75

'Dim dico As Object, c As Range
Dim dico As Dictionary 'essai
Dim c As Range

'Set dico = CreateObject("Scripting.Dictionary")
Set dico = New Dictionary 'essai

For Each c In [BigListe1].Columns(1).Cells
    If c(1, 2) = "" Then
        dico(c.Value) = dico(c.Value)
    Else
        dico(c.Value) = dico(c.Value) + c(1, 2)
    End If
Next

With [BigListe2]
  Application.ScreenUpdating = False
  .ClearContents
  .Columns(1).Resize(dico.Count) = Application.Transpose(dico.keys)
  .Columns(2).Resize(dico.Count) = Application.Transpose(dico.items)
  .Sort .Columns(1)
End With
End Sub
 
Re : Tri formules matricielles vs "Scripting.Dictionary"

Re,

Pour qu'elle soit parfaite, serait-il possible d'éviter qu'en fin de liste, triée par ordre alphabétique et sans doublons, qu'il y ait un "0"

Si pardon, me equivoque :

Code:
Sub ListeSansDoublons()
Dim dico As Object, c As Range
Set dico = CreateObject("scripting.dictionary")
For Each c In [BigListe1].Columns(1).Cells
  If c <> "" Then dico(c.Value) = dico(c.Value) + c(1, 2)
Next
With [BigListe2]
  Application.ScreenUpdating = False
  .ClearContents
  .Columns(1).Resize(dico.Count) = Application.Transpose(dico.keys)
  .Columns(2).Resize(dico.Count) = Application.Transpose(dico.items)
  .Sort .Columns(1)
End With
End Sub
A+
 
Re : Tri formules matricielles vs "Scripting.Dictionary"

Bonsoir BOIGONTIER, je n'avais pas rafraîchi.
En effet, si je rajoute quelque chose dans le tableau des données, le tri ne se fait pas.
 

Pièces jointes

Re : Tri formules matricielles vs "Scripting.Dictionary"

Ahora sí que puedo decir buenas noches job,

En repensant à la saisie des solvants + mv respectives, afin que le "pélerin" qui entrerait les données ne fasse pas de bourdes, comme omettre d'introduire la mv qui automatiquement serait alors "0", ce qui est impossible ; mais dans une liste "chiante comme du Claudel", ce type d'erreur peut finir par passer. Aussi, je préfère, tant que la mv n'a pas été introduite, que la cellule reste vierge, car un vide dans une liste, lui ne passe pas inaperçu.

VB:
Sub ListeSansDoublons()
'job75

'Dim dico As Object, c As Range
Dim dico As Dictionary 'essai
Dim c As Range

'Set dico = CreateObject("Scripting.Dictionary")
Set dico = New Dictionary 'essai

For Each c In [BigListe1].Columns(1).Cells
    dico(c.Value) = IIf(c(1, 2) = "", dico(c.Value), dico(c.Value) + c(1, 2))
Next

With [BigListe2]
  Application.ScreenUpdating = False
  .ClearContents
  .Columns(1).Resize(dico.Count) = Application.Transpose(dico.keys)
  .Columns(2).Resize(dico.Count) = Application.Transpose(dico.items)
  .Sort .Columns(1)
End With
End Sub

Encore merci job pour ton aide précieuse.

¡Y dos columnas menos en el quilombo de la hoja!
 

Pièces jointes

Re : Tri formules matricielles vs "Scripting.Dictionary"

Re,

La solution que j'ai proposée faisait la somme des valeurs quand il y a des doublons (voir Glycérine).

Ici ce n'est certainement pas souhaitable, donc utilise :

Code:
Sub ListeSansDoublons()
Dim dico As Object, c As Range
Set dico = CreateObject("scripting.dictionary")
For Each c In [BigListe1].Columns(1).Cells
  If c <> "" And Not dico.Exists(c.Value) Then dico(c.Value) = c(1, 2)
Next
With [BigListe2]
Application.ScreenUpdating = False
  .ClearContents
  .Columns(1).Resize(dico.Count) = Application.Transpose(dico.keys)
  .Columns(2).Resize(dico.Count) = Application.Transpose(dico.items)
  .Sort .Columns(1)
End With
End Sub
Edit : avec le test And Not dico.Exists(c.Value) c'est la 1ère valeur qui est retenue, autrement c'est la dernière.

A+
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour