Capturer et imprimer ou exporter en pdf un userform

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 !

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
la petite sœur de cette astuce
ici on va capturer le userform et l'imprimer ou l'exporter en pdf en pleine page
quelque soit la taille de l'userform comme sa petite soeur le zoom augmenter ou réducteur est automatique en fonction du format A4
en effet la fonction native printForm impose une limite de taille
donc pour imprimer pleine page quelque soit la taille il faut astuce
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'Fonction pour imprimer ou exporter la capture d'un userform en pleine page
'quelque soit sa taille
'auteur: patricktoulon
'version : 1.2
'date version 23/07/2025
'cette fonction est faite pour palier au problème
'des userforms en grande taille (la fonction printForm imposant une limite de taille)
'*************************************************
'exemple d 'appel dans un userform a l'aide d'un bouton
''Un bouton dans le userform
'Private Sub CommandButton1_Click()
 ' Exemple impression directe
     'ImprimerUserFormZoomé Me, , True

    ' Exemple export PDF sur le bureau
    'Call ImprimerUserFormZoomé(UserForm1, "C:\Temp\Formulaire.pdf", False)
'End Sub
'**************************************************

Public Function ImprimerUserFormZoomé(uf As Object, Optional nomFichierPDF As String = "", Optional imprimer As Boolean = False) As Boolean
    Dim fichier As String, ws As Worksheet
    Dim shp As Shape, RnG As Range
    Dim Zoom As Long, width_papier As Double, height_papier As Double
    Const margeSecurite As Double = 0.88
    Dim wRatio As Double, hRatio As Double, dw As Double

    On Error GoTo finErr

    ' Détermine le chemin du PDF si non fourni
    If nomFichierPDF = "" Then
        fichier = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\UserFormCapture.pdf"
    Else
        fichier = nomFichierPDF
    End If

    ' Capture de l'écran active (le UserForm)
    'uf.SetFocus'n'existe pas en vba
    Application.SendKeys "%{1068}"
    Application.SendKeys ""
    DoEvents
    Application.SendKeys "{NUMLOCK}"
    DoEvents

    ' Cache le formulaire
    uf.Hide

    ' Nouvelle feuille temporaire
    Set ws = Sheets.Add
    ws.Range("A1").Select
    ws.Paste
    Set shp = ws.Shapes(ws.Shapes.Count)

    ' Aligne l’image sur A1
    shp.Top = ws.Range("A1").Top
    shp.Left = ws.Range("A1").Left

    ' Calcule la plage couverte
    Set RnG = ws.Range("A1", shp.BottomRightCell)

    ' Corrige largeur colonne pour adapter à la taille du Shape
    With RnG
        dw = shp.Width / .Width
        .ColumnWidth = .ColumnWidth * dw
    End With

    ' Orientation & dimensions papier
    If shp.Width > shp.Height Then
        ws.PageSetup.Orientation = xlLandscape
        width_papier = Application.CentimetersToPoints(29.7)
        height_papier = Application.CentimetersToPoints(21)
    Else
        ws.PageSetup.Orientation = xlPortrait
        width_papier = Application.CentimetersToPoints(21)
        height_papier = Application.CentimetersToPoints(29.7)
    End If

    ' Calcul du Zoom à appliquer
    wRatio = width_papier / shp.Width
    hRatio = height_papier / shp.Height
    Zoom = Int(Application.Min(wRatio, hRatio) * 100 * margeSecurite)
    If Zoom > 400 Then Zoom = 400
    If Zoom < 10 Then Zoom = 10

    ' Configuration de l'impression
    With ws.PageSetup
        .PrintArea = RnG.Address
        .Zoom = Zoom
        .LeftMargin = 0
        .RightMargin = 0
        .TopMargin = 0
        .BottomMargin = 0
        .HeaderMargin = 0
        .FooterMargin = 0
        .CenterHorizontally = True
        .CenterVertically = True
    End With

    ' Supprime PDF existant si présent
    If Not imprimer Then
        If Len(Dir(fichier)) > 0 Then Kill fichier
    End If

    ' Impression ou export
    If imprimer Then
        ws.PrintOut
    Else
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=fichier, Quality:=xlQualityStandard, OpenAfterPublish:=True
    End If

    ImprimerUserFormZoomé = True

finClean:
    ' Nettoyage
    Application.DisplayAlerts = False
    On Error Resume Next
    ws.Delete
    Application.DisplayAlerts = True
    uf.Show
    Exit Function

finErr:
   MsgBox "Une erreur est survenue pendant l'impression ou l'export du UserForm.", vbExclamation
   ImprimerUserFormZoomé = False
    Resume finClean
End Function
Patrick
 
