XL 2013 Impression d'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 !

PHV62

XLDnaute Junior
bonjour le forum
je souhaiterai imprimer un userform avec les informations dans les textbox et combobox grace a un bouton

merci d'avance pour votre aide
ph v
 
Je me suis aussi débarrassé du PageSetUp.Zoom en reportant le redimensionnement sur la Shape, ce qui revient au même.
Mais je ne me suis pas débarrassé de la constante de 0.88 et je n'ai pas compris comment ton calcul permet de ne pas y faire référence.
Comment retrouver ce 0.88 ?
 
en fait ce 0.88 était une marge de sécurité car excel ne pourra jamais imprimer bord 0
cette marge de sécurité était pour le zoom (echelle d'impression )

maintenant au lieu de zoomer l'impression je dimensionne une plage arbitraire a 29.7*21 ou l'inverse
quand je colle la capture il ne me reste plus qu'a la redimensionner pour qu'elle rentre dans la page 1 de la feuille
terminé
le problème que on avait avec le zoom d'impression c'est que selon le type xlportrait ou landscape et la taille , la marge ne donnait pas pareil

la comme çà maintenant tout est normalisé une plage --> dimension A4---> colle --> redim de la shape a la page 1 de la zone d'impression
c'est hyper simple comme raisonnement
alors selon la taille la page 1 c'est la plage complet sinon il y a un saut de page automatique d'excel qu'il met par securité il faut donc dimensionner a ce saut de page
mais c'est vrai que c'est capricieux ces histoire de sauts de pages auto là

mais bon on contourne le problème avec élégance comme ça
 
tiens j'ai bloqué l'impression et t'affiche le new sheet en mode affichage des sauts de page tu y verra plus clair
1753630348905.png



1753630387332.png



1753630444368.png


ça peut pas être plus logique
 

Pièces jointes

Alors tu me montres ici que la PrintArea est ajustée à la Shape.
C'est bien, je le fais aussi par un calcul. Pas de souci.

Ton algorithme qui n'utilise pas les 88% donne ça sur un UserFom paysage:
1753640437601.png


Mon algorithme qui utilise les 88% donne ça sur un UserFom paysage:
1753640505395.png


Je me posais toujours la question de savoir ce que représentent ces 88%.
Comme tu l'as très bien dit:
en fait ce 0.88 était une marge de sécurité car excel ne pourra jamais imprimer bord 0
Il semble en effet que ce soit le % utilisable de la page soit 88% de 21x29.7 (si aucune marges).
En appliquant ces 88% à la largeur / hauteur de la page (et non pas au Zoom ou à la Shape) cela correspond parfaitement.
Donc je pense qu'il n'est pas possible de se passer de cette constante de 88% qui est étrangère aux calculs.

Edit: reste à savoir si ce % s'applique à la largeur, à la hauteur ou aux 2.
A priori, je dirais déjà la largeur car si je l'augmente la Shape du UserForm perd ses bordures droites.
Maintenant je vais tester si cela s'applique aussi à la hauteur ou si c'est un % différent.
 
Dernière édition:
J'ai ramé pour ajuster la PrintArea à la Shape.
Suis revenu sur des boucles rétrogrades car les ratios appliqués aux PrintArea.ColumnWidth & PrintArea.RowHeight ne sont pas assez précis, surtout sur le PrintArea.RowHeight.

Donc, en effet pour définir la zone utilisable dans la page, les % ne fonctionnent pas de manière générale pour tous les PaperSize.
Il faut définir des zones fixes réservées (ici en Points) qui viennent en déduction des largeur et hauteur de la page telle que définie en cm convertis en Points moins les marges éventuelles de la mise en page.
VB:
    Const PrintHorizontalReservedMargin = 92
    Const PrintVerticalReservedMargin = 64
Ça marche pour la A4, le A5, le Letter, je n'ai pas testé d'autres formats en supposant que ces zones s'appliquent à tous.

Franchement, je pensais pas que ça pouvait être aussi compliqué !
 

Pièces jointes

Dernière édition:
Il y a peut-être une autre solution qui consiste à grossir la Shape sur la dimension disponible de la page moins les marges utilisateur (cm convertis en Points), d'ajuster la PrintArea sur la Shape, de placer un ou des caractères (blancs de préférence) dans la Shape.BottomRightCell sans la faire bouger et d'utiliser FitToPagesWide = 1 et FitToPageTall = 1. Je ne vois que ça pour se débarrasser des constantes de marge réservée à l'impression par Excel. Mais bon, si c'est pour obtenir le même résultat... A essayer quand même.
 
Ça valait le coup d'essayer !
Sans constantes en utilisant FitToPagesWide = 1 et FitToPagesTall = 1 qui doivent être encadrés par Application.PrintCommunication = False/True. Même pas besoin de mettre un caractère en Shape.BottomRightCell ni même de tenir compte des marges dans le resize de la Shape !
Tout est automatique pour tous les formats papier ! Sans zoom sans pourcentage sans chichi sans pan pan 😂 !
Mais que de prises de têtes pour en arriver là !
 

Pièces jointes

Dernière édition:
C'est sans doute suffisamment complexe pour en faire une ressource et éviter aux gens de s'y casser les dents.

Idéalement il faudrait réussir à copier la UserForm sans simuler un <Alt> + PrintScreen pour ne pas entrer en conflit avec les outils de capture d'écran genre FastStone Capture ou autre. Mais ça je ne sais pas faire. Pas d'API en vue.
 
Dernière édition:
et oui mais fitTo... ne redimensionne pas a l'agrandissement on l'a déjà vu ça
perso j'ai compris pourquoi même avec la logique 29.7/21 ça cafouillait encore de temps en temps
tout simplement par ce que la shape(capture) est la seule chose présente dans la feuille
et a partir du moment ou tu la bouge le printarea excel le recalcule(c'est le serpent qui se mort la queue )
je peut te faire une vidéo démonstratrice si veux
j'ai donc trouve un moyen plus simple qui permet que le plus grand coté de la capture hauteur ou largeur touche les bords
autrement dit un vrai zoom fullpage sans utiliser de calcul (zoom,pourcentage et même le 21/29.7)
Absolument tout ces concepts sont exclus de l’équation
on y gagne à laisser Excel faire ce boulot pour le quel il est équipé avec sa propre échelle

maintenant je vais regarder ton truc pour voir ce que tu a fait comme concept

EDIT/
Alors j'ai regardé ton fichier
on est encore dans des calculs
les + ou moins "0.5" on sait pas trop pourquoi et peut être que le résultat que j'obtiens somme toute acceptable mais n'est pas le même que chez toi
voir aussi si le print reagi comme chez moi en 32013 32 bit aussi
bref c'est encore des calculs

moi ce que je te propose c'est
pas de calcul
laissé excel faire lui même
allez c'est parti
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'Fonction pour imprimer ou exporter la capture d'un userform en pleine page
'quelque soit sa taille SANS ZOOM!!!!! sans calcul 21/29.7 sans pourcentage
'auteur: patricktoulon
'version V 3.0
'
'le principe de fonctionnement
'on prend une plage suffisamment grande pour contenir   un saut de page vertical et ou  horizontal
'ces sauts de pages vont se créer automatiquement
'on inscrit une lettre
'on determine la zonne sur cette plage
' on capture et colle la capture
'on dimentionne la capture collée au width ou height   sur page 1 ou range selon la presence de saut de page
'on imprime
'voila l'astuce ici c'est de ne plus contraindre  les zone et saut de page forcé automatiquement par excel l'orsqu'on dimanetion  a 21/29.7
'****************************************************************************************************

#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

Function PrintFormX(uf As Object, Optional NomFichierPDF As String = "", Optional lPrevieW As Boolean = False)
    Dim shp As Shape, rng As Range, W As Double, H As Double, Ws As Worksheet
    Set Ws = Sheets.Add
    snapshotForm
    uf.Hide
    DoEvents
    Set rng = Ws.[a1:M100]: rng = "X": rng.Font.Color = vbWhite
    With Ws.PageSetup
        .Orientation = IIf(uf.Width > uf.Height, xlLandscape, xlPortrait)
        .LeftMargin = 0: .TopMargin = 0
        .RightMargin = 0: .BottomMargin = 0
        .HeaderMargin = 0: .FooterMargin = 0
    End With
    DoEvents
    Do While Ws.Shapes.Count = 0
        On Error Resume Next
        Ws.Paste
        Err.Clear
    Loop
   
   
    'determine le width et height valable selon les sauts de page
    If Ws.VPageBreaks.Count > 0 Then W = Ws.VPageBreaks(1).Location.Left Else W = rng.Width
    If Ws.HPageBreaks.Count > 0 Then H = Ws.HPageBreaks(1).Location.Top Else H = rng.Height
   
    'on rechoppe la shape(la capture)
    Set shp = Ws.Shapes(Ws.Shapes.Count)
   
    With shp
        .LockAspectRatio = True
        shp.Width = W 'même largeur que le width de rng ou saut de page vertical(1)
        ' apres avoir fait la largeur ,si le height est trop grand meme largeur que rng ou saut de page horizontal(1)
        If shp.Height > H Then shp.Height = H
        'on centre la shape
        .Top = (H - .Height) / 2
        .Left = (W - .Width) / 2
    End With
   
    'on peut vider les cellules(facultatif (le font est en blanc))
    Ws.[a1:M100] = ""
   
    If NomFichierPDF <> "" Then
        Ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=NomFichierPDF, Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                                                                IgnorePrintAreas:=False, from:=1, to:=1, OpenAfterPublish:=False
    Else
        If lPrevieW Then
            Ws.PrintPreview
        Else
            Ws.PrintOut from:=1, to:=1
        End If
       
        'on peut supprimer la feuille temporaire
        Application.DisplayAlerts = False
        Ws.Delete
        Application.DisplayAlerts = True
    End If
     
    uf.Show 0
End Function

allez le fichier avec
une vidéo démontrant le soucis de trailler avec une feuille vide n'ayant que la capture
je démontre aussi le fait que de laisser excel faire tout seul est plus judicieux que de faire des calculs qui même si ils sont logiques
excel ne l'entends pas de cette oreille
je sais que tu n'aime pas beaucoup les vidéos mais tu y gagnerais a regarder ,car si il y a un truc dont je peux me targuer
c'est que je vais chercher la source du problème
et j'ai fini par la trouver
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.
 

Pièces jointes

"bonne méthode PrintUserformX perso fullpage pleine page"
J'aime bien l'idée !

Tu comptes sur les sauts de page pour dimensionner ta Shape en partant d'un Range arbitraire, et tu n'occupes pas toujours l'espace maximum en devant déplacer le Shape.Top et le Shape.Left. C'est en effet une "autre méthode..."

Moi je dis simplement à Excel ajuste à la page en ayant "serré" la PrintArea au plus près de la Shape.
Pas de choix arbitraire qui peut s'avérer incorrecte selon la taille du papier.

Peu importe, chacun sa méthode.
 
Dernière édition:
c'est surtout que dans la video je montre pourquoi adapter la print area peux jouer des tours de cochon
dans le sens ou quand tu centre tu bouge la shape et comme il n'y a que la shape en bougeant tu demande a excel de refaire le print area
je le montre en live dans la vidéo
pour le choix de papier avec ma methode il te sufit de rien changer et d'ajouter le .paperSize dans le with page setup terminé
encore une fois on laisse excel faire

chez moi par exemple avec ta methode ou les ancienne que j'ai proposé quand je détermine le print area par rapport(au plus près de la capture) il y a d'office!!!!!!!!!!!!!!!!! un sauts de page vertical qui se crée dans l'area sur la dernière colonne et ça tu n'y peux rien c'est excel qui réserve ses marges même si on met tout ç zero dans le page setup

autant lui laisser ces caprices et adapter simplement la capture à la page 1 de la feuille
TOUT SIMPLEMEMENT
en gros on fait exactement l'inverse on adapte la capture a la plage et non le print area a la capture

ON PEUT FAIRE UNE RESSOURCE EN ÉQUIPE SI TU VEUX OU L'ON PROPOSERA LES DEUX VERSIONS
en expliquant le pourquoi du comment du choix de la methode
 
Je sais pas où t'as vu que "quand tu centre tu bouge la shape".
La Shape elle est en A1, elle y reste sans bouger et je "serre" la PrintArea au plus près de ses dimensions. Pas de lézard.

Quant à ton Range arbitraire [a1:M100], il a des PageBreaks en A3 ?
A priori j'en sais rien. peut-être que oui, peut-être que non.

en gros on fait exactement l'inverse on adapte la capture a la plage et non le print area a la capture
En faisant cela tu n'utilises pas le maximum de la zone imprimable.

Ta "bonne méthode" !
1753713242286.png


Ma méthode:
1753713223578.png
 
Dernière édition:
- 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

Réponses
1
Affichages
227
  • Question Question
XL 2019 User Form
Réponses
9
Affichages
328
  • Question Question
Microsoft 365 affichage userform
Réponses
4
Affichages
374
Réponses
2
Affichages
322
  • Question Question
Microsoft 365 Lecture vocale USF
Réponses
5
Affichages
182
Retour