[VBA] Exporter une variable d'un userform

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

  1. Contributeur
    up ! :^)
    1. Contributeur
      Mhhh, ce n'est peut etre tout simplement pas possible ? :S
  2. 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. Contributeur
      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
  3. 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
    1. 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
      1. Contributeur
        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 :)
    2. 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
      1. Contributeur
        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 ?
        1. 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
          1. Contributeur
            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
        2. 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
          1. Contributeur
            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
            
        3. 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
          1. Contributeur
            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 :)
            1. 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
              1. Contributeur
                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 !
                1. 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
                  1. Contributeur
                    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 !
                  2. Contributeur
                    @lml-mikeun petit up ! (si quelqu'un est là ? :P)