Bonsoir a tous
apres divers tests j'ai pris la decision de changer de méthode
je vous propose donc cette nouvelle methode (plus sur ,plus propre)
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'Fonction pour imprimer ou exporter la capture d'un userform en pleine page
'quelque soit sa taille
'auteur: patricktoulon
'version 4.0
'
'préambule
'Dans cette Version 4.0,
' on ne s'occupe plus du Zoom d'impression on en a plus besoin ( Ni celui de la feuille d'ailleurs )
' on ne s'ocupe plus des saut de pages on en a plus besoin( car il n'y en a plus )
' on utilisera les fonctions natives d'impression dans le pagesetup

'Dans ce nouveau principe :
'1°     Nous allons créer une feuille
'
'2°     Dans cette feuille nous allons considérer une plage au même ratio que le format A4
'       La formule est simple  la plage sera   A1.resize( 29.7/hauteur de A1 , 21/largeur de A1)
'       Bien sur on inverse selon l'userform si il est plus haut que large(orientation)

'3°     Determiner le page setup  avec l'adress de la plage
'       Mettre toute les margeS à zero ainsi que le header et footer
'       On va utiliser les deux fit...
'       On maitrise la couleur qui est une option
'       Et on centre
'
'4°     On colle la capture
'
'5°     On dimensionne et centre la shape en fonction de la plage et du pourcentage demandé
'
'6°     Option de destination destination
'       En fichier pdf
'       Apercu avant  impression
'       Impression
'
'La fonction
'         Arguments
'                  uf As Object                                     'pour l'object userform
'                  Optional nomFichierPDF As String = ""            'chemin pour la sortie en  pdf
'                  Optional BlackAndWhite As Boolean = False        'en couleur ou noir et blanc
'                  Optional percentpage As Double = 100             'pourcentage de 0 à 100 de la page pour  la capture
'                  Optional lpreview As Boolean = False) As Boolean 'apercu avant impression



#If VBA7 Then
    Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#Else
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#End If

Sub snapshotForm()
    keybd_event &H12, 0, 0, 0
    keybd_event &H2C, 0, 0, 0
    keybd_event &H2C, 0, &H2, 0
    keybd_event &H12, 0, &H2, 0
    DoEvents
End Sub

Public Function PrintFormX( _
                           uf As Object, _
                           Optional nomFichierPDF As String = "", _
                           Optional BlackAndWhite As Boolean = False, _
                           Optional percentpage As Double = 100, _
                           Optional lpreview As Boolean = False) As Boolean
 
    Dim ws As Worksheet, shp As Shape, RnG As Range, w#, H#
 
    snapshotForm 'CAPTURE
    uf.Hide
 
    Set ws = Sheets.Add
    DoEvents
 
    'determine la largeur en point pour le format A4 et l'orientation
    If uf.Width > uf.Height Then
        ws.PageSetup.Orientation = xlLandscape
        w = Application.CentimetersToPoints(29.7)
        H = Application.CentimetersToPoints(21)
    Else
        ws.PageSetup.Orientation = xlPortrait
        w = Application.CentimetersToPoints(21)
        H = Application.CentimetersToPoints(29.7)
    End If
 
    'creation d'une plage(Rng) au ratio A4 directement!!!!!!!!
    Set RnG = ws.[A1].Resize(H / ws.[A1].Height, w / ws.[A1].Width)
 
    'le page setup on met tout a zero(marge et header),on centre et on fit tout simplement
    With ws.PageSetup
        .PaperSize = xlPaperA4
        .PrintArea = RnG.Address
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .LeftMargin = 0
        .RightMargin = 0
        .TopMargin = 0
        .BottomMargin = 0
        .HeaderMargin = 0
        .FooterMargin = 0
        .Zoom = False 'pas de zoom
        .CenterHorizontally = True
        .CenterVertically = True
        .BlackAndWhite = BlackAndWhite
    End With
 
    'on colle la capture
    ws.Paste
 
    'on place et dimentionne la shape(capture)
    With ws.Shapes(1)
        .Width = RnG.Width * (percentpage / 100)
        If .Height > RnG.Height Then .Height = RnG.Height * (percentpage / 100)
        .Left = (RnG.Width - .Width) / 2
        .Top = (RnG.Height - .Height) / 2
    End With
 
    'JUSTE pour la demo on affiche le mode avec saut de page
    'ActiveWindow.View = xlPageBreakPreview
 
    'destination
    If nomFichierPDF <> "" Then
        'en pdf
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=nomFichierPDF, Quality:=xlQualityStandard, _
                                                  IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
    Else
        'si preview demandé
        If lpreview Then
            ws.PrintPreview
        Else
            'sinon on imprime tout court
            ws.PrintOut
        End If
    End If
 
    'on supprime la feuille on en a plus besoin
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = False
    uf.Show 0
 
End Function
 
Dernière édition:
Bonsoir a tous
apres divers tests j'ai pris la decision de changer de méthode
je vous propose donc cette nouvelle methode (plus sur ,plus propre)
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'Fonction pour imprimer ou exporter la capture d'un userform en pleine page
'quelque soit sa taille
'auteur: patricktoulon
'version 4.0
'
'préambule
'Dans cette Version 4.0,
' on ne s'occupe plus du Zoom d'impression on en a plus besoin ( Ni celui de la feuille d'ailleurs )
' on ne s'ocupe plus des saut de pages on en a plus besoin( car il n'y en a plus )
' on utilisera les fonctions natives d'impression dans le pagesetup

'Dans ce nouveau principe :
'1°     Nous allons créer une feuille
'
'2°     Dans cette feuille nous allons considérer une plage au même ratio que le format A4
'       La formule est simple  la plage sera   A1.resize( 29.7/hauteur de A1 , 21/largeur de A1)
'       Bien sur on inverse selon l'userform si il est plus haut que large(orientation)

'3°     Determiner le page setup  avec l'adress de la plage
'       Mettre toute les margeS à zero ainsi que le header et footer
'       On va utiliser les deux fit...
'       On maitrise la couleur qui est une option
'       Et on centre
'
'4°     On colle la capture
'
'5°     On dimensionne et centre la shape en fonction de la plage et du pourcentage demandé
'
'6°     Option de destination destination
'       En fichier pdf
'       Apercu avant  impression
'       Impression
'
'La fonction
'         Arguments
'                  uf As Object                                     'pour l'object userform
'                  Optional nomFichierPDF As String = ""            'chemin pour la sortie en  pdf
'                  Optional BlackAndWhite As Boolean = False        'en couleur ou noir et blanc
'                  Optional percentpage As Double = 100             'pourcentage de 0 à 100 de la page pour  la capture
'                  Optional lpreview As Boolean = False) As Boolean 'apercu avant impression



#If VBA7 Then
    Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#Else
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
#End If

Sub snapshotForm()
    keybd_event &H12, 0, 0, 0
    keybd_event &H2C, 0, 0, 0
    keybd_event &H2C, 0, &H2, 0
    keybd_event &H12, 0, &H2, 0
    DoEvents
End Sub

Public Function PrintFormX( _
                           uf As Object, _
                           Optional nomFichierPDF As String = "", _
                           Optional BlackAndWhite As Boolean = False, _
                           Optional percentpage As Double = 100, _
                           Optional lpreview As Boolean = False) As Boolean
 
    Dim ws As Worksheet, shp As Shape, RnG As Range, w#, H#
 
    snapshotForm 'CAPTURE
    uf.Hide
 
    Set ws = Sheets.Add
    DoEvents
 
    'determine la largeur en point pour le format A4 et l'orientation
    If uf.Width > uf.Height Then
        ws.PageSetup.Orientation = xlLandscape
        w = Application.CentimetersToPoints(29.7)
        H = Application.CentimetersToPoints(21)
    Else
        ws.PageSetup.Orientation = xlPortrait
        w = Application.CentimetersToPoints(21)
        H = Application.CentimetersToPoints(29.7)
    End If
 
    'creation d'une plage(Rng) au ratio A4 directement!!!!!!!!
    Set RnG = ws.[A1].Resize(H / ws.[A1].Height, w / ws.[A1].Width)
 
    'le page setup on met tout a zero(marge et header),on centre et on fit tout simplement
    With ws.PageSetup
        .PaperSize = xlPaperA4
        .PrintArea = RnG.Address
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .LeftMargin = 0
        .RightMargin = 0
        .TopMargin = 0
        .BottomMargin = 0
        .HeaderMargin = 0
        .FooterMargin = 0
        .Zoom = False 'pas de zoom
        .CenterHorizontally = True
        .CenterVertically = True
        .BlackAndWhite = BlackAndWhite
    End With
 
    'on colle la capture
    ws.Paste
 
    'on place et dimentionne la shape(capture)
    With ws.Shapes(1)
        .Width = RnG.Width * (percentpage / 100)
        If .Height > RnG.Height Then .Height = RnG.Height * (percentpage / 100)
        .Left = (RnG.Width - .Width) / 2
        .Top = (RnG.Height - .Height) / 2
    End With
 
    'JUSTE pour la demo on affiche le mode avec saut de page
    'ActiveWindow.View = xlPageBreakPreview
 
    'destination
    If nomFichierPDF <> "" Then
        'en pdf
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=nomFichierPDF, Quality:=xlQualityStandard, _
                                                  IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
    Else
        'si preview demandé
        If lpreview Then
            ws.PrintPreview
        Else
            'sinon on imprime tout court
            ws.PrintOut
        End If
    End If
 
    'on supprime la feuille on en a plus besoin
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = False
    uf.Show 0
 
End Function
bien évidemment un fichier test avec 3 userform de tailles et ratios différents
bonjour je viens de regarder la piece jointe mais celle ci est vide
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

Discussions similaires

  • Question Question
XL pour MAC Export pdf
Réponses
0
Affichages
687
Retour