2017-06-20 1 views
1

J'utilise un dictionnaire de script dans VBA pour contenir 1 840 000 paires de clés et de valeurs dans Excel 2010. Je veux les déclarer et les remplir une fois, puis les utiliser dans mes modules et fonctions.Garder le dictionnaire de script en mémoire, VBA

Pour commencer, j'ai déclaré le dictioanry public, en utilisant Public dict As Scripting.Dictionary, puis je l'ai rempli sur worksheet_activate(). Comment puis-je l'enregistrer et l'utiliser dans d'autres mods?

Merci

+0

soit public dans un module Comme l'a dit ash, soit le passer en argument aux sous/fonctions. Le bon truc serait de ne pas perdre les dictionnaires en pause/erreur ... –

+0

@ A.S.H J'ai nommé un sous-registre public "workbook_activate()" et il ne s'est pas exécuté quand le classeur s'est ouvert. cependant, quand j'ai utilisé "worksheet_activate()", c'était génial tant que mes mods étaient encore dans ce fichier sheet/mod. Une fois que je suis parti, il semble que les valeurs du dictionnaire soient effacées. – wizlog

+0

@PatrickLepelletier laissez-vous entendre que normalement le dictionnaire effacerait une erreur? – wizlog

Répondre

3

En tant que bonne pratique de programmation, envelopper une telle variable dans une fonction getter, et cacher la variable globale comme locale statique dans il. Remplissez-le lors de la première utilisation.

Pour ce faire, écrire cette fonction dans un module standard:

Public Function getMyDictionary() as Scripting.Dictionay 
    Static dict as Dictionary ' static: will keep state across different calls 

    If dict Is Nothing Then 
     Set dict = new Scripting.Dictionary 
     '''''''''''''''''''' 
     dict.Add "foo", "bar" 
     ' etc... 
     ' Code to populate dictionary 
     ' 
     '''''''''''''''''''' 
    End If 
    Set getMyDictionary = dict 
End Function 

Maintenant, chaque fois que vous devez référencer le dictionnaire, simplement quelque chose comme ceci:

If getMyDictionary.Exists("foo") Then doStuff 

Cet idiome présente de nombreux avantages:

  • le dictionnaire est renseigné lors de la première utilisation. Si pendant une session Excel il n'est pas nécessaire, il ne sera pas rempli.

  • vous n'avez plus besoin de vous soucier de "quand dois-je remplir mon dictionnaire." Il sera disponible et peuplé quand et où il le faut

  • Si le projet est déchargé en raison d'une erreur d'exécution, toutes les variables globales sont réinitialisées. En particulier, les objets sont réinitialisés à Nothing. La fonction wrapper gère correctement la situation et re-peuple le dictionnaire de manière transparente.

  • TLDR ... le dictionnaire global est masqué, l'accès à celui-ci est (dans une certaine mesure) contrôlé. "Dans une certaine mesure" car un autre code peut encore le manipuler (insérer, enlever ...). Si l'on a besoin de plus de contrôle sur, par exemple permettre à tout autre code de lecture seule, puis en faire un membre privé de certains Module de classe qui n'expose que la fonctionnalité a permis ...

+0

Comment évaluerait-il "foobar", à quoi cela sert-il? Est-ce qu'un getMyDictionary booléen n'est pas/ne devrait pas être suffisant? – wizlog

+0

@wizlog Super, mais n'oubliez pas 'Set dict = new Scripting.Dictionary', je viens de l'ajouter :) –

+0

A.S.H., dès que je lance un sous-localisant dans un autre objet (lire: feuille) je perds l'accès au dictionnaire que je viens de créer et peuplé dans la fonction que vous avez postée ... malgré qu'elle soit statique. – wizlog