Public Static variable en vba excel
Est-il possible d'avoir une statique de la variable déclarée dans une procédure, et l'utilisation de cette variable dans les différentes procédures à l'aide de VBA Excel?
c'est à dire
Public myvar as integer
Sub SetVar()
static myvar as integer
myvar=999
end sub
sub Usevar()
dim newvar as integer
newvar=myvar*0.5
end sub
J'ai besoin de myvar à être vu par d'autres procédures, et de ne pas changer ou de se "perdre". Le code ci-dessus fonctionne si myvar n'est pas déclaré comme une variable statique, mais plus de code alors la variable est "perdu". Si la statique de la déclaration est utilisé, myvar est pas vu par le usevar procédure. Et "Public Static myvar comme integer" n'est pas acceptée par VBA.
Merci pour votre aide
Zeus
Une variable Globale est toujours Statique, en ce qu'elle conserve sa valeur, à moins que le code de l'exécution est interrompue. Si c'est pourquoi vous voulez une variable Statique, puis d'utiliser un Mondial.
Tim, merci pour l'édition de mon post et de votre réponse. Tout ce que je veux faire est d'initialiser plusieurs collections dans plusieurs procédures dans un module, puis l'utilisation de ces collections dans plusieurs procédures dans un autre module. Déclarant que le Public a aidé, mais j'ai maintenant l'erreur d'Exécution 91 variable objet ou variable bloc with non définie, et je ne sais pas pourquoi. Le code semble fonctionner ok jusqu'à ce que le code de l'exécution est interrompue ou le code a changé. Est-il de toute façon à la rendre plus robuste comme l'utilisation d'une instruction set?
J'ai eu de contourner le problème par l'initialisation des collections dans la procédure qui l'utilise à chaque fois qu'il a couru, mais cela semble être une mauvaise solution.
Si vous n'aimez pas votre solution, alors pourquoi ne pas poster une mise à jour et demander des suggestions?
Tim, merci pour l'édition de mon post et de votre réponse. Tout ce que je veux faire est d'initialiser plusieurs collections dans plusieurs procédures dans un module, puis l'utilisation de ces collections dans plusieurs procédures dans un autre module. Déclarant que le Public a aidé, mais j'ai maintenant l'erreur d'Exécution 91 variable objet ou variable bloc with non définie, et je ne sais pas pourquoi. Le code semble fonctionner ok jusqu'à ce que le code de l'exécution est interrompue ou le code a changé. Est-il de toute façon à la rendre plus robuste comme l'utilisation d'une instruction set?
J'ai eu de contourner le problème par l'initialisation des collections dans la procédure qui l'utilise à chaque fois qu'il a couru, mais cela semble être une mauvaise solution.
Si vous n'aimez pas votre solution, alors pourquoi ne pas poster une mise à jour et demander des suggestions?
Public Const myvar as integer = 999
OriginalL'auteur Zeus | 2014-02-16
Vous devez vous connecter pour publier un commentaire.
Essayer cela en appelant PRINCIPAL :
Si vous déclarez un élément Statique , sa valeur sera conservée à l'intérieur de la procédure ou de sous. Si vous déclarez l'élément Public , sa valeur sera préservée et il sera visible par les autres procédures.
l'exécution de setvar à nouveau obtient usevar de travailler à nouveau.
en changeant le code, je veux dire la modification de l'emplacement de la procédure, il suffit de le déplacer au-dessus d'une déclaration
Est-il un moyen plus efficace de l'initialisation de collections que l'initialisation dans chaque procédure?
Dim ing myvar tout en haut d'un module doit rendre accessible à tous les sous-marins et les fonctions de ce module. Faisant Public doit le rendre disponible à d'autres modules........Je ne suis pas sûr si le code d'événement peut "voir".
OriginalL'auteur Gary's Student
Bien que cette question a été répondu il y a quatre ans par @Gary Étudiant, il y a une subtile nuance vaut la peine de mentionner, car la solution peut dépendre du type de données de
myvar
.Tout d'abord, comme vous l'avez noté dans la question,
Public Static myvar as Integer
ne fonctionne pas, parce queStatic
est permis qu'à l'intérieur d'une sub ou une fonction.Comme indiqué dans les commentaires de l'OP par @Patrick Lepelletier, vous pouvez facilement contourner ce problème en déclarant un
Constant
à la place (en supposant que vous n'avez pas besoin de changer dynamiquement):Public Const myvar as Integer = 999
. (Ou peut-êtrePrivate Const myvar...
)Une autre option est de déclarer
myvar
comme un fonction au lieu d'une variable ou une constante, a pour effet de transformer en un pseudo-constante:Dans cet exemple simple où
myvar
est un entier, la pseudo-constante approche est évidemment inutile et ajoute la surcharge d'un appel de fonction. Le simple fait de déclarer unConstant
fait le travail. Cependant, à l'aide d'une constante ne fonctionne que si la valeur est statique et pas un objet. Il ne fonctionnera pas simyvar
est un objet, par exemple unRange
. Dans ce cas, à l'aide de pseudo-constantes peut être utile:Un autre avantage est que vous pouvez utiliser le code à l'intérieur de la fonction afin de vérifier si certaines conditions et affecter des valeurs différentes à
myvar
en conséquence.La pseudo-constante approche peut également être combiné avec d'appellation de la feuille de calcul varie: Si la cellule A1 est une plage nommée, dire
MyRange
, alors vous pourriez écrire:Maintenant, il est possible de déplacer le contenu de la cellule A1 sans casser le code, depuis la plage nommée suit si vous coupez et collez la cellule. Je trouve cette approche utile dans la phase de conception, lorsque les choses ont tendance à se déplacer autour d'un lot dans une feuille de calcul.
Pseudo-constantes également aider à éviter certains problèmes habituellement associés avec global (ou au niveau du module) les variables qui peuvent être un problème dans les grands projets.
OriginalL'auteur Egalth
La clé est d'utiliser 2 variables. Dans le code ci-dessous, myvar est public mais n'est pas statique. stvar est statique mais pas du public. Son champ d'application est seulement dans Main(). En attribuant myvar=stvar et stvar=mavar, elle crée une variable qui est à la fois publique et statique. La valeur est conservée.
OriginalL'auteur On Chang