Déclaration de variable VBA en Public

Fermé
hydracom Messages postés 29 Date d'inscription jeudi 24 avril 2008 Statut Membre Dernière intervention 15 juin 2010 - 27 mars 2009 à 11:15
 Ben - 9 mars 2010 à 11:44
Bonjour,

J'ai un petit soucis qui m'a pris 3 heures de prendre la tête >.<

J'ai une feuille Excel, sur laquelle j'ai un bouton macro de commande "Démarer".

En appuyant sur ce bouton, un userForm est affiché. Sur celui là il y a un menu déroulant (ComboBox) qui contient des noms des machines que je dois choisir ... et un autre bouton "Ajout de machine" qui permet d'ajouter dans la liste une autre machine en tapant son nom dans la case à coté de ce dernier.

Sachant que chaque fois quand j'appuie sur "Démarer", il va charger la liste du menu déroulant (ComboBox) avec les noms standards des machines. C'est à dire que si j'utilise seulement la commande .AddItem, il ne va pas tenir compte des noms ajoutés.

J'ai utilisé alors une matrice de 1 colonne et 20 lignes matrice(0 to 19)

-Avec le bouton "démarer", je charge des noms standards (il y en a 5) dans les 5 premières cases de la matrice.
-Puis j'utilise la commande .AddItem Matrice(i) si Matrice(i) <> "" pour le ComboBox dans UserForm
-Puis j'appelle une variable NouvelleMachine et vérifier si elle est vide, si NON VIDE je vais rajouter dans ma matrice, à la première case vide que je trouve, cette valeur.

-En fin, je fais afficher UserForm

+ Avec le bouton "Ajouter" sur UserForm, je donne à ma variable "NouvelleMachine" le nom qui est tapé par Utilisateur.
+ Je fais exécuter les autres opérations et je ferme UserForm.

Problème : La NouvelleMachine est une variable qui doit être connue à la fois par la Macro dans la Feuille Excel et à la fois par le macro dans l'UserForm. Je l'ai déclaré entant que Public au début de mon UserForm mais ça marche pas, non plus si je déclare en tant que public au début des codes de la Feuille Excel.

Et bien sur, quand je fais afficher NouvelleMachine, dans UserForm elle tient compte bien des noms entrés, mais elle est "" - Nothing dans la Feuille Excel.

Comment dois je faire ?

J'espère que vous pouvez comprendre le problème :-S car cé pas évident pour un étranger d'expliquer tout détaillé en français les algorithmes ...

Je vous remercie de votre attention :-)

9 réponses

leplot Messages postés 191 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 13 août 2015 131
27 mars 2009 à 11:42
Bonjour,

je ne suis pas un spécialiste et j'ai eu le même problème.
Je l'ai contourné en créant une zone dans le Userform . Cette zone n'est pas visible. Elle me sert à stocké la valeur de la variable provenant de la macro. Dans le Userform, j'utilise la zone.

Voici le code que j'ai au niveau du bouton de lancement d'un userform "SaisieDonnées" avec une variable pour savoir s'il s'agit d'une nouvelle ligne.
Load SaisieDonnées
SaisieDonnées.NouvelleLigne = True
SaisieDonnées.Show
==> chargement du userform, entrée de la valeur dans la zone "NouvelleLigne" et affichage du userform

Une autre solution est de stocké le résultat de la variable dans une cellule d'une feuille et d'avoir une zone du userform qui pointe sur cette cellule. Mais le principe est le même.

Par contre, si quelqu'un connaît une solution plus propre, je suis preneur.
1
Bonjour à tous,

Après m'être également pris la tête, j'ai réussi à trouver la solution. Dans mon cas, j'ai besoin d'une variable mode (type String) qui va conditionner la suite du traitement par la macro. Je l'avais déclarée en public mais dans "ThisWorkbook", et cela ne fonctionnait pas (mes tests tournaient dans le vide et rien ne se passait).

La solution : déclarer les variables en public directement dans les modules !

Le plus propre seon moi : créer un module "Variables" qui contiendra toutes les variables suceptibles d'être utilisés par plusieurs procédures dans des modules/feuilles différentes.

J'espère vous avoir éclairés.

Cdt,

Supergaga
0
Bonjour,

Après avoir créé un module "Variables" qui contenant toutes les variables suceptibles d'être utilisés par plusieurs procédures, on y fait appel comment ?

Merci ;)
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 405
4 mars 2010 à 09:19
dans ton module quelque soit le nom
tu tape en dehors d'une méthode (fonction ou procédure)
public dim strvar as string
ensuite tu peu faire appel a la variable strvar n'importe ou (a part directement dans les cellule du classeur puisque ca n'utilise pas de vba)
0
" Public Dim sProfile_ID As String " ça me met ça en rouge ???

Est ce quand je crée mon module il n'y a qu'une ligne à mettre ? Juste ça ? Je suis débutant dsl :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 405
4 mars 2010 à 09:44
ah oui autant pour moi, il ne faut pas mettre de dim, juste public strvar as string
0
Oui, c'est ce que je pensais ;)

Est ce que l'on déclare toute les variables à la suite de la même manière sans rien ajouter d'autre ???
Seulement des déclarations de variable dans le module ? Pas de End qqch ?
0
garion28 Messages postés 1543 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 3 avril 2011 405
4 mars 2010 à 10:13
si tu met un end quelque chose ca veut dire que tu es dans une méthode (fonction ou procédure) ce qui veut dire que ton public var as string n'as rien a faire là ^^

les variables globales se déclare a part du programme
0
OK ;) ! Merci beaucoup Garion je reviendrais vers toi en cas de souçi !!! Merci encore
0
Bonjour Garion ! Comme promis je reviens à toi :-)

Merci encore pour ton aide de la semaine dernière.. Voiçi une nouvelle question (tin tin tin):

Dans mon appli Access VB, la première chose que je récupère est le nom du user connécté, puis son profile avec un DLookup via le code suivant:

oProfileID = DLookup("[PROFILE_ID]", "tbl_Users", "[USER_NAME]= '" & Environ("USERNAME") & "'")
oFormID = DLookup("[Form_ID]", "tbl_Forms", "[Form_Name]= '" & Me.Name & "'")


Cependant, comme cette action doit impérativement être éxecuter à chaque ouverture de form de la base de données, j'aimerais faire en sorte de n'éxecuter ceci qu'une seule fois sur le premier form ouvert par le user et non à chaque ouverture d'un nouveau form. En quelque sorte garder cette info (ProfileID) en mémoire...

Ma question: COMMENT FAIRE ???

Merci par avance !!!
-1