[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
Bonjour,

J'ai crée un userform qui permet de faire un choix entre 3 checkbox. Selon la checkbox cochée, j'insère une valeur dans une variable.

J'aimerai savoir comment réutiliser cette variable dans mon script principal.

Merci beaucoup, et bonne journée :)

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
up ! :^)
2
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:02
Mhhh, ce n'est peut etre tout simplement pas possible ? :S
0
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
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 :
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
1
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
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
0
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
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
0
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
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
0
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
Je suis désolé, mais je n'y suis pas parvenu...:S

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 :)
0

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
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
0
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
aieaieaie...je n'y arrive toujours pas, je ne comprends pas la logique de ces variables etendues ...

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 ?
0
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
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
0
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
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
0
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
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 :
Private conf(429) As String
et 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
0
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
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 ...

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
0
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
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
0
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
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 :)
0
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
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
0
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
voilà le lien : https://www.cjoint.com/?eknMwz5VfG

J'espère que ça passera comme ça.

Tiens moi au courant ...

bon courage

;o)
Polux
0
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
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 :

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 !
0
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
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 :
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 + 1
pour é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
0
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
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 !
0
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
un petit up ! (si quelqu'un est là ? :P)
0