XL 2010 l'userform qui s'adapte a la taille de l'écran

MAN

XLDnaute Occasionnel
Bonjour le forum . bonjour a tous.
j'ai le code que j'ai pris dans ce forum. malheureusement, il agrandit tout. mais, les listbox restent identiques. que faire
Private Sub UserForm_Initialize()
Dim ctl As Control, ratioW#, ratioH#, wstate&
With Application: wstate = .WindowState: .WindowState = xlMaximized:
ratioW = Application.Width / Me.Width
ratioH = Application.Height / Me.Height
.WindowState = wstate
End With
With Me
.StartUpPosition = 0: .Left = 0: .Top = 0
.Width = (.Width * ratioW) - (.Width - .InsideWidth)
.Height = (.Height * ratioH) - (.Height - .InsideHeight) + (.Width - .InsideWidth)
End With
For Each ctl In Me.Controls
ctl.Move ctl.Left * ratioW, ctl.Top * ratioH, ctl.Width * ratioW, ctl.Height * ratioH
Select Case TypeName(ctl)
Case "TextBox", "Label", "Frame", "CommandButton", "MultiPage", "ListBox", "ComboBox", "CheckBox", "OptionButton"
ctl.Font.Size = ctl.Font.Size * Application.Min(ratioH, ratioW)
End Select
Next

End Sub
 

jmfmarques

XLDnaute Accro
Bonjour à tous
mon intervention dans cette discussion se limitera à rappeler avec insistance qu'il est hasardeux de traiter des éléments graphiques (ce que sont les contrôles activex) dans une procédure évènementielle (initialize) déclenchée alors que le chargement de tous les éléments est encore en cours.
Utilisez l'évènement Activate

(sans préjudice du reste du code, que je n'ai pas regardé, ni de la "justesse" même de la démarche, qui aboutira forcément (si écrans de proportions différentes) non à une homothétie, mais à une distorsion).
 
Dernière édition:

cp4

XLDnaute Barbatruc
Bonjour tout le monde,

@MAN : PatrickToulon ;) (que je remercie) avait attiré mon attention sur un point essentiel, à savoir certains contrôles n'avaient pas de propriétés Font. Et m'avait proposé un code, cependant j'avais bricolé le mien entretemps. Je préfère le sien mais il doit être utiliser dans Activate en non initialize.

Mon code est le sien est juste au-dessus.

Bonne journée.
 

patricktoulon

XLDnaute Barbatruc
bonjour a tous
dans ce contexte bien précis (a l'ouverture)
le initialise fonctionne parfaitement bien

depuis quand on ne pourrait pas redimensionner un control avant l'affichage du userform ;)

cp4 ton code de dimensionne pas fullscreen il dimensionne l'uf a la dimension de l'application
 

patricktoulon

XLDnaute Barbatruc
Bonjour PatrickToulon, pourrais-tu éclairer ma lanterne? Quelle différence y a-t-il, plus que l'application s'affiche à la dimension de l'écran? Merci.
ben la difference elle est simple
a quel moment dans ton code tu vérifie que l'app excel est en plein ecra et a quel moment tu la met en plein ecran
jamais donc si ton app excel est en mode fenêtre ben tu n'aura pas ton userform plein ecran

ton code
VB:
Private Sub UserForm_Activate()
   Dim ctl As Control, ratioW As String, ratioH As String
   ratioW = Application.Width / Me.Width
   ratioH = Application.Height / Me.Height
   Me.Left = 0
   Me.Top = 0
   Me.Width = Application.Width
   Me.Height = Application.Height
   For Each ctl In Me.Controls
      ctl.Left = ctl.Left * ratioW
      ctl.Top = ctl.Top * ratioH
      ctl.Width = ctl.Width * ratioW
      ctl.Height = ctl.Height * ratioH
      If TypeOf ctl Is MSForms.ScrollBar Then GoTo suite
      If TypeOf ctl Is MSForms.SpinButton Then GoTo suite
      If TypeOf ctl Is MSForms.Image Then GoTo suite
      ctl.Font.Size = ctl.Font.Size * ratioH
suite:
   Next
End Sub
mon code
VB:
Private Sub UserForm_Initialize()
    Dim ctl As Control, ratioW#, ratioH#, wstate&
    With Application: wstate = .WindowState: .WindowState = xlMaximized:
        ratioW = Application.Width / Me.Width
        ratioH = Application.Height / Me.Height
        .WindowState = wstate
    End With
    With Me
        .StartUpPosition = 0: .Left = 0: .Top = 0
        .Width = (.Width * ratioW) - (.Width - .InsideWidth)
        .Height = (.Height * ratioH) - (.Height - .InsideHeight) + (.Width - .InsideWidth)
    End With
    For Each ctl In Me.Controls
        ctl.Move ctl.Left * ratioW, ctl.Top * ratioH, ctl.Width * ratioW, ctl.Height * ratioH
        Select Case TypeName(ctl)
        Case "TextBox", "Label", "Frame", "CommandButton", "MultiPage", "ListBox", "ComboBox", "CheckBox", "OptionButton"
            ctl.Font.Size = ctl.Font.Size * ratioH
        End Select
    Next

End Sub

c'est donc si obscure que cela ??? ;)

et je dirais même que dans cet exemple il manque quelque chose (je parle du mien bien sur) le tiens n’étant absolument pas efficient dans le sens ou comme il n'y a pas de surveillance app il est donc nul et non avenu dans un contexte de full screen
je te laisse un moment pour deviner ce qui manque
je l'ai déjà donné dans une autre discussion

pour répondre a jmfmarques
si on peut le faire dans le initialyse
on le fait bien en mode edition avant pourquoi ne pourrait on pas le faire ;)
je te fait un exemple avec les defauts pour le tiens et ce qui manque au mien puis un avec la correction je reviens tout a l'heure et j'explique
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
maintenant démo
cp4 --> has a problem' ne fait pas le job an d font size no correct
patricktoulon1 --> has a problem' with font size no correct
patricktoulon2 --> has not a problem'

et que je n'ai pas a revenir sinon je vais commencer la distribution des heures de colle ;)
 

Pièces jointes

  • demo pour cp4.xlsm
    15.7 KB · Affichages: 46

cp4

XLDnaute Barbatruc
ben la difference elle est simple
a quel moment dans ton code tu vérifie que l'app excel est en plein ecra et a quel moment tu la met en plein ecran
jamais donc si ton app excel est en mode fenêtre ben tu n'aura pas ton userform plein ecran

ton code
VB:
Private Sub UserForm_Activate()
   Dim ctl As Control, ratioW As String, ratioH As String
   ratioW = Application.Width / Me.Width
   ratioH = Application.Height / Me.Height
   Me.Left = 0
   Me.Top = 0
   Me.Width = Application.Width
   Me.Height = Application.Height
   For Each ctl In Me.Controls
      ctl.Left = ctl.Left * ratioW
      ctl.Top = ctl.Top * ratioH
      ctl.Width = ctl.Width * ratioW
      ctl.Height = ctl.Height * ratioH
      If TypeOf ctl Is MSForms.ScrollBar Then GoTo suite
      If TypeOf ctl Is MSForms.SpinButton Then GoTo suite
      If TypeOf ctl Is MSForms.Image Then GoTo suite
      ctl.Font.Size = ctl.Font.Size * ratioH
suite:
   Next
End Sub
mon code
VB:
Private Sub UserForm_Initialize()
    Dim ctl As Control, ratioW#, ratioH#, wstate&
    With Application: wstate = .WindowState: .WindowState = xlMaximized:
        ratioW = Application.Width / Me.Width
        ratioH = Application.Height / Me.Height
        .WindowState = wstate
    End With
    With Me
        .StartUpPosition = 0: .Left = 0: .Top = 0
        .Width = (.Width * ratioW) - (.Width - .InsideWidth)
        .Height = (.Height * ratioH) - (.Height - .InsideHeight) + (.Width - .InsideWidth)
    End With
    For Each ctl In Me.Controls
        ctl.Move ctl.Left * ratioW, ctl.Top * ratioH, ctl.Width * ratioW, ctl.Height * ratioH
        Select Case TypeName(ctl)
        Case "TextBox", "Label", "Frame", "CommandButton", "MultiPage", "ListBox", "ComboBox", "CheckBox", "OptionButton"
            ctl.Font.Size = ctl.Font.Size * ratioH
        End Select
    Next

End Sub

c'est donc si obscure que cela ??? ;)

et je dirais même que dans cet exemple il manque quelque chose (je parle du mien bien sur) le tiens n’étant absolument pas efficient dans le sens ou comme il n'y a pas de surveillance app il est donc nul et non avenu dans un contexte de full screen
je te laisse un moment pour deviner ce qui manque
je l'ai déjà donné dans une autre discussion

pour répondre a jmfmarques
si on peut le faire dans le initialyse
on le fait bien en mode edition avant pourquoi ne pourrait on pas le faire ;)
je te fait un exemple avec les defauts pour le tiens et ce qui manque au mien puis un avec la correction je reviens tout a l'heure et j'explique
Magistrale démonstration. N'ayant pas ton niveau, dans ma petite tête, étant donné que généralement on travaille sur Excel en plein écran (non en mode fenêtre), mon code (qui n'est pas exactement le mien, sauf la fin du code) répondait bien à mon attente --> avoir userform qui occupe tout l'espace de l'application d'où implicitement tout l'écran (illusion d'optique:p).
J'ai bien dis que je préférais le tien au moins. Tu me poses une colle à laquelle je crois ne pas avoir les bagages requis pour y répondre (ce qui manque à ton code). Je donne ma langue au chat.
 

jmfmarques

XLDnaute Accro
pour répondre a jmfmarques
si on peut le faire dans le initialyse
J'insiste et n'insisterai jamais assez en ce qui concerne cet aspect.
NON
et ce n'est pas le fait que cela "puisse" passer de temps à autre qui en changera le fondement.
Ne JAMAIS traiter les éléments graphiques contenus dans un userform lors de l'évènement initialize.
Ne pas observer cette discipline, c'est jouer à la roulette russe.
Ceci étant dit : d'aucuns pourraient aimer le jeu de la roulette russe et les risques induits. Libre à eux de le faire.
J'invite les plus sages à ne jamais jouer à ce jeu-là. :rolleyes:
 

patricktoulon

XLDnaute Barbatruc
re
ce qui manque je l'ai mis dans patricktoulon2
et encore ca n'est pas complètement sécurisé
je cherche depuis des années a créer un code qui ne soit pas une usine a gaz je n'ai toujours pas réussi a faire quelque chose d'absolu
il faudrait que je m'y remette
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 153
Membres
103 136
dernier inscrit
Zoulander