2017-10-16 24 views
0

J'ai un classeur A (A.xlsm) qui fait référence au classeur B (B.xlsm) via le menu Tools -> References dans l'éditeur VBA. A utilise plusieurs macros dans B. Si je ferme A alors B reste ouvert et toutes les variables conservent leur état actuel. Par conséquent si j'ouvre à nouveau A, quelques macros dans B donneront des erreurs parce qu'elles ont l'état des incantations précédentes qui n'est plus compatible avec A.Comment réinitialiser les variables de classeur référencées

Y a-t-il un moyen de réinitialiser B pour que toutes les variables soient maintenant dans leur état d'origine? Vous pouvez également fermer B une fois que A est fermé?

+1

Vous avez raison, vous n'avez normalement pas besoin de fermer/réinitialiser les variables avec VBA, parce que la portée des variables VBA est normalement plutôt faible: les variables (normalement) vivent et meurent avec la procédure ou la fonction dans laquelle elles sont utilisées/créées: https://www.ozgrid.com/VBA/variable- scope-lifetime.htm Mais si vous créez des variables avec une portée plus large, vous devriez être prêt à les relâcher/réinitialiser avec des lignes de code comme 'Set ws1 = Nothing' ou' strVariable = vbNullString' ou 'lngRowCount = 0' ou' Définissez adoRecordSet.Close' puis 'Set adoRecordSet = Nothing' .... – Ralph

+0

@Ralph Dans mon cas, il s'agit de variables de module – Roland

Répondre

1

Pour réinitialiser les variables, je suggère que vous écriviez un CleanUp-Sub dans le classeur référencé B et l'appelez du A.

Pour fermer le classeur B lorsque A est fermé nécessite une sorte de piratage. Vous ne pouvez pas simplement émettre quelque chose comme close Workbooks("B.xlsx"), il va lancer une erreur (1004 - classeur est actuellement référencé par un autre classeur ...).

Regardez un tour que David Demner suggère ici: https://stackoverflow.com/a/18132384/7599798. L'idée est que dans le classeur référencé, une routine de fermeture est déclenchée mais que le close n'est pas exécuté immédiatement. Vous l'appelez lorsque votre classeur est fermé, mais le Close (de B ne sera exécuté qu'après la fin de la fermeture du classeur appelant (A)