Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 Une (autre) Classe utilisant Scripting.Dictionary

p'tit vieux

XLDnaute Occasionnel
Bonjour BONHEUR ET SANTE POUR 2024 à tous,
A l'instar de @patricktoulon j'avais écrit une classe qui "améliore" la classe de base Scripting.Dictionary.
Sur la base de ce que j'avais écrit pour mes besoins spécifiques, je l'ai refaite en retirant toutes les fonctions et autres qui n'étaient que pour mon application.
N.B.: Entre autre, j'ai retiré le traitement automatique des clés de type Range avec par conséquence des accès directes à des propriétés (adresses etc.). Si cela intéresse on peut voir.

A propos de cette classe "clsBaseDico" …
Contrairement à Patrick, je n'ai pas voulu garder les mécanismes de l'original aussi (et donc les inconvénients), par exemple, on ne peut plus "accidentellement" ajouter un élément.
Généralités:
En cas d'erreur toutes les Propriétés, Fonctions etc. renvoient un événement d'erreur (Err.Raise) qui est à traiter (ou pas à votre choix) par le code appelant.
Si ce n'est pas précisé, les propriétés sont en lecture et écriture
La classe clsBaseDico contient les propriétés et fonctions suivantes:
Eléments identiques à Dictionary:
- CompareMode: vbTextCompare (= 1), vbBinaryCompare (= 0) ou DatabaseCompare (= 2). Par défaut -> vbTextCompare​
- Syntaxe: Set clsBaseDico.CompareMode = vbTextCompare
- Count: En lecture seule. Indique le nombre d'enregistrement dans la collection​
- Item: Lit ou écrit l'Item d'une clé (Key)​
- Syntaxe: Set maVar = clsBaseDico.Item(aKey) ou Set maVar = clsBaseDico(aKey)
Set clsBaseDico.Item(aKey) = maVar
- Add: Ajoute un Item. Contrôle si il existe si oui déclenche un évènement erreur (Err.Raise).​
- Syntaxe: clsBaseDico.Add aKey, aItem
aItem: Il peut être de n'importe quel type.
aKey: de type Alphanumérique.
- ChangeKey = Key: Idem que Key MAIS c'est fonction et non pas une propriété​
- Syntaxe: Set maVar = clsBaseDico.ChangeKey(OldKey, NewKey)
maVar reçoit le NOUVEAU KeyS mise à jour - Tableau(n) -​
- ItemS: En lecture seule. Retourne un tableau(n) de tous les Items du Dictionnaire.​
- Syntaxe de lecture: For I= 0 to clsBaseDico.ItemS
OU For Each aItem In clsBaseDico.ItemS
- KeyS: En lecture seule. Retourne un tableau(n) de tous les clés (Key) du Dictionnaire.​
- Syntaxe de lecture: For I= 0 to clsBaseDico.KeyS
OU For Each aKey In clsBaseDico.KeyS
- Remove: Retire un élément définit par sa clé​
- Syntaxe: clsBaseDico.Remove aKey
- RemoveAll: VIDE TOUTE la classe. ATTENTION! L'instance de la classe existe toujours.​
Autres Eléments à Dictionary:
- SubCount: Sous compteur ou autre pour utilisation à votre convenance.​
- Syntaxe: Set maVar = clsBaseDico.SubCount
Set clsBaseDico.SubCount = maVar
- Sort: Retourne le ou les tableaux Keys et ItemS trié.​
- Syntaxe: maVar = clsBaseDico.Sort(aGetWhat). Par défaut KeyS1D -> Tableau(n) des KeyS
Le tableau trié est retourné d'après les demandes suivantes:​
KeyS1D -> KeyS 1D => T(n) (by default)​
ItemS1D -> Valeurs 1D => T(n)​
KeyS2D -> Keys 2D => T(n,1)​
ItemS2D -> Items 2D => T(n,1)​
KeysItemS -> Keys and Items 2D => T(n,1) = Key , T(n,2) = Item​
ItemSKeyS -> Items and Keys 2D => T(n,1) = Item, T(n,2) = Key​
Public Enum GetWhat_enum​
KeyS1D = 1​
ItemS1D = 2​
KeyS2D = 12​
ItemS2D = 22​
KeysItemS = 32​
ItemSKeyS = 42​
End Enum​

- Transpose: Comme son nom l'indique. Remplace le WorksheetFunction.Transpose(aArray)
Convertir un tableau (aArray) 1D en 2D -> T(x,1). Si Xin2nd = True -> T(1,x)​
Convertir un tableau (aArray) 2D en 2D -> T(y, x). Xin2nd = True n'a pas d'effet
Si Xin2nd= True pour T(n) inverse X en Y
- Syntaxe: maVar = clsBaseDico.Transpose(aArray,[Xin2nd]). Exemple: maVar = clsBaseDico.Transpose(clsBaseDico.KeyS, True) -> maVar(1,n KeyS)
Rien d'extraordinaire mais peut servir de base à des besoins spécifiques.
A vous de voir !
A vos remarques.

Merci
 

Pièces jointes

  • clsBaseDicoV1.xlsm
    432.1 KB · Affichages: 19

p'tit vieux

XLDnaute Occasionnel
Voici un résultat de temps de traitement:
Taille = 10 000 éléments
A mon avis ce qui est intéressant ce sont les temps d'écriture et de lecture.
Toujours à mon avis, le temps de tri, perfectible, mais le tri n'est pas une utilisation première.
Le plus important ce sont les lectures/écritures. Non?

GetWhat_enum.KeysItemS
Chrono creation tableau: 0,0273
Chrono créer: Dico.Add: 0,0508
Chrono Lire ItemS: Dico(): 0,0273
Chrono Dico.Sort: 2,2930

Chrono TOTAL: 2,4258

GetWhat_enum.ItemSKeyS
Chrono creation tableau: 0,0313
Chrono créer: Dico.Add: 0,0469
Chrono Lire ItemS: Dico(): 0,0273
Chrono Dico.Sort: 2,2695

Chrono TOTAL: 2,3984

GetWhat_enum.ItemS1D
Chrono creation tableau: 0,0352
Chrono créer: Dico.Add: 0,0508
Chrono Lire ItemS: Dico(): 0,0273
Chrono Dico.Sort: 1,7891

Chrono TOTAL: 1,9023

GetWhat_enum.ItemS2D
Chrono creation tableau: 0,0391
Chrono créer: Dico.Add: 0,0469
Chrono Lire ItemS: Dico(): 0,0273
Chrono Dico.Sort: 1,7305

Chrono TOTAL: 1,8438

GetWhat_enum.KeyS1D
Chrono creation tableau: 0,0352
Chrono créer: Dico.Add: 0,0508
Chrono Lire ItemS: Dico(): 0,0273
Chrono Dico.Sort: 1,9102

Chrono TOTAL: 2,0391

GetWhat_enum.KeyS2D
Chrono creation tableau: 0,0391
Chrono créer: Dico.Add: 0,0508
Chrono Lire ItemS: Dico(): 0,0273
Chrono Dico.Sort: 1,8242

Chrono TOTAL: 1,9531
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…