[VBA] Exporter une variable d'un userform
Fermé
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
-
8 avril 2008 à 10:20
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 - 14 avril 2008 à 10:30
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 - 14 avril 2008 à 10:30
A voir également:
- [VBA] Exporter une variable d'un userform
- Chrome exporter favoris - Guide
- Exporter favoris firefox - Guide
- Exporter conversation sms android - Guide
- Exporter photos google photos - Guide
14 réponses
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
8 avril 2008 à 11:56
8 avril 2008 à 11:56
up ! :^)
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
8 avril 2008 à 14:28
8 avril 2008 à 14:28
Bonjour,
Si c'est possible, il faut simplement déclarer ta variable comme variable globale en public. C'est à dire qu'il faut la déclarer en premier dans un module avant toutes procédures ou fonctions. Ensuite, il suffit pour la lire de faire (si la variable est dans le module1) : myVariable = Module1.maVariable ... ce n'est pas très propre mais ça marche
Pour faire quelque chose de plus propre, il faut déclarer la variable en private et faire des accesseurs en lecture et écriture :
;o)
polux
Si c'est possible, il faut simplement déclarer ta variable comme variable globale en public. C'est à dire qu'il faut la déclarer en premier dans un module avant toutes procédures ou fonctions. Ensuite, il suffit pour la lire de faire (si la variable est dans le module1) : myVariable = Module1.maVariable ... ce n'est pas très propre mais ça marche
Pour faire quelque chose de plus propre, il faut déclarer la variable en private et faire des accesseurs en lecture et écriture :
Private maVariable As String Public Sub setMaVariable(ByVal str as String) 'En écriture maVariable = str End Sub Public Function getMaVariable() As String 'En lecture getMaVariable = maVariable End Function
;o)
polux
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
8 avril 2008 à 14:41
8 avril 2008 à 14:41
Le problème est que les deux fonctions sont dans 2 feuilles VBA totalement différentes : l'une dans les feuilles portant le nom de userform1 et l'autre dans les objets microsoft Word portant le nom de Doc.
Donc quand je déclare ma variable en publique, il me dit qu'elle est non facultative (???).
En ce qui concerne myVariable = Module1.maVariable, ce n'est pas possible car après le traitement de ma userform celle ci se ferme, perdant à l'occasion la valeur de mon radio button. Ce que je veux est simplement de récupérer la valeur de 3 radio buttons de mon userform sur mon script principal :D
Donc quand je déclare ma variable en publique, il me dit qu'elle est non facultative (???).
En ce qui concerne myVariable = Module1.maVariable, ce n'est pas possible car après le traitement de ma userform celle ci se ferme, perdant à l'occasion la valeur de mon radio button. Ce que je veux est simplement de récupérer la valeur de 3 radio buttons de mon userform sur mon script principal :D
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
8 avril 2008 à 14:48
8 avril 2008 à 14:48
tu peux soit créer un module indépendant de ta userform avec ta variable globale ou alors sauvegarder la donnée sur une feuille cachée de ton classeur Excel ... mais la façon propre est le module indépendant qui traite les données ...
;o)
polux
;o)
polux
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
8 avril 2008 à 15:03
8 avril 2008 à 15:03
je t'ai mis un petit exemple sur ce lien https://www.cjoint.com/?eipdeDIX2K ... pour te montrer comment utiliser une variable dans un module indépendant.
;o)
polux
;o)
polux
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
9 avril 2008 à 10:23
9 avril 2008 à 10:23
Je suis désolé, mais je n'y suis pas parvenu...:S
Je met en général dans mon objet "Doc" :
Et dans mon userform je met :
Mais j'ai une erreur me disant :
en surlignant le private sous_res as string...
Je peux malheureusement pas t'envoyer le fichier, vu qu'il s'y trouve des données personnelles faisant partie intégrante du fichier, j'espère que tu as malgré ça pu voir le problème ... parce que moi, je sèche :S
merci :)
Je met en général dans mon objet "Doc" :
Private sous_res As String Public Sub sous_res(ByVal str As String) sous_res = str End Sub Public Function getsous_res() As String getsous_res = sous_res End Function
Et dans mon userform je met :
Private Sub sr251_click() Call Doc.sous_res("251") End Sub Private Sub sr252_click() Call Doc.sous_res("252") End Sub Private Sub sr253_click() Call Doc.sous_res("253") End Sub
Mais j'ai une erreur me disant :
nom ambigü detecté : sous_res
en surlignant le private sous_res as string...
Je peux malheureusement pas t'envoyer le fichier, vu qu'il s'y trouve des données personnelles faisant partie intégrante du fichier, j'espère que tu as malgré ça pu voir le problème ... parce que moi, je sèche :S
merci :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
9 avril 2008 à 10:44
9 avril 2008 à 10:44
bonjour,
Le nom de ta variable et de ta procédure d'écriture portent le même nom ... d'où le conflit .... le programme ne sais pas si tu fais référence à la variable ou à la procédure ... nomme ta procédure d'écriture setSous_Res, ça devrait aller mieux ensuite ...
;o)
polux
Le nom de ta variable et de ta procédure d'écriture portent le même nom ... d'où le conflit .... le programme ne sais pas si tu fais référence à la variable ou à la procédure ... nomme ta procédure d'écriture setSous_Res, ça devrait aller mieux ensuite ...
;o)
polux
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
9 avril 2008 à 14:32
9 avril 2008 à 14:32
aieaieaie...je n'y arrive toujours pas, je ne comprends pas la logique de ces variables etendues ...
Dans le début du script global :
Dans le Userform1 :
Je desespère ...
Au fait, je ne peux pas mettre de "Option Explicit" car dans mon script principal j'ai une tonne de variables non déclarées, un peu du style de conf1 à conf 26...ça vient de là tu penses ?
Dans le début du script global :
Private sous_res As String Public Sub setsous_res(ByVal str As String) sous_res = str End Sub Public Function getsous_res() As String getsous_res = sous_res End Function
Dans le Userform1 :
Private Const SC_CLOSE = &HF060& Private Const MF_BYCOMMAND = &H0& Private Declare Function GetSystemMenu Lib "user32" _ (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Private Declare Function FindWindowA Lib "user32" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Sub UserForm_Initialize() Dim hSysMenu As Long Dim MeHwnd As Long MeHwnd = FindWindowA(vbNullString, Me.Caption) If MeHwnd > 0 Then hSysMenu = GetSystemMenu(MeHwnd, False) RemoveMenu hSysMenu, SC_CLOSE, MF_BYCOMMAND Else MsgBox "Handle de " & Me.Caption & " Introuvable", vbCritical End If End Sub Private Sub sr251_click() Call Doc.setsous_res("251") Unload Me End Sub Private Sub sr252_click() Call Doc.setsous_res("252") Unload Me End Sub Private Sub sr253_click() Call Doc.setsous_res("253") Unload Me End Sub
Je desespère ...
Au fait, je ne peux pas mettre de "Option Explicit" car dans mon script principal j'ai une tonne de variables non déclarées, un peu du style de conf1 à conf 26...ça vient de là tu penses ?
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
9 avril 2008 à 14:43
9 avril 2008 à 14:43
Oulala .... il faut déclarer Option Explicit dans tous les modules .... je ne sais pas si ça peut venir de là, mais le fait de déclarer les variables permet de mieux les gérer. Ce n'est pas indispensable pour des petits programmes, tel qu'une macro en Excel, mais dès que l'on veut manipuler des variables il est necessaire de toutes les déclarer. Je ne commence jamais un module sans Option Explicit. Tu as vu mon exemple, ça fonctionne. Il n'y a aucune raison que ça ne marche pas chez toi ...
polux
polux
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
9 avril 2008 à 15:13
9 avril 2008 à 15:13
Alors dans ce cas tu pourrais m'aider à trouver un moyen de déclarer mes variables incrémentées ? Je l'avais vu quelque part mais je m'en rappelle plus...c'était quelque chose du style :
dim conf%(1 to 429) as string
Sinon je vais jamais m'en sortir :S
dim conf%(1 to 429) as string
Sinon je vais jamais m'en sortir :S
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
9 avril 2008 à 15:48
9 avril 2008 à 15:48
tu veux sans doute dire un tableau de données variables, ici avec 429 éléments de type String.
Il faut le déclarer comme ça :
Ca fait plus de code à taper mais au moins on peut maîtriser les variables et les manipuler plus facilement.
;o)
Polux
Il faut le déclarer comme ça :
Private conf(429) As Stringet faire les 2 accesseurs en écriture et lecture comme ça :
Public Sub setConf(ByVal i As Integer, ByVal str As String) conf(i) = str End Sub Public Function getConf(ByVal i As Integer) As String getConf = conf(i) End Function
Ca fait plus de code à taper mais au moins on peut maîtriser les variables et les manipuler plus facilement.
;o)
Polux
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
9 avril 2008 à 16:22
9 avril 2008 à 16:22
Je suis maudit par le programme...
Il ne prends pas les variables globales ...il me dit "variables non définies" sur conf0, et dès que je le passe en commentaire, il me fait pareil pour conf1, pareil pour conf2, conf3 etc...
Apparemment c'est un problème de variables globale non reconnue en temps que tel...je te copie colle l'en-tête, peut etre sais-tu d'où ça vient ...
Il ne prends pas les variables globales ...il me dit "variables non définies" sur conf0, et dès que je le passe en commentaire, il me fait pareil pour conf1, pareil pour conf2, conf3 etc...
Apparemment c'est un problème de variables globale non reconnue en temps que tel...je te copie colle l'en-tête, peut etre sais-tu d'où ça vient ...
Option Explicit Private sous_res As String Private conf(420) As String Public Sub setsous_res(ByVal str As String) sous_res = str End Sub Public Sub setConf(ByVal i As Integer, ByVal str As String) conf(i) = str End Sub Public Function getsous_res() As String getsous_res = sous_res End Function Public Function getConf(ByVal i As Integer) As String getConf = conf(i) End Function
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
9 avril 2008 à 17:30
9 avril 2008 à 17:30
tu es en VBA sous Excel ? ... Où se trouve ton code ? dans un module que tu as créé ? ou derrière un UserForm ? parce que là je ne vois pas où il peut y avoir problème ... il faudrait que je puisse voir la configuration complète du fichier
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
10 avril 2008 à 11:37
10 avril 2008 à 11:37
Bon je te l'envoie, par contre j'ai supprimé tout les conf1, conf2, conf3 etc...car il y a des informations sensibles dedans :)
https://www.cjoint.com/?eklLKOYCmK
J'ai pas enlevé le option explicit pour que tu vois les erreurs :)
https://www.cjoint.com/?eklLKOYCmK
J'ai pas enlevé le option explicit pour que tu vois les erreurs :)
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
10 avril 2008 à 12:42
10 avril 2008 à 12:42
Bonjour,
D'un premier coup d'oeil et sans entrer dans les détails, je pense qu'il ne faut pas coller le code derrière le Doc ... je ne pense pas que ça accepte Option Explicit. Il serait préférable de faire un module pour gérer les actions sur les différents contrôles posés sur la feuille word. Il suffit ensuite de faire appel aux procédures dans le module. De plus, pour chaque bouton ratio, les mêmes variables ou presque sont utilisées. Il suffit de les mettre en variables globales dans le module séparé et de faire une procédure d'initialisation pour chaque appel de procédures. J'ai vu aussi que tu utilisais le Goto ... il vaut mieux éviter au tant que possible, pas très clean et sujet à des beugs très souvent. Mais là n'est pas le problème. Je vais te refaire un module en ne faisant qu'un copier/coller de ce que tu as déjà fait. On verra si ça règle le problème.
Je n'ai pas pu tester, j'ai un message qui apparaît m'informant qu'il manque quelque chose pour que ça fonctionne. Ce n'est pas vraiment un problème pour ce que je veux faire. Dès que j'ai fini, je t'envoie le fichier. Tu n'auras plus qu'à adapter le reste et le tester.
;o)
polux
D'un premier coup d'oeil et sans entrer dans les détails, je pense qu'il ne faut pas coller le code derrière le Doc ... je ne pense pas que ça accepte Option Explicit. Il serait préférable de faire un module pour gérer les actions sur les différents contrôles posés sur la feuille word. Il suffit ensuite de faire appel aux procédures dans le module. De plus, pour chaque bouton ratio, les mêmes variables ou presque sont utilisées. Il suffit de les mettre en variables globales dans le module séparé et de faire une procédure d'initialisation pour chaque appel de procédures. J'ai vu aussi que tu utilisais le Goto ... il vaut mieux éviter au tant que possible, pas très clean et sujet à des beugs très souvent. Mais là n'est pas le problème. Je vais te refaire un module en ne faisant qu'un copier/coller de ce que tu as déjà fait. On verra si ça règle le problème.
Je n'ai pas pu tester, j'ai un message qui apparaît m'informant qu'il manque quelque chose pour que ça fonctionne. Ce n'est pas vraiment un problème pour ce que je veux faire. Dès que j'ai fini, je t'envoie le fichier. Tu n'auras plus qu'à adapter le reste et le tester.
;o)
polux
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
10 avril 2008 à 13:38
10 avril 2008 à 13:38
voilà le lien : https://www.cjoint.com/?eknMwz5VfG
J'espère que ça passera comme ça.
Tiens moi au courant ...
bon courage
;o)
Polux
J'espère que ça passera comme ça.
Tiens moi au courant ...
bon courage
;o)
Polux
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
10 avril 2008 à 14:49
10 avril 2008 à 14:49
re,
Bon, j'ai copié collé tes débuts de scripts pour chacun des private sub, que j'ai passé en public, c/c tous les scripts au début, passé le script principal de Doc vers modul1, que j'ai renommé ModDoc, et je commence à avoir un message d'erreur au niveau de conf1 avec "variable non définie"...
J'ai essayé sur ton fichier et cela ne marche pas non plus, donc il y aurait un problème au niveau de :
Je te rappelle que pour mes conf j'utilise un truc un peu comme ça
J'espère que tu aura trouvé la "faille" :P
Encore merci pour ton soutien !
Bon, j'ai copié collé tes débuts de scripts pour chacun des private sub, que j'ai passé en public, c/c tous les scripts au début, passé le script principal de Doc vers modul1, que j'ai renommé ModDoc, et je commence à avoir un message d'erreur au niveau de conf1 avec "variable non définie"...
J'ai essayé sur ton fichier et cela ne marche pas non plus, donc il y aurait un problème au niveau de :
Public Sub setConf(ByVal i As Integer, ByVal str As String) conf(i) = str End Sub Public Function getConf(ByVal i As Integer) As String getConf = conf(i) End Function
Je te rappelle que pour mes conf j'utilise un truc un peu comme ça
conf1 = "blabla" conf2 = "blibli ... conf400 = "bloblo" conf = conf1 & conf2 & conf3 & conf4 ... & conf400
J'espère que tu aura trouvé la "faille" :P
Encore merci pour ton soutien !
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
10 avril 2008 à 15:37
10 avril 2008 à 15:37
ok, mais à vrai dire je ne sais pas ce que représente : conf ... donc difficile d'anticipé.
Dans le fichier que tu m'as passé il n'y avait que 40 conf déclaré dans un tableau. Pour faire ce que tu veux, il faudrait faire :
Déclarer en variable globale dans le ModDoc :
Dans l'initVariable, il faut ajouter
Il faut mettre ça à l'endroit où ça va bien :
C'est la seule solution que je vois.
polux
Dans le fichier que tu m'as passé il n'y avait que 40 conf déclaré dans un tableau. Pour faire ce que tu veux, il faudrait faire :
Déclarer en variable globale dans le ModDoc :
Private nbConf As Integer
Dans l'initVariable, il faut ajouter
nbConf = 1
Il faut mettre ça à l'endroit où ça va bien :
Call setConf(nbConf, "blabla") nbConf = nbConf + 1pour écrire dans le tableau et ensuite pour les lire, faire une boucle:
For i = nbConf to 400 conf = conf & conf(i) Next i
C'est la seule solution que je vois.
polux
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
11 avril 2008 à 09:30
11 avril 2008 à 09:30
Bonjour,
Désolé pour le manque de détail, je vais te dire ce que sont ces fameux conf :
En fait, le fichier de configuration génère dans les boites de dialogue des fichiers de configuration de routeurs de plusieurs milliers de lignes, qui sont ensuite collés dans celui-çi.
Mon code originel se compose en quelque sorte de :
conf1 = "je fais un truc sur le routeur" _
& chr(13) & chr(10) & "je fais un autre truc" _
& chr(13) & chr(10) & "et encore un autre truc..." _
...
jusqu'à la ligne 26 (on est limité en VBA a 26 lignes finies par "_", j'ai fais ça par soucis de lisibilité)
après on met dans une autre variable :
conf2 = "je fais toujours un truc sur le routeur" _
& chr(13) & chr(10) & "je fais un autre truc" _
& chr(13) & chr(10) & "et encore un autre truc..." _
et à la fin je colle le tout :
conf = conf1 & conf2 & conf3 & conf4 etc...
Donc en fait, la seule chose qu'il me faut, est une déclaration de variables, pour N nom de variable portant le nom de conf1 à confN
Si tu veux comprendre le système de conf, utilises le bouton en bas de mon fichier, et ajoutes un fichier texte de quelques centaines de lignes, pour que tu comprennes comment marche le code généré par le bouton =)
Merci !
Désolé pour le manque de détail, je vais te dire ce que sont ces fameux conf :
En fait, le fichier de configuration génère dans les boites de dialogue des fichiers de configuration de routeurs de plusieurs milliers de lignes, qui sont ensuite collés dans celui-çi.
Mon code originel se compose en quelque sorte de :
conf1 = "je fais un truc sur le routeur" _
& chr(13) & chr(10) & "je fais un autre truc" _
& chr(13) & chr(10) & "et encore un autre truc..." _
...
jusqu'à la ligne 26 (on est limité en VBA a 26 lignes finies par "_", j'ai fais ça par soucis de lisibilité)
après on met dans une autre variable :
conf2 = "je fais toujours un truc sur le routeur" _
& chr(13) & chr(10) & "je fais un autre truc" _
& chr(13) & chr(10) & "et encore un autre truc..." _
et à la fin je colle le tout :
conf = conf1 & conf2 & conf3 & conf4 etc...
Donc en fait, la seule chose qu'il me faut, est une déclaration de variables, pour N nom de variable portant le nom de conf1 à confN
Si tu veux comprendre le système de conf, utilises le bouton en bas de mon fichier, et ajoutes un fichier texte de quelques centaines de lignes, pour que tu comprennes comment marche le code généré par le bouton =)
Merci !
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
120
>
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
14 avril 2008 à 10:30
14 avril 2008 à 10:30
un petit up ! (si quelqu'un est là ? :P)
8 avril 2008 à 14:02