[VBA] Exporter une variable d'un userform

lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   -  
lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   -
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. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
     
    up ! :^)
    2
    1. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
       
      Mhhh, ce n'est peut etre tout simplement pas possible ? :S
      0
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
    1. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
       
      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
  3. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
    1. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  7. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
     
    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
  8. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
    1. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
       
      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
  9. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
    1. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
       
      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
  10. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  11. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
     
    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
  12. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  13. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
     
    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
  14. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
    1. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
       
      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
      1. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123 > lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention  
         
        un petit up ! (si quelqu'un est là ? :P)
        0