Re,
Oups! C'est ma très grande faute. J'explique :
On utilise une structure nommé dictionary (spécifique à windows - non disponible sur MAC).
Cette structure associe à une clef (qui peut-être n'importe quelle chaine de caractères) un item qui peut être un peu n'importe quoi (nombre, texte, array, range, un autre dictionnaire, etc.).
Cet objet dictionary n'accepte pas les clefs en doublon
La recherche d'une clef (et par conséquent de l'item associé) parmi l'ensemble des clefs est très très rapide.
Ici la clef est le "type de dépense" (colonne A de la feuille "Categories") est l'item associée à chaque clef est sa catégorie (colonne B de la feuille "Categories").
Mais pour pouvoir utiliser cette structure dictionary, il faut indiquer au "compilateur VBA" dans quelle bibliothèque se trouve cette structure. Pour cela, deux possibilités:
La première consiste à aller dans l'éditeur VBE, à lier la référence au moyen de l'éditeur puis à coder.
Dans ce cas, on déclare une variable comme étant de type dictionary en écrivant
Dim dico as new dictionary.
Un avantage de faire ainsi, c'est que pendant l'écriture du code, l'éditeur VBE propose les propriétés et procédures liées à cet objet.
L'inconvénient est qu'il faut lier la bibliothèque dans VBE avant de coder. Cela s'appelle du "early binding".
Un autre avantage de cette méthode, c'est que les opérations sur la variable dictionary sont plus rapides par rapport à le seconde (souvent cela ne se perçoit guère si peu de données).
Une fois la bibliothèque liée, si le classeur est transféré tel quel sur un autre ordinateur (même sans avoir lié la bibliothèque sur le nouvel ordinateur), le fichier fonctionne.
Mais si on ne copie que
le code du classeur dans un autre, alors il faut absolument faire cette liaison dans le second classeur (une seule fois suffit).
Pour ton erreur, c'est sans doute ce qui est t'est arrivé.
La
deuxième méthode (dite "late binding") pour lier la bibliothèque est la suivante:
- On déclare une variable dico (sans type explicite) : Dim dico
- Et dans le corps de la procédure, on écrit avant d'utiliser la variable dico :
Set dicoCateg = CreateObject("scripting.dictionary")
Cette méthode n° 2 a comme avantages les inconvénients de la première et vice-versa:
- on n'a pas besoin de lier la bibliothèque manuellement dans l'éditeur VBE. On peut donc copier le code dans un autre classeur sans se soucier si cette liaison existe ou non
- Elle n'apporte pas l'auto-complétion pendant l'écriture du code pour la variable dico (il faut connaitre les propriétés et procédure de cet objet)
- elle est un petit moins rapide si on a un très très grand nombre d'éléments dans le dictionary
Dans un moment d'
égarement , j'ai "
doublonné" en déclarant le dictionary dans les déclarations en début de code (dicoCateg As New Dictionary) puis reconstruisant la variable dictionary dans le corps du code (Set dicoCateg = CreateObject("scripting.dictionary")).
Il y en a une inutilement en trop. A moins d'avoir des centaines de milliers de lignes, tu peux utiliser la méthode "late-binding" et donc déclarer simplement en tête de code
Dim dico et conserver dans le code la ligne :
Set dicoCateg = CreateObject("scripting.dictionary")
Si tu veux la première méthode ("ealy-binding"), suivre la démo en pièce jointe pour faire la liaison.
Voilà, voilou...