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 :

Appel d'une procédure depuis un UserForm


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Appel d'une procédure depuis un UserForm
    Bonjour à tous,

    Voici le code d'initialisation des 3 UserForms de mon projet:
    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
    Dim Cmb As CommandBarControl
        Dim cBar As CommandBar
        Set cBar = CommandBars.Add(Position:=msoBarFloating, MenuBar:=False, Temporary:=True)
        Set Cmb1 = cBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
        Set Cmb2 = cBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
        Set Cmb3 = cBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
     
        Cmb1.FaceId = 3731 'valider
        Cmb2.FaceId = 5896 'nouveau
        Cmb3.FaceId = 2487 '4356 '1716 '644 '1088 ' 'supprimer
     
        Me.valider.Picture = Cmb5.Picture
        Me.valider.PicturePosition = fmPicturePositionLeftCenter
        Me.nouveau.Picture = Cmb6.Picture
        Me.nouveau.PicturePosition = fmPicturePositionLeftCenter
        Me.supprimer.Picture = Cmb7.Picture
        Me.supprimer.PicturePosition = fmPicturePositionLeftCenter
        cBar.Delete
     
        With Application
            ratiow = Int(.Width * 100 / Me.Width) * 0.98
            ratioh = Int(.Height * 100 / Me.Height) * 0.98
            ratio = IIf(ratiow < ratioh, ratiow, ratioh)
            Me.Zoom = ratio
            Me.Left = Application.Left
            Me.Top = Application.Top
            Me.Width = Application.Width - 11
            Me.Height = Application.Height - 11
        End With

    Pour raccourcir je souhaiterais créer une procédure objet dans un module et l'appeler depuis chaque UserForm.

    Est-ce possible, merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Bonjour, imaginons sur votre USF1 vous avez un bouton CommandButton1. Vous cliquez dessus et il démarre une macro nommée OuvTravail.
    vous pouvez avoir trois ou quatre USF et avoir toujours 1 bouton qui démarre la macro OuvTravail

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub CommandButton1_Click()
    OuvTravail
    End Sub
     
    Sub OuvTravail()
    ...Code...
    End Sub


    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  3. #3
    Membre habitué
    Bonjour Transitoire,
    Merci pour votre réponse.
    Bonjour, imaginons sur votre USF1 vous avez un bouton CommandButton1. Vous cliquez dessus et il démarre une macro nommée OuvTravail.
    vous pouvez avoir trois ou quatre USF et avoir toujours 1 bouton qui démarre la macro OuvTravail
    Sur le principe cela me pose aucun soucis.
    Je rencontre quelques difficultés avec le code de l'initialisation à intégrer dans une procédure objet d'un module.

  4. #4
    Expert confirmé
    Bonjour,

    Je ferais plutôt comme ça :

    Dans l'userform :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
      Call MaProcedure(Me)
    End Sub


    Dans un module Standard
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub MaProcedure(usf)
      ' code ...
      ' ...
      ' Exemple :
     
      MsgBox usf.Caption
     
    End Sub


    EDIT : mettre l'userform (désigné par Me) en argument de la procédure permet d'agir sur cet userform depuis la procédure sans le désigner nommément.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #5
    Membre expérimenté
    Je rencontre quelques difficultés avec le code de l'initialisation à intégrer dans une procédure objet d'un module.
    Vous pouvez travailler sur un UserForm depuis n'importe quel module général avec un code du style
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Test()
    With UserForm1
          .Label1.caption = "Nom"
          .Label2.Caption = "Prénom"
          .TextBox1.Value = ""
        ' ETC ETC
    End With
    End Sub

    Si vous souhaitez plus de détails, faites une recherche sur les interventions de Pierre Fauconnier sur ce sujet, qui l'explique infiniment mieux que moi

    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  6. #6
    Membre habitué
    Bonjour Patrice740,
    Je ne peux pas me contenter de copier tout simplement le code de la Private Sub UserForm_Initialize() dans la Sub MaProcedure(usf).
    Cela doit être un peu plus compliqué que cela.
    @+

    Oups j'avais pas vu la nouvelle réponse de Transitoire, dans ce cas cela oblige à faire 3 procédures si j'ai bien compris.

  7. #7
    Membre habitué
    Re,
    J'ai un peu progressé:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub MaProcedure(usf)
        With usf
            ratiow = Int(.Width * 100 / .Width)
            ratioh = Int(.Height * 100 / .Height)
            ratio = IIf(ratiow < ratioh, ratiow, ratioh)
            .Zoom = ratio
            .Left = Application.Left
            .Top = Application.Top
            .Width = Application.Width - 11
            .Height = Application.Height - 11
        End With
    End Sub

    Jusque là ça fonctionne mais pour le reste ça coince,je continu de chercher.

  8. #8
    Expert confirmé
    Pour le reste, le code d'origine devrait fonctionner en remplaçant Me par usf.
    Sauf qu'à priori il y a des erreurs dans :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Me.valider.Picture = Cmb5.Picture
        Me.valider.PicturePosition = fmPicturePositionLeftCenter
        Me.nouveau.Picture = Cmb6.Picture
        Me.nouveau.PicturePosition = fmPicturePositionLeftCenter
        Me.supprimer.Picture = Cmb7.Picture
        Me.supprimer.PicturePosition = fmPicturePositionLeftCenter

    Ce devrait être :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Me.valider.Picture = Cmb1.Picture
        Me.valider.PicturePosition = fmPicturePositionLeftCenter
        Me.nouveau.Picture = Cmb2.Picture
        Me.nouveau.PicturePosition = fmPicturePositionLeftCenter
        Me.supprimer.Picture = Cmb3.Picture
        Me.supprimer.PicturePosition = fmPicturePositionLeftCenter
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  9. #9
    Membre habitué
    Bonjour Patrice740,
    Effectivement c'est une grossière erreur de numérotation des boutons.
    Je viens de tester ça fonctionne tip top.
    Merci à vous, vos apports abonde ma connaissance.

###raw>template_hook.ano_emploi###