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
 
ton userform transféré dans mon fichier
demo3.gif
 
Pourquoi ne pas utiliser Word en VBA pour faire la mise en page et l'impression ? il y a plus de possibilités qu'Excel.
Voici un code minimum qui utilise le classeur du post #24 employant le ALT + PrintScreen :
Sub PrintWithWord()
Dim wdApp As Object ' Word.Application
Dim wdDoc As Object ' Word.Document
On Error Resume Next
Call AltPrintScreen
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
' Créer un document temporaire
Set wdDoc = wdApp.Documents.Add
' Coller le contenu du presse-papiers (image)
wdDoc.Content.Paste
' Imprimer le document
wdDoc.PrintOut Background:=False
wdDoc.Close False
' Quitter Word si on l'a lancé depuis VBA
wdApp.Quit SaveChanges:=False
Set wdDoc = Nothing: Set wdApp = Nothing
End Sub

Le code prend une copie d'écran de la fenêtre active , la met dans un document word vide (l'image normalement est étirée sur toute la largeur de la page) et la page est envoyée sur l'imprimante par défaut.
On peut rajouter dans le code , le choix du format de page de sortie, portrait ou paysage, les marges, etc....
Nullosse
 
encore une différence 64/32 peut être
et avec ton fichier c'est pire
1753887953822.png


Alors ça, non, désolé. Tu n'as pas 2 écrans juxtaposés en largeur.
C'est juste que le UserForm n'est que partiellement affiché soit dans le seul moniteur soit dans un moniteur qui n'a pas de moniteur à sa droite.
1753892409566.png


Avec <Alt> PrintScreen:
1753888189869.png


Avec CopyUserFormImageToClipboard:
1753888262983.png


Mais ça c'est normal.
D'ailleurs je me demande ce que donnerait un <Alt> PrintScreen avec un UserForm à cheval sur 2 moniteurs...
Edit: non ça va, il prend bien la totalité.

Edit 2: On pourrait supprimer ce noir en analysant le cadre maximum en pixels de tous les moniteur et limiter la copie si le RECT du UserForm sort de ce cadre. Mais c'est beaucoup d'embrouille pour pas grand chose.
 
Dernière édition:
si je prend ton apercu on voit bien que tu n'est pas pleine page et que tu subit les marges forcées de excel
C'est exact, pour avoir un centrage je laisse les marges par défaut ce qui laisse des espaces.
Par contre je ne comprends pas comment tu peux aller aussi près des limites de la feuille, surtout à droite et en bas où je pensais que l'impression ne pouvait pas aller.
 
