IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Nom d un userform dans une variable [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut Nom d un userform dans une variable
    Bonjour,

    J'ai dans 2 userform un multipage dont les textbox, lisbox, label,.... ont le même nom pour simplifier mon programme.
    J'ai créé une sub qui permet de remplir ces éléments.
    Cette sub a pour paramétres nom et prenom car il faut chercher la bonne ligne dans une feuille nommé "listagent"
    Le dernier paramètre est le nom de la sub à modifier

    ma sub à ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Sub cyclemodif(nom As String, pre As String, feuille As String)
     
    Dim FEUIL As UserForm
    Set FEUIL = feuille
    For z = 5 To 102
     
        If nom = Sheets("listagent").Range("b" & z).Value And pre = Sheets("listagent").Range("c" & z).Value Then
     
            x = 5
     
            For y = 1 To 4 'boucle pour passer les 4 semaines
     
                v = 1
                FEUIL.Controls("nomagsem" & y).Caption = nom & " " & pre    'remplir le nom des agents
     
                For w = 1 To 7 'boucle pour passer tous les jours d'1 semaine
     
                    FEUIL.Controls("s" & y & "_j" & w & "_hdeb").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
                    v = v + 1
                    FEUIL.Controls("s" & y & "_j" & w & "_hfin").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
                    v = v + 1
                    FEUIL.Controls("s" & y & "_j" & w & "_pdeb").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
                    v = v + 1
                    FEUIL.Controls("s" & y & "_j" & w & "_pfin").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
                    v = v + 1
     
                Next w
     
                'remplir la page cycle
                FEUIL.nomagsem5.Caption = nom & " " & pre
                num = Sheets("listagent").Range("d" & z).Value
                FEUIL.cyc_nbrcyc.Value = num
                For w = 1 To 8 'masque les cellules semaine non utilisé
                    If FEUIL.cyc_nbrcyc.Value < w Then
                        FEUIL.Controls("cyc_s" & w).Visible = False
                        FEUIL.Controls("cyclab_s" & w).Visible = False
                    End If
                Next w
                For w = 1 To num
                    FEUIL.cyc_s1.Value = Sheets("listagent").Cells(z, w + 117).Value
                Next w
     
                x = x + 28 'saute d'1 semaine sur la feuille
     
            Next y
            Exit For
        End If
    Next z
     
    End Sub
    J'ai essayé plusieurs solutions comme définir feuille en userform, ou objet, ou worksheet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub cyclemodif(nom As String, pre As String, feuil As userform)
    J'ai utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VBA.UserForms.Add(sVariable).
    sans succés.
    J'ai des messages d'erreurs ou les cellules ne se remplissent pas !!!!!
    Il me semble l'avoir déjà fait mais je ne retrouve rien dans mes projets précédents.

    merci pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 216
    Par défaut
    Bonjour,

    Tu dois travailler avec des types de variables ou d'objets identiques et penser à nommer tes variables plus clairement:
    Dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub cyclemodif(nom As String, pre As String, feuille As String)
    Dim FEUIL As UserForm
    Set FEUIL = feuille
    Tu affectes à un objet Userform un string...Tu dois utiliser le nom de ta Userform (ci-dessous myUserForm).
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub cyclemodif(nom As String, pre As String, UF_Feuille As myUserForm)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub cyclemodif(nom As String, pre As String)
    Dim UF_Feuille As myUserForm
    set UF_Feuille = new myUserForm
    Pour atteindre les controles de ta Userform, il faut effectivement utiliser controles (la collection des controles de ta Userform) mais pas comme tu le fais.

    Regarde l'aide sous l'editeur de macro / sur ce forum. Tu vas trouver plein d'exemple !

    Cordialement.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut pas compris et ne fonctionne pas
    Bonsoir,

    Désolé pour la réponse tardive mais je suis un peu pris ces derniers temps.

    J'ai un soucis de compréhension sur ta proposition et en particulier sur Les 2 propositions me donnent un message d'erreur "type defini par l'utilisateur non defini"

    Pour aider, la sub ci dessus est appelé par celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub Liste_Click()
     
    Dim z As Integer
    Dim y As Integer
    Dim x As Integer
    Dim w As Integer
    Dim v As Integer
    Dim nom As String
    Dim nom1 As String
    Dim pre As String
    Dim lister As Object
     
    'remplir le tableau des 4 semaines
     
    Set lister = nvelleann.LISTE
     
    nom = lister.ListItems(lister.SelectedItem.Index).Text
    pre = lister.ListItems(lister.SelectedItem.Index).ListSubItems(1).Text
     
    cyclemodif nom, pre,"nvelleann"
     
    nvelleann.Show
     
    End Sub
    Cette privatesub est appelé depuis un bouton de l'userform "nvelleann"
    D'autres sub appelerons la sub cyclemodif pour remplir un autre userform

    Le but de la sub cyclemodif est qu'un multipage contenant un nombre important de contrôles se retrouve dans plusieurs userform.
    J'ai mis les mêmes noms de contrôles dans chacun des userform.
    La sub cyclemodif doit me remplir les contrôles dans l'userform que je nomme en 3ième argument.

    Par contre concernant ceci :

    Pour atteindre les controles de ta Userform, il faut effectivement utiliser controles (la collection des controles de ta Userform) mais pas comme tu le fais.

    Regarde l'aide sous l'editeur de macro / sur ce forum. Tu vas trouver plein d'exemple !
    J'utilise "controls" et non controles mais il me sert à mettre en forme le nom d'un contrôle à atteindre.
    Certains contrôles ont le même nom avec 1 chiffre pour les différencier.
    Pour les atteindre et les remplir j'utilise une boucle dans lequel je nomme le contrôles par controls "nom en lettre" & chiffre qui le différencie.
    Je gagne ainsi des lignes de code et le programme fonctionne bien.
    J'utilise souvent cet appelation et je n'ai pas eu de problèmes jusqu'à présent.
    J'ai recherché sur ce forum "editeur de macro" sans vraiment trouver de réponses.

    Peux tu être plus explicites ?
    Peux tu me donner un lien d'un tuto ou d'une discussion ?

    Merci pour ton aide

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 216
    Par défaut
    Bonjour,

    Effectivement, il faut utiliser "Controls" et pas "controles".

    Sinon,
    - l’éditeur de macro (ou VBE), c'est l'interface de création de ton projet (Microsoft Visual Basic for Application) ouvert via Alt+F11.
    - myuserform est le nom de ta UserForm dans ton projet (par défaut, si tu ajoutes une Userform, elle est nommée "UserForm1")

    Coté lien, tu as: http://silkyroad.developpez.com/VBA/ControlesUserForm/

  5. #5
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut Solution trouvée mais est ce bien ?
    bonjour,

    Bon après un peu de recherche sur tes infos et un peu de réflexion, je suis arrivé à cette solution qui fonctionne :

    Pour modif cycle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Sub cyclemodif(nom As String, pre As String, feuille As UserForm)
     
    'Dim UF_Feuille As myUserForm
    'Set UF_Feuille = New myUserForm
    Dim feuil As UserForm
    Set feuil = feuille
     
    For z = 5 To 102
     
        If nom = Sheets("listagent").Range("b" & z).Value And pre = Sheets("listagent").Range("c" & z).Value Then
     
            x = 5
     
            For y = 1 To 4 'boucle pour passer les 4 semaines
     
                v = 1
                feuil.Controls("nomagsem" & y).Caption = nom & " " & pre    'remplir le nom des agents
     
                For w = 1 To 7 'boucle pour passer tous les jours d'1 semaine
     
                    feuil.Controls("s" & y & "_j" & w & "_hdeb").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
                    v = v + 1
                    feuil.Controls("s" & y & "_j" & w & "_hfin").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
                    v = v + 1
                    feuil.Controls("s" & y & "_j" & w & "_pdeb").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
                    v = v + 1
                    feuil.Controls("s" & y & "_j" & w & "_pfin").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
                    v = v + 1
     
                Next w
     
                'remplir la page cycle
                feuil.nomagsem5.Caption = nom & " " & pre
                num = Sheets("listagent").Range("d" & z).Value
                feuil.cyc_nbrcyc.Value = num
                For w = 1 To 8 'masque les cellules semaine non utilisé
                    If feuil.cyc_nbrcyc.Value < w Then
                        feuil.Controls("cyc_s" & w).Visible = False
                        feuil.Controls("cyclab_s" & w).Visible = False
                    End If
                Next w
                For w = 1 To num
                    feuil.cyc_s1.Value = Sheets("listagent").Cells(z, w + 117).Value
                Next w
     
                x = x + 28 'saute d'1 semaine sur la feuille
     
            Next y
            Exit For
        End If
    Next z
     
    End Sub
    et pour l'appel de cette sub :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub Liste_Click()
     
    Dim z As Integer
    Dim y As Integer
    Dim x As Integer
    Dim w As Integer
    Dim v As Integer
    Dim nom As String
    Dim nom1 As String
    Dim pre As String
    Dim lister As Object
     
    'remplir le tableau des 4 semaines
     
     
    Set lister = nvelleann.LISTE
     
    nom = lister.ListItems(lister.SelectedItem.Index).Text
    pre = lister.ListItems(lister.SelectedItem.Index).ListSubItems(1).Text
     
    cyclemodif nom, pre, nvelleann
     
     
     
    End Sub
    Encore merci pour ton aide.

    Je reviendrai voir si tu as apportés une réponse.

    a bientôt

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 216
    Par défaut
    Bonjour,

    Une remarque dans ton code ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub cyclemodif(nom As String, pre As String, feuille As UserForm)
     
    'Dim UF_Feuille As myUserForm
    'Set UF_Feuille = New myUserForm
    Dim feuil As UserForm
    Set feuil = feuille
    Vu que tu définis ta Userform en paramètre de ta fonction, tu n'as pas besoin de créer une nouvelle variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim feuil As UserForm
    Set feuil = feuille
    Tu peux directement travailler sur "feuille" !
    Et puis n'oublies pas le nom des variables est important : "Feuille"...c'est pas très clair !
    Si toutes tes Userforms sont des feuilles, tu auras du mal à retrouver tes petits dans quelques temps.

    @+ et bon code !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] DAO et ADO : Copier dans une variable et non dans une feuille
    Par 4k1r4 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/12/2015, 09h50
  2. Définir une chaine (non connue) dans une variable
    Par synx91 dans le forum Langage
    Réponses: 2
    Dernier message: 26/09/2012, 16h00
  3. Réponses: 4
    Dernier message: 24/04/2011, 17h33
  4. Réponses: 8
    Dernier message: 25/09/2007, 08h31
  5. [langage] Extraire un block dans une variable multiligne
    Par |DUCATI| DesMo dans le forum Langage
    Réponses: 9
    Dernier message: 11/02/2003, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo