XL 2021 Savez-vous planter les choux ?

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Constantin

XLDnaute Occasionnel
Supporter XLD
Bonjour à tous,
A la demande d'aspsy et sur les conseils de sylvanu, j'ai repris un fichier pour le compléter façon jardinier.
J'ai ainsi ajouté (partiellement) , dans la BaseJM, l'Oca du Pérou (travail en cours)
- Problème 1 : Je n'arrive pas à importer la photo de l'Oca dans le rapport. J'ai vu que JM27 avait expliqué comment faire mais, comme à mon habitude, je n'ai pas réussi.(explications trop succinctes pour un balbutiant comme moi)
- Problème 2 : L'affichage du (des) tableaux mentionnent "Réalisation:Jean-Marcel.H"=JM27 d'XLD ?). J'aimerai placer cette annotation dans un endroit qui ne gêne pas mais je suis incapable de le voir dans l'UserForm.

Je numérote les problèmes parce qu'il y en aura d'autres à venir...
Bien à vous,
 

Pièces jointes

Solution
@cathodique
Effectivement je pense que ma version ( qui est la dernière) n'est pas compatible avec la tienne.
j'ai bien vu que tu n'as pas effacé le nom de l'auteur mais que tu as traité différemment.
Attention Constantin : ce message s'adresse à Cathodique.😀
ne viens donc pas le parasité.
re
ne pas en vouloir à cathodique il a fait confiance en chat gpt
et les modifs de chatgpt sont stupéfiantes tellement c'est stupide
c'est incroyable comme chatgpt a tricoté mon code simple ou il fallait seulement ajouter les déclaration 64 en un truc sans nom

je suis estomaqué

allez
je vous donne le vieux machin pour ceux pour qui ca pesent trop de devoir se depatouiller avec les déclarations d'api
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'                            Module RESIZER  userform version basic
'version  avec api en macro 4
'release 2020  for XLD
'****************************************************************************************************
Option Explicit

Dim OldW#, OldH#
Sub trois_boutons1() 'ajoute les 3 boutons et le resize dynamique à l'userform
    Dim hWnd&
    hWnd = ExecuteExcel4Macro("CALL(""user32"",""GetActiveWindow"",""JCC"")") 'api GetActiveWindow
    ExecuteExcel4Macro ("CALL(""user32"",""SetWindowLongA"",""JJJJJ""," & hWnd & ", " & -16 & ", " & &H94CF0080 & ")") 'api SetWindowLongA
End Sub
Sub NoTitleBar1() 'supprime la barre de titre( rempli absolument tout l'ecran
    Dim hWnd&
    hWnd = ExecuteExcel4Macro("CALL(""user32"",""GetActiveWindow"",""JCC"")") 'api GetActiveWindow
    ExecuteExcel4Macro ("CALL(""user32"",""SetWindowLongA"",""JJJJJ""," & hWnd & ", " & -16 & ", " & &H140F0101 ")") 'api SetWindowLongA
End Sub

Sub UsfFullScreen1() 'met le userform en plein ecran
    Dim hWnd&
    hWnd = ExecuteExcel4Macro("CALL(""user32"",""GetActiveWindow"",""JCC"")") 'api GetActiveWindow
    ExecuteExcel4Macro ("CALL(""user32"",""ShowWindow"",""JJJ""," & hWnd & ", 3)") 'api SetWindowLongA
End Sub

Sub memoControlSize1(usf) 'on memorise dans le tag des controls leur position et dimension
    Dim CtrL
    OldW = usf.Width
    OldH = usf.Height
    For Each CtrL In usf.Controls
        CtrL.Tag = CtrL.Left & ";" & CtrL.Top & ";" & CtrL.Width & ";" & CtrL.Height
        On Error Resume Next
        CtrL.Tag = CtrL.Tag & ";" & CtrL.Font.Size
        CtrL.Tag = CtrL.Tag & ";"
        Err.Clear: On Error GoTo 0
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            CtrL.Tag = CtrL.Tag & ";" & Replace(CtrL.ColumnWidths, ";", "|")
        End If
        CtrL.Tag = CtrL.Tag & ";"
    Next
End Sub

Sub resiZer1(usf)
    Dim newW#, NewH#, t, cw$, tc, CtrL, i&
    newW = usf.Width / OldW
    NewH = usf.Height / OldH
    For Each CtrL In usf.Controls
        t = Split(CtrL.Tag, ";")
        CtrL.Move t(0) * newW, t(1) * NewH, t(2) * newW, t(3) * NewH
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            If CtrL.ColumnWidths = "" Then cw = Application.Rept("80", CtrL.ColumnCount) Else cw = CtrL.ColumnWidths
            tc = Split(t(6), "|")
            For i = 0 To UBound(tc): tc(i) = Val(tc(i)) * Application.Min(newW, NewH): Next
            CtrL.ColumnWidths = Join(tc, ";")
        End If
        On Error Resume Next
        CtrL.Font.Size = t(4) * Application.Min(newW, NewH)
        Err.Clear: On Error GoTo 0
    Next
End Sub

et maintenat le même exactement avec les api déclarées en bon et due forme
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'                            Module RESIZER  userform version basic
'version  avec api déclarées
'release 2020  for XLD
'****************************************************************************************************

Option Explicit

#If VBA7 Then
    #If Win64 Then
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" ( _
                              ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #Else
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" ( _
                              ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #End If
   
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                              ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
   
    Public Declare PtrSafe Function ShowWindow Lib "user32" ( _
                              ByVal hWnd As LongPtr, ByVal nCmdShow As Long) As Long
   
    Public Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
   
#Else
    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 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 GetActiveWindow Lib "user32" () As Long
   
#End If

Dim OldW#, OldH#

Sub trois_boutons() 'ajoute les 3 boutons et le resize dynamique à l'userform
    Dim hWnd&
    hWnd = GetActiveWindow
    SetWindowLongPtr hWnd, -16, &H94CF0080 'api SetWindowLongA
End Sub

Sub NoTitleBar() 'supprime la barre de titre( rempli absolument tout l'ecran
    Dim hWnd&
    hWnd = GetActiveWindow
    SetWindowLongPtr hWnd, -16, &H140F0101
End Sub

Sub SameSizeApplication(usf) 'taille et position identique à l'application
    With Application
        usf.Move .Left, .Top, .Width, .Height
    End With
End Sub

Sub UsfFullScreen() 'met le userform en plein ecran
    Dim hWnd&
    hWnd = GetActiveWindow
    ShowWindow hWnd, 3
End Sub

Sub memoControlSize(usf) 'on memorise dans le tag des controls leur position et dimension
    Dim CtrL
    OldW = usf.Width
    OldH = usf.Height
    For Each CtrL In usf.Controls
        CtrL.Tag = CtrL.Left & ";" & CtrL.Top & ";" & CtrL.Width & ";" & CtrL.Height
        On Error Resume Next
        CtrL.Tag = CtrL.Tag & ";" & CtrL.Font.Size
        CtrL.Tag = CtrL.Tag & ";"
        Err.Clear: On Error GoTo 0
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            CtrL.Tag = CtrL.Tag & ";" & Replace(CtrL.ColumnWidths, ";", "|")
        End If
        CtrL.Tag = CtrL.Tag & ";"
    Next
End Sub

Sub resiZer(usf)
    Dim newW#, NewH#, t, cw$, tc, CtrL, i&
    newW = usf.Width / OldW
    NewH = usf.Height / OldH
    For Each CtrL In usf.Controls
        t = Split(CtrL.Tag, ";")
        CtrL.Move t(0) * newW, t(1) * NewH, t(2) * newW, t(3) * NewH
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            If CtrL.ColumnWidths = "" Then cw = Application.Rept("80", CtrL.ColumnCount) Else cw = CtrL.ColumnWidths
            tc = Split(t(6), "|")
            For i = 0 To UBound(tc): tc(i) = Val(tc(i)) * Application.Min(newW, NewH): Next
            CtrL.ColumnWidths = Join(tc, ";")
        End If
        On Error Resume Next
        CtrL.Font.Size = t(4) * Application.Min(newW, NewH)
        Err.Clear: On Error GoTo 0
    Next
End Sub

voila le resize est tout totomatic
vous pouvez tester avec ce classeur il y a 3 userform exemples

l'userform1 utilisera le module avec la methode par les macro4(plein ecran, les trois boutons dans la barre de titre et la taskbar est visible)
l'userform2 utilisera le module avec api déclarées(plein ecran, pas de barre de titre, pas de taskbar(il couvre absolument tout l'ecran)
l'userform3 utilisera le module api déclarées(couvre l'application ,pas de barre de titre )

un peu d'humour
@Nain porte quoi
non on ca plait au nazes
division par zéro sur cette ligne:
newW = usf.Width / OldW
pour userform2 et userform3 (sur excel 2010)
 
Voilà, encore un qui pense avoir les poumons plus oxygénés que les autres.
??? 😳
Je ne comprend pas la pique, ma réflexion n'était pas contre vous mais envers le "chat qui pète" qui a tendance à raconter un peu beaucoup n'importe quoi (une preuve de plus dans ce fil) et qui a encore pas mal de boulot pour arriver à pondre un truc cohérent.
Je ne me permettrait pas de critiquer le travail de qui que ce soit
 
Salut,
il y a deux soucis avec le code du post #29
1 - Les Excel 64 bits n'ont pas l'air d'aimer les Dim hWnd& . Avec des dim hWnd cela fonctionne
2 - Excel 2010 est strict sur les columnwidths des ListBox il faut indiquer l'unité : ex "10;10" ne passe pas il faut par exemple "10 pt; 10 pt" ( c'est Roger Murdock, interprété par Kareem Abdul-Jabbar) qui m'a soufflé cela.
Nullosse
 
oui appelle appelle resizer1 a la place de resizer dans le userform1
Pour afficher ce contenu, nous aurons besoin de votre consentement pour définir des cookies tiers.
Pour plus d'informations, consultez notre page sur les cookies.
Je te remercie pour ta magistrale démonstration.
J'ai bien vu que sur ta machine tout fonctionne bien.
Pour la division par zéro, j'ai mis ceci dans le formulaire et je n'ai plus eu la division par zéro.
VB:
Private Sub UserForm_Initialize()
'code pour userform2
    memoControlSize Me
End Sub

Private Sub UserForm_Activate()
    Static done As Boolean
    If done Then Exit Sub
    done = True

    NoTitleBar
    UsfFullScreen
End Sub

Private Sub UserForm_Resize()
    resiZer Me
End Sub

Merci beaucoup pour tous tes conseils. Depuis que je tourne sur excel2010, j'en suis tombé amoureux.
Merci aussi pour ton partage gracieux de tes connaissances qui n'est pas le cas de tout le monde.

Bonne fin de journée.
 
Et si vous ouvriez une nouvelle discussion entre vous ?
2026-02-24_18-16-54.png
 
re
@nullosse
oui tu a peut être raison les dim avec "&" pour long sont forcement faux pour le 64 par contre je suis étonné que le non typé donc variant fonctionne puisque les déclarations attendent un longptr en vba 7
pour ce cw(columnwidths) je n'avais jamais entendu parler de ça mais soit
voici donc le code corrigé en conséquence
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'                            Module RESIZER  userform version basic
'version  avec api déclarées
'release 2020  for XLD
'****************************************************************************************************

Option Explicit

#If VBA7 Then
    #If Win64 Then
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" ( _
                              ByVal Hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #Else
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" ( _
                              ByVal Hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #End If
   
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                              ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
   
    Public Declare PtrSafe Function ShowWindow Lib "user32" ( _
                              ByVal Hwnd As LongPtr, ByVal nCmdShow As Long) As Long
   
    Public Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
   
#Else
    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 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 GetActiveWindow Lib "user32" () As Long
   
#End If
#If VBA7 Then
    Dim Hwnd As LongPtr
#Else
    Dim Hwnd As Long
#End If
Dim OldW#, OldH#

Sub trois_boutons() 'ajoute les 3 boutons et le resize dynamique à l'userform
    Hwnd = GetActiveWindow
    SetWindowLongPtr Hwnd, -16, &H94CF0080 'api SetWindowLongA
End Sub

Sub NoTitleBar() 'supprime la barre de titre( rempli absolument tout l'ecran
    Hwnd = GetActiveWindow
    SetWindowLongPtr Hwnd, -16, &H140F0101
End Sub


Sub SameSizeApplication(usf) 'taille et position identique à l'application
    With Application
        usf.Move .Left, .Top, .Width, .Height
    End With
End Sub

Sub UsfFullScreen() 'met le userform en plein ecran
    Hwnd = GetActiveWindow
    ShowWindow Hwnd, 3
End Sub

Sub memoControlSize(usf) 'on memorise dans le tag des controls leur position et dimension
    Dim CtrL
    OldW = usf.Width
    OldH = usf.Height
    For Each CtrL In usf.Controls
        CtrL.Tag = CtrL.Left & ";" & CtrL.Top & ";" & CtrL.Width & ";" & CtrL.Height
        On Error Resume Next
        CtrL.Tag = CtrL.Tag & ";" & CtrL.Font.Size
        CtrL.Tag = CtrL.Tag & ";"
        Err.Clear: On Error GoTo 0
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            CtrL.Tag = CtrL.Tag & ";" & Replace(CtrL.ColumnWidths, ";", "|")
        End If
        CtrL.Tag = CtrL.Tag & ";"
    Next
End Sub

Sub resiZer(usf)
    Dim newW#, NewH#, t, cw$, tc, CtrL, i&
    newW = usf.Width / OldW
    NewH = usf.Height / OldH
    For Each CtrL In usf.Controls
        t = Split(CtrL.Tag, ";")
        CtrL.Move t(0) * newW, t(1) * NewH, t(2) * newW, t(3) * NewH
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            If CtrL.ColumnWidths = "" Then
                cw = Application.Rept("80 ", CtrL.ColumnCount)
                cw = Replace(Trim(cw), " ", " pt;")
               t(6) = cw
               'Else: cw = CtrL.ColumnWidths
            End If
            tc = Split(t(6), "|")
            For i = 0 To UBound(tc): tc(i) = Val(tc(i)) * Application.Min(newW, NewH): Next
            CtrL.ColumnWidths = Join(tc, " pt;")
            'MsgBox CtrL.ColumnWidths
        End If
        On Error Resume Next
        CtrL.Font.Size = t(4) * Application.Min(newW, NewH)
        Err.Clear: On Error GoTo 0
    Next
End Sub
@Constantin
j'avoue ne pas comprendre ton comportement
tu a des pointures qui sont intervenus dans ta demande
au lieu de te braquer tu pourrais peut être en prendre
 
re
@nullosse
oui tu a peut être raison les dim avec "&" pour long sont forcement faux pour le 64 par contre je suis étonné que le non typé donc variant fonctionne puisque les déclarations attendent un longptr en vba 7
pour ce cw(columnwidths) je n'avais jamais entendu parler de ça mais soit
voici donc le code corrigé en conséquence
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'                            Module RESIZER  userform version basic
'version  avec api déclarées
'release 2020  for XLD
'****************************************************************************************************

Option Explicit

#If VBA7 Then
    #If Win64 Then
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" ( _
                              ByVal Hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #Else
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" ( _
                              ByVal Hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #End If
 
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                              ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
 
    Public Declare PtrSafe Function ShowWindow Lib "user32" ( _
                              ByVal Hwnd As LongPtr, ByVal nCmdShow As Long) As Long
 
    Public Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
 
#Else
    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 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 GetActiveWindow Lib "user32" () As Long
 
#End If
#If VBA7 Then
    Dim Hwnd As LongPtr
#Else
    Dim Hwnd As Long
#End If
Dim OldW#, OldH#

Sub trois_boutons() 'ajoute les 3 boutons et le resize dynamique à l'userform
    Hwnd = GetActiveWindow
    SetWindowLongPtr Hwnd, -16, &H94CF0080 'api SetWindowLongA
End Sub

Sub NoTitleBar() 'supprime la barre de titre( rempli absolument tout l'ecran
    Hwnd = GetActiveWindow
    SetWindowLongPtr Hwnd, -16, &H140F0101
End Sub


Sub SameSizeApplication(usf) 'taille et position identique à l'application
    With Application
        usf.Move .Left, .Top, .Width, .Height
    End With
End Sub

Sub UsfFullScreen() 'met le userform en plein ecran
    Hwnd = GetActiveWindow
    ShowWindow Hwnd, 3
End Sub

Sub memoControlSize(usf) 'on memorise dans le tag des controls leur position et dimension
    Dim CtrL
    OldW = usf.Width
    OldH = usf.Height
    For Each CtrL In usf.Controls
        CtrL.Tag = CtrL.Left & ";" & CtrL.Top & ";" & CtrL.Width & ";" & CtrL.Height
        On Error Resume Next
        CtrL.Tag = CtrL.Tag & ";" & CtrL.Font.Size
        CtrL.Tag = CtrL.Tag & ";"
        Err.Clear: On Error GoTo 0
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            CtrL.Tag = CtrL.Tag & ";" & Replace(CtrL.ColumnWidths, ";", "|")
        End If
        CtrL.Tag = CtrL.Tag & ";"
    Next
End Sub

Sub resiZer(usf)
    Dim newW#, NewH#, t, cw$, tc, CtrL, i&
    newW = usf.Width / OldW
    NewH = usf.Height / OldH
    For Each CtrL In usf.Controls
        t = Split(CtrL.Tag, ";")
        CtrL.Move t(0) * newW, t(1) * NewH, t(2) * newW, t(3) * NewH
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            If CtrL.ColumnWidths = "" Then
                cw = Application.Rept("80 ", CtrL.ColumnCount)
                cw = Replace(Trim(cw), " ", " pt;")
               t(6) = cw
               'Else: cw = CtrL.ColumnWidths
            End If
            tc = Split(t(6), "|")
            For i = 0 To UBound(tc): tc(i) = Val(tc(i)) * Application.Min(newW, NewH): Next
            CtrL.ColumnWidths = Join(tc, " pt;")
            'MsgBox CtrL.ColumnWidths
        End If
        On Error Resume Next
        CtrL.Font.Size = t(4) * Application.Min(newW, NewH)
        Err.Clear: On Error GoTo 0
    Next
End Sub
Bon pour le columnwiths l'I.A a encore raconté des bêtises. J'ai pu essayé le code avec un excel 2010 : le problème c'est pas l'absence d'unités mais c'est que excel 2010 n'aime pas les décimales dans le columnwidths des ListBox. Avec ce code cela fonctionne avec un excel 2010 :
VB:
            tc = Split(t(6), "|")
            For i = 0 To UBound(tc): tc(i) = Int(Val(tc(i)) * Application.Min(newW, NewH)): Next
            CtrL.ColumnWidths = Join(tc, ";")
je prends que la partie entière. A mettre dans les deux modules d'API
Il y a aussi le problème de division par zéro résolu par le code de cathodique. Cela est du à ça :
À partir d’Excel 2013/2016, Microsoft a modifié la gestion interne des fenêtres (UserForms inclus).Résultat :
  • Le UserForm est entièrement affiché avant que certains événements ne soient envoyés.
  • L’événement Resize n’est plus déclenché pendant la phase de préparation de la fenêtre.
  • L’ordre des événements est devenu plus logique et plus stable.
En Excel 2013/2016, l’ordre typique est :
Initialize
Activate
Resize (seulement si la taille change réellement)

Alors qu’en Excel 2010 (et 2007), l’ordre est souvent :
Initialize
Resize (1 à plusieurs fois)
Activate



Et pour Constantin qui ne semble pas aimer les interventions, il ne faut pas oublier que c'est lui qui a dit :
Par contre, l'UserForm n'est pas extensible. Je sais que j'ai mis un peu de baratin mais, pour certaines plantes (agrumes par ex.), il faut des tonnes de recommandations. Mais faire de la place à ce Label sans toucher à la taille de l'UserForm me semble compliqué.
Et pour répondre au titre de la discussion :
On les plante avec le doigt
À la mode, à la mode
On les plante avec le doigt
À la mode de chez nous.
😉
 
Dernière édition:
Bonjour,
Je crois que vous avez mal interprété ma dernière remarque...
J'ouvre une discussion, on m'aide à résoudre mon problème, je marque le post de JM27 comme solution, d'ailleurs c'est sa V5 que j'utilise avec plaisir.
Là dessus, plusieurs membres continuent à échanger des messages qui n'ont aucun rapport avec mon questionnement initial. Résultat : tout le monde s'énerve, nain porte quoi devient grossier et je souhaite que ce cirque arrête.
D'où ma proposition d'ouvrir une nouvelle discussion entre vous. Rien de plus...
Bonne journée,
 
Bonjour
je ne suis pas sur de ce que tu dis @nullosse
de toute manière le fullscreen est appliqué en dernier donc normalement l'object userform est dispo
alors peut être le memo dans le initialise je veux bien mais le activate a toujours été en dernier
dans n'importe quels cas j'ai tester dans activate et initialise le memo ca passe
pour info
initialyse evenement classe userform(certain objects ne sont pas dispo)
activate evenement userform tout les object sont dispo

chez moi je n'ai aucun soucis avec 2013 2016 et 2007 dans une virtual
non a mon avis c'est juste une latence
je suis sur que si il met une gestion d'attente ca fonctionne (en tout cas ca ressemble bien a 2010)
d'ailleurs si tu regarde bien ce que chatGpt lui avais proposé l'organigrame est le même sauf que ca passe par des conditions qui ralentissent la chose tout simplement

je suis quasiment sur que si il fait ça ca marche
VB:
Option Explicit

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub UserForm_Activate()
    NoTitleBar
    memoControlSize Me
   Dim t
   t = Timer
   Do While Timer - t < 1: DoEvents: Loop
    UsfFullScreen
    
End Sub

Private Sub UserForm_Resize()
    resiZer Me
End Sub
 
je ne suis pas sur de ce que tu dis @nullosse
Salut patricktoulon,
moi je suis sûr de ce que je dis car j'ai essayé avec un excel 2010 et pour le userform2 et le userform3, l'événement resize arrivait avant l'événement activate.
Avec un code comme celui-ci pour les userform cela semble fonctionner sur toutes les versions :
VB:
Option Explicit

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub UserForm_Activate()
    NoTitleBar
   ' memoControlSize Me
    UsfFullScreen1   
End Sub

Private Sub UserForm_Initialize()
    memoControlSize Me
End Sub

Private Sub UserForm_Resize()
    resiZer Me
End Sub
 
Là dessus, plusieurs membres continuent à échanger des messages qui n'ont aucun rapport avec mon questionnement initial.

@Constantin vous n'avez aucune prise sur ce que peuvent dire ou pas les utilisateurs du forum, s'ils ont envie de continuer à disgresser car ils ont trouvé un sujet qui les intéresse, vous ne pouvez rien y faire, et réagir comme vous le faite en disant "allez voir ailleurs" est mal perçu comme vous avez pu vous en rendre compte.


Résultat : tout le monde s'énerve, nain porte quoi devient grossier et je souhaite que ce cirque arrête.
D'où ma proposition d'ouvrir une nouvelle discussion entre vous. Rien de plus...

Normalement, quand on arrive dans un lieu inconnu on commence par voir comment ça se passe, on prend la température, mais en aucun cas on joue à l'éléphant dans un magasin de porcelaine.

Personnellement, je ne pense pas avoir été grossier, juste j'imageais un ressenti global (partagé il me semble), rien de méchant
langue2.png


Bonne journée à vous aussi
 
bon apres diverses recherches et tests
c'est bel et bien un problème de timming pour office 2010
du coup j'ai revu le truc
1 la mémorisation devient une fonction et donc retourne une valeur
ça permet a vba de s'arrêter tant que le return n'est pas effectif contrairement a une sub​
j'ai même mis une gestion d'attente dans le resizer​

2 effectivement vu que le timing est non syncro getactivewindow peut renvoyer le handle de l'application
du coup on passe par findwindow qui permet de capter le handle même si la fenêtre n'est pas complétement affiché​
alors effectivement on pourrait mettre le memo dans le initialise pour avoir encore plus de temps​
testé sur 2010 en virtual machine donc sans parasite​
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'                            Module RESIZER  userform version basic
'version  avec api déclarées
'release 2020  for XLD
'****************************************************************************************************

Option Explicit

#If VBA7 Then
    #If Win64 Then
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" ( _
                              ByVal Hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #Else
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" ( _
                              ByVal Hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #End If
    
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                              ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    
    Public Declare PtrSafe Function ShowWindow Lib "user32" ( _
                              ByVal Hwnd As LongPtr, ByVal nCmdShow As Long) As Long
    
    Dim Hwnd As LongPtr
#Else
    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 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
    
    
    Dim Hwnd As Long
#End If

Public OldW As Double
Public OldH As Double

Sub trois_boutons(usf) 'ajoute les 3 boutons et le resize dynamique à l'userform
    Hwnd = FindWindow(vbNullString, usf.Caption)
    SetWindowLongPtr Hwnd, -16, &H94CF0080 'api SetWindowLongA
End Sub

Sub NoTitleBar(usf) 'supprime la barre de titre( rempli absolument tout l'ecran
    Hwnd = FindWindow(vbNullString, usf.Caption)
    SetWindowLongPtr Hwnd, -16, &H140F0101
End Sub


Sub SameSizeApplication(usf) 'taille et position identique à l'application
    With Application
        usf.Move .Left, .Top, .Width, .Height
    End With
End Sub

Sub UsfFullScreen(usf) 'met le userform en plein ecran
    Hwnd = FindWindow(vbNullString, usf.Caption)
    ShowWindow Hwnd, 3
End Sub

Function memoControlSize(usf) 'on memorise dans le tag des controls leur position et dimension
    Dim CtrL
    OldW = usf.Width
    OldH = usf.Height
    For Each CtrL In usf.Controls
        CtrL.Tag = CtrL.Left & ";" & CtrL.Top & ";" & CtrL.Width & ";" & CtrL.Height
        On Error Resume Next
        CtrL.Tag = CtrL.Tag & ";" & CtrL.Font.Size
        CtrL.Tag = CtrL.Tag & ";"
        Err.Clear: On Error GoTo 0
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            CtrL.Tag = CtrL.Tag & ";" & Replace(CtrL.ColumnWidths, ";", "|")
        End If
        CtrL.Tag = CtrL.Tag & ";"
    DoEvents
    Next
memoControlSize = OldW > 0
End Function

Sub resiZer(usf)
    Dim newW#, NewH#, t, cw$, tc, CtrL, i&
    Do While OldW = 0: DoEvents: Loop
    newW = usf.Width / OldW
    NewH = usf.Height / OldH
    For Each CtrL In usf.Controls
        t = Split(CtrL.Tag, ";")
        CtrL.Move t(0) * newW, t(1) * NewH, t(2) * newW, t(3) * NewH
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            If CtrL.ColumnWidths = "" Then
                cw = Application.Rept("80 ", CtrL.ColumnCount)
                cw = Replace(cw, " ", "|")
                t(6) = cw
                'Else: cw = CtrL.ColumnWidths
            End If
            tc = Split(t(6), "|")
            For i = 0 To UBound(tc): tc(i) = Int(Val(tc(i)) * Application.Min(newW, NewH)): Next
            CtrL.ColumnWidths = Join(tc, " pt;")
            'MsgBox CtrL.ColumnWidths
        End If
        On Error Resume Next
        CtrL.Font.Size = t(4) * Application.Min(newW, NewH)
        Err.Clear: On Error GoTo 0
    Next
End Sub

dans le userform
VB:
Option Explicit

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub UserForm_Activate()
    ListBox1.List = [A1:B10].Value
    ListBox2.List = [A1:A10].Value
    NoTitleBar Me
    If memoControlSize(Me) Then
        UsfFullScreen Me
    Else
    MsgBox "Il c'est produit un problème lors de la memorisation des positions et dimensions des controls"
    End If
End Sub

Private Sub UserForm_Resize()
    resiZer Me
End Sub
finalement c'est grâce a @cathodique que j'ai compris le truc
j'aurais du même comprendre a la lecture du code fantasmagorique de chatGpt
normalment a gestion d'attente suffisante ca devrait coller pour tout le monde

Patrick


 
bon apres diverses recherches et tests
c'est bel et bien un problème de timming pour office 2010
du coup j'ai revu le truc
1 la mémorisation devient une fonction et donc retourne une valeur
ça permet a vba de s'arrêter tant que le return n'est pas effectif contrairement a une sub​
j'ai même mis une gestion d'attente dans le resizer​

2 effectivement vu que le timing est non syncro getactivewindow peut renvoyer le handle de l'application
du coup on passe par findwindow qui permet de capter le handle même si la fenêtre n'est pas complétement affiché​
alors effectivement on pourrait mettre le memo dans le initialise pour avoir encore plus de temps​
testé sur 2010 en virtual machine donc sans parasite​
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'                            Module RESIZER  userform version basic
'version  avec api déclarées
'release 2020  for XLD
'****************************************************************************************************

Option Explicit

#If VBA7 Then
    #If Win64 Then
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" ( _
                              ByVal Hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #Else
        Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" ( _
                              ByVal Hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    #End If
   
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                              ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
   
    Public Declare PtrSafe Function ShowWindow Lib "user32" ( _
                              ByVal Hwnd As LongPtr, ByVal nCmdShow As Long) As Long
   
    Dim Hwnd As LongPtr
#Else
    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 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
   
   
    Dim Hwnd As Long
#End If

Public OldW As Double
Public OldH As Double

Sub trois_boutons(usf) 'ajoute les 3 boutons et le resize dynamique à l'userform
    Hwnd = FindWindow(vbNullString, usf.Caption)
    SetWindowLongPtr Hwnd, -16, &H94CF0080 'api SetWindowLongA
End Sub

Sub NoTitleBar(usf) 'supprime la barre de titre( rempli absolument tout l'ecran
    Hwnd = FindWindow(vbNullString, usf.Caption)
    SetWindowLongPtr Hwnd, -16, &H140F0101
End Sub


Sub SameSizeApplication(usf) 'taille et position identique à l'application
    With Application
        usf.Move .Left, .Top, .Width, .Height
    End With
End Sub

Sub UsfFullScreen(usf) 'met le userform en plein ecran
    Hwnd = FindWindow(vbNullString, usf.Caption)
    ShowWindow Hwnd, 3
End Sub

Function memoControlSize(usf) 'on memorise dans le tag des controls leur position et dimension
    Dim CtrL
    OldW = usf.Width
    OldH = usf.Height
    For Each CtrL In usf.Controls
        CtrL.Tag = CtrL.Left & ";" & CtrL.Top & ";" & CtrL.Width & ";" & CtrL.Height
        On Error Resume Next
        CtrL.Tag = CtrL.Tag & ";" & CtrL.Font.Size
        CtrL.Tag = CtrL.Tag & ";"
        Err.Clear: On Error GoTo 0
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            CtrL.Tag = CtrL.Tag & ";" & Replace(CtrL.ColumnWidths, ";", "|")
        End If
        CtrL.Tag = CtrL.Tag & ";"
    DoEvents
    Next
memoControlSize = OldW > 0
End Function

Sub resiZer(usf)
    Dim newW#, NewH#, t, cw$, tc, CtrL, i&
    Do While OldW = 0: DoEvents: Loop
    newW = usf.Width / OldW
    NewH = usf.Height / OldH
    For Each CtrL In usf.Controls
        t = Split(CtrL.Tag, ";")
        CtrL.Move t(0) * newW, t(1) * NewH, t(2) * newW, t(3) * NewH
        If TypeName(CtrL) = "ListBox" Or TypeOf CtrL Is ListBox Then
            If CtrL.ColumnWidths = "" Then
                cw = Application.Rept("80 ", CtrL.ColumnCount)
                cw = Replace(cw, " ", "|")
                t(6) = cw
                'Else: cw = CtrL.ColumnWidths
            End If
            tc = Split(t(6), "|")
            For i = 0 To UBound(tc): tc(i) = Int(Val(tc(i)) * Application.Min(newW, NewH)): Next
            CtrL.ColumnWidths = Join(tc, " pt;")
            'MsgBox CtrL.ColumnWidths
        End If
        On Error Resume Next
        CtrL.Font.Size = t(4) * Application.Min(newW, NewH)
        Err.Clear: On Error GoTo 0
    Next
End Sub

dans le userform
VB:
Option Explicit

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub UserForm_Activate()
    ListBox1.List = [A1:B10].Value
    ListBox2.List = [A1:A10].Value
    NoTitleBar Me
    If memoControlSize(Me) Then
        UsfFullScreen Me
    Else
    MsgBox "Il c'est produit un problème lors de la memorisation des positions et dimensions des controls"
    End If
End Sub

Private Sub UserForm_Resize()
    resiZer Me
End Sub
finalement c'est grâce a @cathodique que j'ai compris le truc
j'aurais du même comprendre a la lecture du code fantasmagorique de chatGpt
normalment a gestion d'attente suffisante ca devrait coller pour tout le monde

Patrick


Fonctionne chez toi sur une machine virtuelle.
Mais ne fonctionne pas chez moi Excel 2010 32bits.
constatation:
1 - le formulaire s'affiche mais pas en plein écran (non redimensionné)
2 - au clic sur le commandButtom1, plantage ---> erreur 365: Impossible de décharger dans le contexte.
1772024615773.png

1772024649173.png


Les précédents codes fonctionnement beaucoup mieux sur Excel 2010.
Merci pour ta ténacité. Perso, je suis têtu et ne lâche pas le morceau facilement.
Cependant, je connais mes limites de compétence. Quand ça me dépasse, ça me dépasse un point c'est tout.

Encore Merci.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour