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 :

Problème de redimensionnement de Userform


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 12
    Par défaut Problème de redimensionnement de Userform
    Bonjour à tous et à toutes.
    Je ne poste pas souvent ici, mais je viens très souvent trouver des bonnes macros que j'utilise dans mon code.
    J'ai une macro qui fait 22.640 lignes pour 9 userforms, 30 modules et 11 modules de classe et qui pèse 1Mo. Elle fait appel à plus d'une centaines de fichiers qui sont contenus dans le même répertoire sur un réseau. Je peux donc difficilement la partager.

    J'utilise la macro de Patricktoulon qui permet de redimensionner la fenêtre :
    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
    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 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 differencie la dimension 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 =vbNullString 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
    Celle-ci marche très bien à un seul soucis près c'est que parfois, lorsque je minimise la fenêtre et que je la reprends plus tard, tous les éléments ont tellement été agrandis que je ne vois plus rien.

    Après échanges j'ai mis en place une macro plus récente, mais ce coup-ci j'ai des problèmes de décochage de checkbox et de décalage de la ligne du bas en dehors de la 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
    Private Declare Function SetWindowLongA Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function fwa Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     
    Sub depart(usf)
     
        SetWindowLongA fwa(vbNullString, usf.Caption), -16, &H94CF0080  'Api window pour mettre les boutons minimiser et maximiser et l'élasticité
        usf.Tag = usf.Width & ":" & usf.Height    'on memorise les dimention du userform dans son tag
        nofont = "ScrollBar, SpinButton, Image"    'liste des controles qui n'ont pas de font
        For Each Ctrl In usf.Controls
            Ctrl.Tag = Ctrl.Left & ":" & Ctrl.Width & ":" & Ctrl.Top & ":" & Ctrl.Height    'on memorise les dimention des controles dans leur tag
            If Not nofont Like "*" & Left(TypeName(Ctrl), 5) & "*" Then Ctrl.Tag = Ctrl.Tag & ":" & Ctrl.Font.Size & ":" & usf.Width / Ctrl.Font.Size & ":" & usf.Height / Ctrl.Font.Size 'si il y a la propriété font alors on memorise aussi le fontsize
            If TypeName(Ctrl) = "ListBox" Then 'MEMORISATION DU COLUMNWIDTHS DE la listbox dans le tag sous la forme du string de l'array des dimentions
                tablwidth = Split(Replace(Ctrl.ColumnWidths, " pt", ""), ";")
                For i = 0 To UBound(tablwidth): tablwidth(i) = Val(tablwidth(i)): Next
                Ctrl.Tag = Ctrl.Tag & ":" & Join(tablwidth, "|")
            End If
     
        Next
    End Sub
     
    Sub maform_resize(usf)
        Dim WU, HU, D, Ctrl, tablwidth, i
        WU = usf.Width / Val(Split(usf.Tag, ":")(0)): HU = usf.Height / Val(Split(usf.Tag, ":")(1)) 'calcul du proprata
        For Each Ctrl In usf.Controls
            D = Split(Ctrl.Tag, ":")
            Ctrl.Move D(0) * WU, D(2) * HU, D(1) * WU, D(3) * HU 'redimentionnement par le prorata
            If UBound(Split(Ctrl.Tag, ":")) > 3 Then Ctrl.Font.Size = Round(D(4) * HU) + 1 'il il y a la propriété font on redimentionne le font
            If TypeName(Ctrl) = "ListBox" Then 'si c 'est une listbox on reconstruit le columnwidts avec l'array precédement memorisé dans le tag
                tablwidth = Split(D(5), "|")
                For i = 0 To UBound(tablwidth): tablwidth(i) = Val(tablwidth(i)) * WU: Next 'ON MET LES DIMENTIONS COLONNE A JOUR
                Ctrl.ColumnWidths = Join(tablwidth, " pt;") 'reconstruction du string columnwidths
            End If
        Next
    End Sub
    Et voilà l'effet sur la userform :
    avant : (le décalage de la frame redressement n'apparaissait pas avant)
    Nom : avant redimensionnement.jpg
Affichages : 5590
Taille : 494,7 Ko
    et après le redimensionnement.
    Nom : après redimensionnement.jpg
Affichages : 4120
Taille : 538,6 Ko

    Pourriez-vous m'aider à ce que les boutons ne dépassent pas de la userform?
      0  0

  2. #2
    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
    a priori je ne vois pas
    essaye pour voir dans une simple sub de modifier le font ou meme la taille d'un de tes checbox et vois si il se decoche
    si ca ne le fait pas c'est dans le reste de ton code qu'il y a un conflit avec une variable peut etre
    si ca le fait il faudra ajouter ce parametre dans le tag du checkbox et le ré appliquer au resize du form
    je vais tester de mon coté
    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
      0  0

  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 re testé et approuvé
    re
    je viens de tester et comme je le pensais ca viens de chez toi le redim ou minimizer du form ne modifie en rien l'etat des checkbox
    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
      0  0

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    on ne voit pas où et comment ont été déclarées et initialisées certaines variables (à commencer par la variable usf)
    L'évènement resize intervient à chaque réduction de ton userform et à chaque rétablissement de son affichage
    Les conséquences sont alors évidentes si usf a été déclarée avec une portée générale:
    - dans ton premier code : tu repars à chaque fois, dans l'évènement resize, avec des calculs sur la base non de l' état originel, mais du dernier état
    - même type de punition pour les mêmes motifs avec ton second code

    Là s'arrête mon intervention dans cette discussion car je suis énergiquement opposé à ce genre de "redimensionnement" qui ne tient aucun compte des distorsions forcément générées entre deux machines dont les proportions hauteur/largeur de l'écran, en pixels, ne sont pas les mêmes.
    Pire encore si l'on veut un affichage en plein écran et occupant réellement tout l'écran.
    Et sans parler des surprises diverses et variées résultant de calculs erronés de la retaille des polices de caractères, ni du fait que certains contrôles (et leurs ascenseurs éventuels) ne sont pas totalement "élastiques"
    J'ai déjà eu plus d'une fois l'occasion d'en faire la remarque et n'ai plus l'intention d'y revenir.
      0  3

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 12
    Par défaut
    Le problème est que j’atteins les limites de mes compétences avec ce problème. ça fait depuis début décembre que je tourne en rond sur ce soucis en vain.
    Je ne sais pas comment déterminer la propriété qui redimensionne improprement ma fenêtre.
    Patricktoulon, est-ce que tu veux que j'envoi mon fichier en mp?
      0  0

  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 re
    re
    que racconte tu jacques encore comme sautises
    usf est l'argument des subs il est = a me dans les apels depart et form_resize
    il n'est pas question ici de variables globales
    regarde un peu avant de parler
    et combien meme si elles etait globale l'userform ses dimension sont pris pendant !!! la sub et les references au old dimention sont dans les tags
    pffffff......
    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
      1  1

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour jacques,
    Oui il y a plus de code pour maintenir les proportions du usf que pour gérer les actions menées par celui ci!

    Le parfait est l'ennemi du bien!

    La.semaine dernière j'ai télécharger la version gratuite de Visual studio 2017 pour test et elle gère ça super bien les contrôles s'adapte au redimensionnement du usf à la résolution de l'écran ainsi que sa taille!
    Dernière modification par Invité ; 20/01/2018 à 17h42.
      0  0

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Oui, Robert

    On peut cependant atteindre les mêmes résultats (et pas d'autres "fantaisistes et déformants") avec ce qu'offre VBA/Excel, à moindres frais, si l'on sait garder les pieds sur terre et s'en tenir à la seule raison, qui écarte toute démarche s'appuyant sur un "redimensionnement", au profit d'un autre principe : celui d'un travail sur un "miroir homothétique" qui, lui, n'intervient à AUCUN MOMENT ni sur les positions, ni sur les dimensions, ni sur les tailles de polices de caractères, etc ...
    Mais même "à moindre frais", le jeu (au demeurant principalement ludique) n'en vaut pas la chandelle (Excel est un tableur, pas une "vitrine").
    Bon dimanche
      0  0

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Quand on utilise des formulaire dans Excel, on les dessine dans la plus mauvais définition de Windows!

    Si on veut chiader ses formulaires on passe en .net qui fait ça en natif!
      1  0

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Robert
    Ce qui est en fait ici à reconsidérer, c'est la démarche elle-même, sa philosophie, etc ...
    Et traiter de surcroît une telle démarche par un redimensionnement peut dans de nombreux cas conduire aux mésaventures rapportées par Garlim.
    Redimensionner en respectant non pas les proportions des choses redimensionnées, mais celles du rectangle où on veut les afficher relève de ce que je m'abstiens de nommer.

    Voilà maintenant Garlim dans l'embarras et je vois vraiment mal comment qui que ce fût pourrait l'en sortir (j'entends par là : de manière fiable et pérenne, entendons par là en prenant en compte tant une évolution de son userform qu'un éventuel futur changement d'écran)
      0  0

Discussions similaires

  1. Problème avec redimensionnement tableau
    Par PoZZyX dans le forum Réseau
    Réponses: 18
    Dernier message: 20/04/2006, 15h46
  2. [CSS] problème de redimensionnement
    Par cootchy dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 14/02/2006, 17h42
  3. [SWT][Layout]problème de redimensionnement d'un Text
    Par McFoggy dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 05/08/2004, 12h10
  4. Problème de redimensionnement
    Par routouf dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 16/07/2004, 16h27
  5. Problème de redimensionnement
    Par david71 dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 14/05/2004, 17h39

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