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 :

[source]Userform redimensionnable


Sujet :

Contribuez

  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut [source]Userform redimensionnable
    Bonjour a tous

    voila ma toute derniere version d'un userform resizible

    avec les controls redimentionnés en memes temps

    code dans le module userform:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub UserForm_Activate()
     plein_ecran
    End Sub
    Private Sub UserForm_Initialize()
     trois_boutons Me
    End Sub
    Private Sub UserForm_Resize()
     maForm_Resize Me
    End Sub
    ensuite le code dans un 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    '**********************************************************************************************************************
    '*                                     CREATEUR :Patricktoulon                                *
    '*                                                    DATE :23/09/2010                                                *
    '*                                       UTILISATION D'UNE SEULE API LE "USER32.DLL"                                  *
    '*                                    EXEMPLE DE USERFORM REDIMENTIONNABLE NOUVELLE VERSION                           *
    '*                                      LES CONTROLS SONT REDIMENTIONNES EN MEME TEMPS                                *
    '*                                               AINSI QUE LES FONT SIZE                                              *
    '**********************************************************************************************************************
    Public Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Public Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
    Public Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Public old_largeur As Long, handle As Long, old_hauteur As Long, newhauteur As Single, newlargeur As Single
    Public Ctl As MSForms.Control
     
     
    Sub trois_boutons(uf As UserForm) 'on va ajouter les deux boutons manquants et l'élasticité a l'userform
    '***************************************************************
    '*ici on memorise les dimention de depart de l'userform        *
      old_largeur = uf.InsideWidth: old_hauteur = uf.InsideHeight '*
    '***************************************************************
     
     '***************************************************************************************************************
     ' ici on determine le handle par la classe de frame en testant la version de l'application ( DE EXCEL97 A 2007)*
      handle = FindWindow("Thunder" & IIf(Application.Version Like "8*", "0*", "D") & "Frame", uf.Caption)         '*
     ' ici on applique les changement (&h70000= les trois bouton et l'elasticité)                                   *
      SetWindowLong handle, -16, GetWindowLong(handle, -16) Or &H70000                                             '*
     '***************************************************************************************************************
     
     
    End Sub
    Sub plein_ecran()
    ' on affiche le userform en plein ecran avec l'api showwindowa de la user32.dll _
    bien moins lourd que mes versions precedente de maximisation de l'userform et plus rapide et plus propre
    '1= mode normal
    '3 =maximiser
    '6 =minimiser
     'le handle a été declaré en public au debut du module et _
     identifier dans la routine des trois boutons il n'est donc plus necessaire de l'identifier
     ShowWindow handle, 3
    End Sub
     
    Sub maForm_Resize(usf As UserForm)
     'ici on determine le multiplicateur qui differenci la dimention de base a celle actuelle de l'userform
     newlargeur = usf.InsideWidth / old_largeur: newhauteur = usf.InsideHeight / old_hauteur
     
     'ici on boucle sur tout les controls
     For Each Ctl In usf.Controls
     'et on applique le multiplicateur au controls pour la largeur et la hauteur en une seule ligne
     Ctl.Move Ctl.Left * newlargeur, Ctl.Top * newhauteur, Ctl.Width * newlargeur, Ctl.Height * newhauteur
     ' on a pris soin de metre un tag dans les propriétés  a tout les controls qui n'ont pas de font size(image,scrollbar ,ect)
     
     'et on applique la formule (userfom.width/ 48) Attention!!! cette valeur peut changer _
     pour certaines personnes en fonction de la resolution de leurs ecrans
     If Ctl.Tag = "" Then Ctl.Font.Size = (usf.InsideWidth / 48)
     Next
     'ici on indique que l'ancienne largeur devient la nouvelle largeur et pareil pour la hauteur indispensable pour un futur redimentionnement
     old_largeur = usf.InsideWidth: old_hauteur = usf.InsideHeight: usf.Repaint
    End Sub
    voila toujours dans l'optique de reduire un maximum le code
    1ligne pour le handle
    1ligne pour les options de la caption


    2 lignes dans une boucle pour redimentionner les controls
    une particularité par rapport a mes anciennes version j'ai suprimer l'utilisation de la fonction "redim preserve" puisqu'il n'est plus necessaire de memoriser les dimention de chaque controls au demarage

    seules les dimentions userform sont memorisées au depart un point c'est tout

    a noter que j'ai utilisé une autre facon de pointer le handle en specifiant la classe de fenetre (thunder) et en testant la version de excel

    si les lignes vertes vous genent vous pouvez toujours les enlever

    je joint le fichier en exemple

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 56
    Par défaut
    Bonjour le forum…

    @Patrick Toulon : est-il possible d'afficher l'USF sans les deux bouton minimiser et maximiser ?

    Merci d'avance.

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut heu...!!!
    bonjour

    oui c'est possible

    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
     
     
    '**********************************************************************************************************************
    '*                                     CREATEUR :Patricktoulon                                *
    '*                                                    DATE :23/09/2010                                                *
    '*                                       UTILISATION D'UNE SEULE API LE "USER32.DLL"                                  *
    '*                                    EXEMPLE DE USERFORM REDIMENTIONNABLE NOUVELLE VERSION                           *
    '*                                      LES CONTROLS SONT REDIMENTIONNES EN MEME TEMPS                                *
    '*                                               AINSI QUE LES FONT SIZE                                              *
    '**********************************************************************************************************************
    Public Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Public Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
    Public Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Public old_largeur As Long, handle As Long, old_hauteur As Long, newhauteur As Single, newlargeur As Single
    Public Ctl As MSForms.Control
     
     
    Sub trois_boutons(uf As UserForm) 'on va ajouter les deux boutons manquants et l'élasticité a l'userform
    '***************************************************************
    '*ici on memorise les dimention de depart de l'userform        *
      old_largeur = uf.InsideWidth: old_hauteur = uf.InsideHeight '*
    '***************************************************************
     
     '***************************************************************************************************************
     ' ici on determine le handle par la classe de frame en testant la version de l'application ( DE EXCEL97 A 2007)*
      handle = FindWindow("Thunder" & IIf(Application.Version Like "8*", "0*", "D") & "Frame", uf.Caption)         '*
     ' ici on applique les changement (&h70000= les trois bouton et l'elasticité)                                   *
      SetWindowLong handle, -16, GetWindowLong(handle, -16) and not &HC0000                                            '*
     '***************************************************************************************************************
     
     
    End Sub
    les options
    --and not &HC0000 pas de bouton

    -- or &H20000 LE BOUTON REDUIRE

    -- or &H30000 les deux bouton manquants

    -- or &H40000 l'elasticité

    --&H70000 la totale
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 56
    Par défaut
    Merci beaucoup pour votre réponse.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    bonjour

    de rien ,le forum est la pour ça

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut nouvelle version
    bonjour a tous

    et si on avait pas besoins de memoriser dans des variables les dimentions
    si on se servait du tag comme dans ma derniere version de l'effet mouse in out sur les controls de l'userform

    voila une premiere version
    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
    'userform redimentionable avec les controls redimentionnables
    'Createur Patricktoulon
    'Date de Creation:26.06.2012
    ' Pour codesource
    Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
     
    Private Sub UserForm_Initialize()
        SetWindowLong FindWindow(vbNullString, Me.Caption), -16, GetWindowLong(FindWindow(vbNullString, Me.Caption), -16) Or &H70000
        For Each ctrl In Me.Controls
            ' On se sert du tag pour memoriser les dimension des controls separé par un double point
            ctrl.Tag = Me.Height / ctrl.Height & ":" & Me.Width / ctrl.Width & ":" & Me.Width / ctrl.Left & ":" & Me.Height / ctrl.Top
            If TypeName(ctrl) = "CommandButton" Or TypeName(ctrl) = "Label" Or TypeName(ctrl) = "TextBox" Then ctrl.Tag = ctrl.Tag & ":" & Me.Width / ctrl.Font.Size
        Next
    End Sub
    Private Sub UserForm_Resize()
        For Each ctrl In Me.Controls
            'le tag comporte les diviseurs de l'userform pour obtenir les dimension du control
            ctrl.Move Me.Width / Split(ctrl.Tag, ":")(2), Me.Height / Split(ctrl.Tag, ":")(3), Me.Width / Split(ctrl.Tag, ":")(1), Me.Height / Split(ctrl.Tag, ":")(0)
            If TypeName(ctrl) = "CommandButton" Or TypeName(ctrl) = "Label" Or TypeName(ctrl) = "TextBox" Then ctrl.Font.Size = Me.Width / Split(ctrl.Tag, ":")(4)
            Me.Repaint
        Next
    End Sub
    et voila une autre version utilisant la fonction zoom de l'userform
    je ne suis pas l'auteur de ce code l'auteur c'est ucfoutu

    avec cette version l'userform est redimentionné en gardant les proportion initial 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
    13
    14
    15
    16
    17
    18
    19
    Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private usf_width As Long, usf_height As Long, k As Single
     
    Private Sub UserForm_Initialize()
      Dim iStyle As Long, hwnd As Long
      hwnd = FindWindow(vbNullString, Me.Caption)
      iStyle = GetWindowLong(hwnd, -16) Or &H70000
      SetWindowLong hwnd, -16, iStyle
      k = Me.Width / Me.Height
      usf_width = Me.Width
    End Sub
     
    Private Sub UserForm_Resize()
      On Error Resume Next
      Me.Width = Me.Height * k
      Me.Zoom = (Me.Width / usf_width) * 100
    End Sub


    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. Redimensionnement automatique des controls dans un userform
    Par patricktoulon dans le forum Général VBA
    Réponses: 81
    Dernier message: 08/10/2019, 16h48
  2. [XL-2002] Rendre un Userform Redimensionnable par l'utilisateur et ajouter des scrollbars
    Par Maze0 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/03/2012, 16h59
  3. [XL-2007] Poignée de redimensionnement pour un Userform
    Par mobiclick dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/10/2010, 23h58
  4. [XL-2003] Remplacer les noms et les sources des contrôles d'un userform
    Par MarcelG dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/02/2010, 17h55
  5. [Toutes versions] Redimensionner un Userform
    Par Many31 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/10/2009, 13h13

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