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

Contribuez Discussion :

VBA / UserForm - Positionnement automatique des boutons Ok & Cancel


Sujet :

Contribuez

  1. #1
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut VBA / UserForm - Positionnement automatique des boutons Ok & Cancel
    Bonjour,
    Agacé par le temps passé à positionner les boutons OK et Cancel de mes UserForm, j'avais il y a quelques temps développé une petite procédure qui gérait cela automatiquement.
    Il y a deux jours, j'ai rajouté des constantes pour pouvoir mieux encore paramétrer cette procédure.
    Je me suis dit que cela pourrait peut-être profiter à d'autres.
    Voici donc le code.
    Les boutons sont nommés cbOK et cbCancel
    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
    Private Sub UserForm_Initialize()
     PosButton ' Positionne les boutons Ok/Cancel
    End Sub
    Private Sub cbOK_Click()
     ' Call Mise à jour données
     Unload Me
    End Sub
    Private Sub cbCancel_Click()
     Unload Me
    End Sub
    Private Sub PosButton()
     ' Positionnement automatique des boutons cbOk & cbCancel
     ' Philippe Tulliez - 2009/04/20
     ' Update
     ' 2011-07-27 - Ajouté constantes
     ' Const
     ' Title - Propriété Caption de UserForm
     ' Marge - distance entre btns et bord droit/bas de Userform
     ' bWidth - Largeur des boutons
     ' sOk & sCancel - Propriété Caption des btns
     Const Title As String = "Ecran Auto"
     Const Marge As Byte = 10
     Const bWidth As Byte = 60
     Const sOk As String = "Confirmer"
     Const sCancel As String = "Annuler"
     '
     With Me ' Init Button
     .Caption = Title
     .cbOK.Width = bWidth: .cbCancel.Width = bWidth
     .cbOK.Left = .Width - (Marge + .cbOK.Width)
     .cbOK.Top = .Height - (20 + Marge + .cbOK.Height)
     .cbCancel.Top = .Height - (20 + Marge + .cbCancel.Height)
     .cbCancel.Left = .Width - ((Marge + .cbOK.Width) + (Marge + .cbCancel.Width))
     .cbOK.Caption = sOk: .cbCancel.Caption = sCancel
     .cbOK.TabIndex = 0: .cbCancel.TabIndex = 1
     '.Caption = mVbGenFun.ExtName(ActiveDocument.AttachedTemplate) & " - " & mVbGenFun.ExtName(ActiveDocument.Name)
     End With
    End Sub
    Vos remarques et/ou suggestions sont les bienvenues

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut Philippe

    J'ai déjà réalisé ce genre de choses, mais sur Access pour avoir des paramètres propres à chaque utilisateur (notamment des couleurs).

    Pour rendre ton code plus générique (dans le cas de plusieurs UserForm), je placerais la procédure PosButton dans un module et je passerai en paramètre le nom de l'UserForm au lieu d'utiliser le me qui est propre à l'UserForm qui contient le code.

    Philippe

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour Philippe
    Merci pour ton intervention qui est très pertinente.
    En fait depuis quelques temps, j'ai tendance pour faciliter la portabilité des UserForm et la transparence du code, à placer les variables et modules propre à la UserForm dans celle-ci.
    Ainsi, en important simplement le module frm, je peux faire tourner la UserForm sans avoir à me tracasser de l'importation d'autres modules.
    De toute manière, je retiens cette suggestion et je vais placer un paramètre à ce module qui pourrait ainsi être placé soit dans l'objet UserForm lui-même soit dans un module extérieur.
    Belle journée
    Philippe

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonsoir corona et philippe jochmans


    je rejoint l'idée de philippe pour une portabilité et utilisation pour plusieurs userforms

    et pourquoi pas en faire un tout petit xla

    et l'utilisé quand on veux

    bien en tout cas ce petit module

    bonsoir a tout les deux

    au plaisir

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonsoir Patrick,
    Merci pour ton message.
    J'ai donc adapté ma procédure qui peut indifféremment être placée dans un autre module ou dans le UserForm.
    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
    Option Explicit
    Dim usf As ufStd
    Private Sub UserForm_Initialize()
     ' Set usf = Me: mUsfModule.PosButton usf ' Si Procedure ds module mUsfModule
     Set usf = Me: Me.PosButton usf ' Si Préocédure ds la UserForm
    End Sub
    Private Sub cmdOk_Click()
     ' Call Mise à jour données
     Unload Me
    End Sub
    Private Sub cmdCancel_Click()
     Unload Me
    End Sub
    Sub PosButton(Frm)
     ' Positionnement automatique des boutons cmdOk & cmdCancel
     ' Philippe Tulliez - 2009/04/20
     ' Update
     ' 2011-07-27 - Ajouté constantes
     ' 2011-07-29 - Ajouté argument Frm
     ' Const
     ' Title - Propriété Caption de UserForm
     ' Marge - distance entre btns et bord droit/bas de Userform
     ' bWidth - Largeur des boutons
     ' sOk & sCancel - Propriété Caption des btns
     Const Title As String = "Ecran Auto"
     Const Marge As Byte = 10
     Const bWidth As Byte = 60
     Const sOk As String = "Confirmer"
     Const sCancel As String = "Annuler"
     '
     With Frm ' Init Button
     .Caption = Title
     .cmdOK.Width = bWidth: .cmdCancel.Width = bWidth
     .cmdOK.Left = .Width - (Marge + .cmdOK.Width)
     .cmdOK.Top = .Height - (20 + Marge + .cmdOK.Height)
     .cmdCancel.Top = .Height - (20 + Marge + .cmdCancel.Height)
     .cmdCancel.Left = .Width - ((Marge + .cmdOK.Width) + (Marge + .cmdCancel.Width))
     .cmdOK.Caption = sOk: .cmdCancel.Caption = sCancel
     .cmdOK.TabIndex = 0: .cmdCancel.TabIndex = 1
     '.Caption = mVbGenFun.ExtName(ActiveDocument.AttachedTemplate) & " - " & mVbGenFun.ExtName(ActiveDocument.Name)
     End With
    End Sub

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonsoir corona


    pour plus de clarté

    dans le module de l'userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub UserForm_Initialize()
     
         PosButton Me   'on appelle la procedure suivi de l'object userform a prendre en compte
    End Sub
    Private Sub cmdOk_Click()
    ' Call Mise à jour données
        Unload Me
    End Sub
    Private Sub cmdCancel_Click()
        Unload Me
    End Sub
    et dans le module standard

    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
     
     
    Option Explicit
     
     
     
    Sub PosButton(Frm As Object)
    ' Positionnement automatique des boutons cmdOk & cmdCancel
    ' Philippe Tulliez - 2009/04/20
    ' Update
    ' 2011-07-27 - Ajouté constantes
    ' 2011-07-29 - Ajouté argument Frm
    ' Const
    ' Title - Propriété Caption de UserForm
    ' Marge - distance entre btns et bord droit/bas de Userform
    ' bWidth - Largeur des boutons
    ' sOk & sCancel - Propriété Caption des btns
        Const Title As String = "Ecran Auto"
        Const Marge As Byte = 10
        Const bWidth As Byte = 60
        Const sOk As String = "Confirmer"
        Const sCancel As String = "Annuler"
        '
        With Frm    ' Init Button
            .Caption = Title
            .cmdOk.Width = bWidth: .cmdCancel.Width = bWidth
            .cmdOk.Left = .Width - (Marge + .cmdOk.Width)
            .cmdOk.Top = .Height - (20 + Marge + .cmdOk.Height)
            .cmdCancel.Top = .Height - (20 + Marge + .cmdCancel.Height)
            .cmdCancel.Left = .Width - ((Marge + .cmdOk.Width) + (Marge + .cmdCancel.Width))
            .cmdOk.Caption = sOk: .cmdCancel.Caption = sCancel
            .cmdOk.TabIndex = 0: .cmdCancel.TabIndex = 1
            '.Caption = mVbGenFun.ExtName(ActiveDocument.AttachedTemplate) & " - " & mVbGenFun.ExtName(ActiveDocument.Name)
        End With
    End Sub

    au plaisir

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour Patrick,
    Merci pour tes suggestions
    Pour l'argument du module PosButton(Frm As Object), je suis d'accord mais en fait je voulais le typer avec le nom de l'objet exact et je n'ai pas trouvé.
    Je croyais naïvement placer frm as UserForm mais cela n'a pas fonctionné. Si tu connais le nom exact de l'objet je suis preneur.
    Pour l'appel à la procédure, peut-être que pour les lecteurs cela aurait été plus clair de faire un simple appel PosButton Me. C'est ce que je fais quand la procédure est dans le même module mais lorsque qu'elle se trouve dans un autre module, je fais toujours précédé l'appel à la procédure par le nom du module.
    Ainsi nomModule.nomProcédure argument me permet de voir immédiatement à la lecture de mon code où se trouve cette procédure.
    Quand tu fais le débogage du code, c'est plus rapide quand tu as 5, 6 modules dans ton projet. Enfin pour moi, c'est plus clair.
    Alors dans tu as enlevé Set usf = Me qui précédait l'appel à la procédure et là c'est une erreur.
    Donc je dirais Set usf = Me: PosButton usf
    Bonne journée.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour

    j'ai enlever car je n'est pas penser au reste de ton code
    effectivement si cette variable te sert dans une autre fonction ou sub il peut être intéressant de la garder

    maintenant si cette variable te sert rien que dans cette fonction il ne sert a rien d'avoir une variable public constamment en mémoire

    faisant beaucoup de module classe je l'ai appris a mes dépends"trop de fuites mémoire

    pour l'objet "userform" il est préférable d'utiliser "object" bien plus permissif que MSforms......

    j'ai aussi remarquer que bien que dans ce cas précis c'est juste pouvait tout simplement planter c'est du chez moi a une mise a jour d'office

    au plaisir d'en débattre si tu veux

Discussions similaires

  1. [VBA-E] Hauteur automatique des lignes pour cellules fusionnées
    Par Couettecouette dans le forum Contribuez
    Réponses: 0
    Dernier message: 18/10/2007, 15h45
  2. Réponses: 2
    Dernier message: 04/07/2007, 11h25
  3. positionnement automatique des composants
    Par chti_juanito dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 12/06/2006, 14h01
  4. Code Automatique des boutons et Normes
    Par Alpha31 dans le forum Access
    Réponses: 1
    Dernier message: 09/06/2006, 11h51
  5. Insérer automatiquement des boutons dans des cellules excel
    Par Oaurelius dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/11/2005, 18h38

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