Utiliser une variable pour plusieurs Sub d'un même module

Bonjour à tous,

Je bute sur le problème suivant :

Je souhaite utiliser une variable qui puisse s'appliquer dans plusieurs Sub d'un même module afin d'éviter d'écrire cette même variable dans tous les Sub

J'ai essayé la ligne de code suivante :

Dim a As Integer

a = 20

Sub test()

Range("A" & a).Select

Range("A" & a) = 18

Call test2

End Sub

Sub test2()

Range("B" & a).Select

Range("B" & a) = 30

End Sub

Ceci sont deux petit macros d'exemple dans un même module, en gros l'idée est d'activé la macro "test" via un bouton qui va sélectionner la cellule A20 et marquer "18" dedans.

Elle appelle ensuite la macro "test2" pour sélectionner la cellule B20 et marquer 30 dedans.

Mais lorsque je lance la macro "test" via le bouton, le message suivant s'affiche :

"Erreur de compilation

Instruction incorrecte à l'extérieur d'une procédure"

et il me surligne le "20" de ma variable "a"

SI quelqu'un peux m'apporter quelques réponses

Merci par avance.

il faut déclarer

Public a As Integer

Bonjour Steelson,

Je viens d'essayer en remplaçant "Dim" par "Public"

Il semble que cela ne fonctionne pas non plus, il m'affiche toujours le même message d'erreur et me surligne le "20"

l'affectation 20 à a doit se faire dans une sub ou dans workbook_open

ou alors dans une cellule que tu appelles dans tes 2 sub > la meilleure des solutions

Bonjour,

Règle de base de la programmation en VBA : tout le code exécutable doit être inclus dans des procédures...

Donc ton :

a = 20

ligne exécutable doit figurer dans une procédure ! si tu ne veux pas faire hurler VBA !

Une variable niveau module est en effet utilisable par toute les procédures du module. Il convient cependant que ce soit justifié et s'assurer qu'on gère correctement leur initialisation et réinitialisation afin d'éviter de surcharger inutilement la mémoire. Là je ne suis pas sûr que cela soit très justifié.

Pour ton code d'exemple, bannir l'utilisation de Select et qualifier Range en le faisant référer à la feuille qui la contient, et ton code aura meilleure allure et sera plus fiable et plus rapide !

L'utilisation de Call est inutile en VBA, les procédures pouvant s'appeler directement par leur nom, leur seul effet est de te faire taper un mot en plus et t'obliger à placer les arguments entre parenthèses si la procédure en est dotée.

Cordialement.

Bonjour MFerrand,

Et si tu devais réécrire ma macro d'amateur sous quelques chose de "propre" et qui fonctionne cela donnerais ?

un bout de fichier excel serait le bienvenu de ta part !

Steelson,

Je parlais de ma macro d'exemple plus haut ^^

La macro d'origine est très longue et très inbuvable, appelant tous un ensemble de macro dans plusieurs modules. Bref, une vrai fourmilière.

MFerrand en tomberais à la renverse

justement, mets la dans un fichier représentatif mais épuré

sinon on va tourner en rond

tiens, voici ce que cela donne

127test.xlsm (13.20 Ko)

Bonjour, Salut Steelson !

Tu ne vas pas me dire qu'écrire une ligne :

Worksheets("xxx").Range("B" & a) = 30

est hors de ta portée !?

Le ciblage de la cellule ne dépend alors plus de la feuille active au moment de l'exécution, c'est donc nettement plus fiable, et VBA n'a pas à chercher quelle est cette feuille active, c'est donc plus rapide !

Tu dois aussi savoir si tu regardes de près le code de Steelson, que la variable déclarée niveau module l'est avec Public parce qu'elle est initialisée à partir d'un autre module et ne pourrait être atteinte si déclarée avec Dim (limitant l'accessibilité au module).

Enfin, il faut aussi que tu notes que ta méthode d'emboîtement des appels de procédures, telle qu'ébauchée, soit Test est lancée, s'exécute et appelle Test2... laquelle pourrait alors appeler Test3, qui appellerait à son tour Test4...

Une telle méthode est plutôt à éviter car elle accroît inutilement ta pile d'appels : toutes les procédures demeurent en effet en cours d'exécution tant que la dernière ne s'est pas achevée, c'est pourquoi il est préférable d'appeler une série de procédures secondaires à partir d'une même procédure principale afin de limiter l'extension de la pile.

Cordialement.

hello Mferrand

j'ai fini pour lui faire "son" fichier exemple qui était une arlésienne ! pas compliqué quand même (même s'il veut cacher le reste)

Super ça marche,

Merci beaucoup

Rechercher des sujets similaires à "utiliser variable sub meme module"