Par contre je ne comprends pas comment tu peux aller aussi près des limites de la feuille, surtout à droite et en bas où je pensais que l'impression ne pouvait pas aller.
c'est ce que j'ai tenté de t'expliquer plusieur fois depuis un moment visiblement maladroitement
c'est ta méthode qui n'est pas bonne
pas bonne dans le sens ou tu :
1° tu rapproche la plage a la shape donc déjà là on a un soucis de ratio (à moins que par hasard l'userform est un ratio 1.414 (29.7 / 21)
donc a l'impression excel va imprimer un ratio x dans un ration 29.7 * 21 donc forcement tu reduit la possibilité de démarger
2° ton calcul en do loop c'est bien mais tu n'es pas au bord de la shape 'sauf coincidence que le calcul rowsheight et columnwidth tombe juste

ma methode
1° conversion 29.7 et 21 en point
2° on mémo les coeff
coeff du width = (width / columnwidth)
coeff du height (height/rowheight)
(je précise il sont d'origine la feuille vient d'être crée c'est donc une base solide )


3°le width et le height on switch selon l'userform plus grand que large ou l'inverse

4°maintenant que l'on a le width et height
combien de colonnes et lignes faut il pour faire cette dimension
nombre de col= Int(le width /[A1.]Width)
nombre de ligne = Int(le height /[A1].Height)
(on arrive a ce que la dernière colonne dépasse un peu)

et maintenant que l'on a le width , height , nombre de ligne , nombre de colonne
5° et bien on peu calculer quasi exactement le rowheight et coloumnwidth sans boucle c'est ça qui est beau
puisque je l'applique a toute les colonne et lignes en même temps après
' Calcul des tailles optimales par cellule
cw = (le width / nombre de colonne ) / coeff Width
rh = (ke height / nombre de ligne) / coeff height
on applique
maplage.columnwidth=cw
maplage.rowheight=rh
et voila on a notre plage au ratio A4
SEULE PETIT PROBLÈME si excel accepte mon 29.7 en hauteur il me plante une marge forcée (le salo!!!)
c'est pas grave l'astuce a patosh que tu va découvrir quand ce sera publié

ensuite pagesetup marge et header a zero et tout le tout tim
et SURTOUT !!! le zoom à false pas 100 ou plus ou moins je dis bien false
et enfin les deux Fit to
ben il ne reste plus qu'a placer la shape en top et left 0 agrandir ou reduire hauteur ou largeur pour que ça rentre sans déformation
pour cela on a le lockaspectratio qui gère hein

resultat c'est propre net
demo3.gif


allez on crop l'image et on fait sauter les bordures et barre de titre et c'est troujours propre et net
demo3.gif


allez on tente avec un grand
demo3.gif


ma conclusion:
je pense que nous avons découvert quelques petites astuces dans ce sujet vu le carcan de ces marges
mais comme ça fait le laron tu t'es empressé d'adopter une logique qui n'est certes pas si mauvaise(je l'avais adopté en premier) mais aussi pas la bonne car dans la logique la shape rentre dans la page et non la page dans la shape
voila les démos que tu viens de voir ont été faite avec la version publiée
pour info tu l'aura remarqué
je fait péter les bordures et barre de titre (je m'attaque a l'image pas a l'userform( je fait un crop))
ca ne t'aura pas échapper aussi que les barre de titre son classique car je n'utilise pas bitblt qui coupe si userform dedorde des bords de l'ecran ou est caché par une autre fenêtre j'utilise l'api printwindow qui va chercher dans le hdc les bitouilles pas les pixoulou

voila tu vois j'ai préféré tout explorer avant de publier quelque chose qui n'est pas tout a fait au point
allez pour le plaisir je vais mettre une bordure a la plage
avec le cadre rouge on vois bien que la plage est border line
1753991920333.png


allez on s'amuse encore un peu
on va le faire a 90% et oui comme j'ai shunté le zoom je fait le mien (argument percentpage de la fonction )
demo3.gif


a j'oubliais la demo avec userform a moitié sorti de l'écran
demo3.gif

voila pas se presser explorer toute les solutions permet de faire les choses bien 😉
 
je te donne un indice
l'astuce :c'est un nombre magique que tu connais très bien si tant est que tu ne soit pas atteint d’Alzheimer
ce nombre magique tu le retrouve partout dans excel , il est comme le nombre d'or que l'on retrouve en toute chose sur notre vielle terre
ça devrait te titiller là déjà
 
On peut rajouter dans le code , le choix du format de page de sortie, portrait ou paysage, les marges, etc....
Nullosse
Salut voici par exemple ce que cela donne avec ce code :
VB:
Sub PrintWithWord()
' Ajouter word dans les références pour avoir accès aux constantes word
Dim wdApp As Object ' Word.Application
Dim wdDoc As Object ' Word.Document
On Error Resume Next
Call CopyUserFormImageToClipboard(GetActiveWindow)
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

' Créer un document temporaire
Set wdDoc = wdApp.Documents.Add
wdDoc.PageSetup.PaperSize = wdPaperA4
wdDoc.PageSetup.Orientation = wdOrientLandscape ' paysage

' Coller le contenu du presse-papiers (image)
wdDoc.Content.Paste
With wdDoc.InlineShapes(1)
    .Range.ParagraphFormat.Alignment = wdAlignParagraphCenter 'on centre l'image au milieu
    .ScaleHeight = 200 'Echelle horizontale
    .ScaleWidth = 200  ' Echelle verticale
    .PictureFormat.CropTop = 1 ' on enlève un pixel en haut
    .PictureFormat.CropLeft = 1 ' on enlève un pixel à gauche
End With
With wdDoc.PageSetup
    .TopMargin = CentimetersToPoints(5) ' pour centrer l'image verticalement dans la page
    .BottomMargin = CentimetersToPoints(0.5)
    .LeftMargin = CentimetersToPoints(0.5)
    .RightMargin = CentimetersToPoints(0.5)
End With
' Imprimer le document avec aperçu
wdApp.Activate
wdApp.ActiveWindow.View.Type = wdPrintPreview
Do While wdApp.ActiveWindow.View.Type = wdPrintPreview
        DoEvents
        Sleep 100 ' Sleep à ajouter dans la déclaration des API
    Loop
wdDoc.Close False
' Quitter Word si on l'a lancé depuis VBA
wdApp.Quit SaveChanges:=False
Set wdDoc = Nothing: Set wdApp = Nothing
End Sub


WordPrintUserForm.png


Dans le code , on choisit une page A4 en mode paysage, on centre l'image de la userform en la grossissant par 200 et on enlève un pixel en haut et à gauche. On met les marges à 0.5 sauf celle du haut que l'on met à 5 pour centrer le formulaire au milieu de la feuille.
Il y a une boucle d'attente à la fin qui attend la fermeture de l'aperçu car la visualisation de l'aperçu dans word vba est non bloquant.

Nullosse
 
Dernière édition:
Bonjour @Dudu2
j'ai repris ma vielle méthode de 2017 a savoir le range arbitraire de plusieurs pages et appliquer d'une autre manière mon astuce
et ça marche aussi
création d'une zone arbitraire d'impression( faire en sorte qu'elle soit plus grande qu'une page

voila l'astuce
Creation du range

1°ex: A1:M100

2° on parametre le page setup en fonction du userform(paysage ou portrait) et les marges a zéro
on constate que je n'utilise pas le zoom (pas besoin)
VB:
 'Pagesetup minimal
    With ws.PageSetup
        .PrintArea = RnG.Address
        .Orientation = IIf(uf.Width > uf.Height Or uf.Width = uf.Height, xlLandscape, xlPortrait)
        .LeftMargin = 0
        .RightMargin = 0
        .TopMargin = 0
        .HeaderMargin = 0
        .FooterMargin = 0
        .BottomMargin = 0
        .BlackAndWhite = NoirEtBlanc
        .CenterHorizontally = True
        .CenterVertically = True
    End With

on a donc 2 page A4 et une autre on s'en fou seule la première nous intéresse

1754122612888.png


3°Excel insiste a nous laisser une marge haute et basse
et bien on va tout simplement déplacer le premier saut de page une ligne plus bas
demo3.gif


4° on crée la plage de reference avec la plage que represente la page 1
les variable ro et col sont respectivement les bords de la page ou saut de ligne (verticaux et horizontaux)
la variable ro2 c'est la même mais elle va nous servir a calculer les dim et coeff de déformation(pour l'appliquer à la shape après )
VB:
 HX = ws.Cells(Ro2, 1).Top / ws.Cells(Ro2 + 1, 1).Top 'ratio de reformation du A4
 Set rng2 = ws.Range("A1").Resize(Ro2, Col)

5° voila on a notre plage de page 1
il nous reste plus qu'a coller la capture
la deformer au prorata de la deformation A4(lockaspectration false)
et agrandir en gardant cette fois ci l'aspect ratio
demo3.gif

comme a déformé le A4 on déforme au prorata la capture

6° il nous reste plus qu'a imprimer
1754123529454.png

dans le pagesetup on a le paperrsize à xlpaperA4
donc à l'impression la déformation sera écrasée ainsi qu'en pdf
voila
cette astuce marche aussi avec une plage non pas arbitraire mais créée au ration 1.414 soit le 29.7/21
on ajoute une ligne c'est tout
 

Pièces jointes

  • 1754122475092.png
    1754122475092.png
    16.8 KB · Affichages: 3
- 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