OVH Cloud OVH Cloud

Orientation de l'impression en VBA ?

1 réponse
Avatar
Gus
En voila une question qu'elle est bonne !!!
Voila mon probl=E8me .
Dans mon appli, je suis amener =E0 imprimer une=20
Userform ... Jusque la pas de probl=E8me , j'utilise le=20
code suivant : Userform4.Printform et =E7a marche..
Mais ou est donc le probl=E8me alors me dira vous ?
Et bien mon Userform =E9tant assez large je voudrais=20
l'imprimer en format paysage et c'est la qu'est le=20
probl=E8me : comment affecter le format paysage a=20
l'impression d'un Userform ?
je pourrais configurer directement mon imprimante en=20
paysage , mon appli est utiliser sur notre r=E9seau par=20
plusieurs personnes donc il est impensable de configure=20
chaque imprimante une a une =E0 la main ..
Existe t'il un moyen en VBA de contr=F4ler l'imprimante=20
par d=E9faut et de modifie ses propri=E9t=E9s pour qu'elle=20
imprime en paysage ?
Je pensais utilise aussi la fonction=20
PageSetup.Orientation =3D xlLandscape mais marche pas non=20
plus.
Je pourrais =E9galement utiliser la propri=E9t=E9 zoom pour=20
r=E9tr=E9cir ma Userform , la aussi =E7a marche mais =E7a devient=20
illisible.

Merci a ceux qui se casseront la t=EAte pour me r=E9pondre.

1 réponse

Avatar
Denis Michon
Bonjour Gus,


Voici 3 procédures parues ici et signées par Michel Perron sur le sujet :

================================ Avec la méthode PrintForm, tout est prédéfini et tu ne peux avoir aucune
action sur les différents paramètres; l'objet Printer n'étant pas utilisable
dans VBA.
L'idée pour contourner le problème est la suivante:
Utiliser les options d'impression d'Excel lui même en collant l'image de
l'UserForm dans un nouveau classeur au travers du presse-papiers;
malheureusement, la méthode SendKeys ne peut pas être utilisée pour
effectuer cette opération car pour une raison qui m'échappe (peut être
parceque Excel gère son propre presse-papiers), la touche Impression écran
n'est pas gérée par SendKeys.
Pour contourner ce problème, on va utiliser une fonction API.
Je suppose que l'impression de ton UserForm est déclenchée par un bouton
présent sur cet UserForm, auquel cas, je te propose d'associer la procédure
suivante à ce bouton.

En tête du module de ton UserForm: 'La plus complète

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte _
, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Function EmptyClipboard Lib "user32" () As Long

' La procédure d'impression de l'UserForm:
Private Sub PrintUserForm()
Dim BookName As String

Application.CutCopyMode = False
EmptyClipboard
Me.Repaint '* Relâche le bouton avant l'impression
keybd_event vbKeySnapshot, 0, 0&, 0&
Application.ScreenUpdating = False
Workbooks.Add
BookName = ActiveWorkbook.Name
ActiveWindow.Visible = False
Workbooks(BookName).Sheets(1).Paste
With Workbooks(BookName).Sheets(1).PageSetup
.RightFooter = Me.Caption & " Le &D Page &P/&N"
.PrintGridlines = False
.CenterHorizontally = True
.CenterVertically = True
.Orientation = xlPortrait '* Vertical
'.Orientation = xlLandscape '* Horizontal
.PaperSize = xlPaperA4
.Zoom = 100 '* Mettre en remarque si impression ajustée
' * Ajuste l'impression (largeur & hauteur)
'.Zoom = False
'.FitToPagesWide = 1
'.FitToPagesTall = 1
End With
Application.ScreenUpdating = True
Windows(BookName).SelectedSheets.PrintOut Copies:=1
Workbooks(BookName).Close False
End Sub

MP





Plus j'y pense et plus je crois qu'il est infiniment plus simple d'utiliser
CopyPicture et d'ajuaster les dimensions de l'image a ce que tu souhaites,
du genre:

Sub ImpTailleConst_2()
Application.ScreenUpdating = False
ActiveWindow.DisplayGridlines = False
ActiveSheet.Range("A1:E" & [A:A].Find("Solde").Row).CopyPicture
ActiveWindow.DisplayGridlines = True
Workbooks.Add
ActiveSheet.Paste
Selection.ShapeRange.LockAspectRatio = msoFalse
Selection.ShapeRange.Height = Application.CentimetersToPoints(15)
Selection.ShapeRange.Width = Application.CentimetersToPoints(10)
ActiveSheet.PageSetup.Zoom = 100
ActiveSheet.PrintOut copies:=1
ActiveWorkbook.Close False
End Sub

MP


Pour faire ce que tu veux, on ne peut jouer que sur le rapport de zoom dans
les paramètres d'impression.
Le ratio horizontal pouvant être différent du ratio vertical, le zoom sera
ajusté à la moyenne des 2.

Sub ImpTailleConst()
Dim Maplage As Range, HA4 As Long, LA4 As Long, Unity As Long
Dim lRatio As Double, hRatio As Double

Unity = Application.CentimetersToPoints(1)
HA4 = Application.CentimetersToPoints(29.7)
LA4 = Application.CentimetersToPoints(21)
With ActiveSheet.PageSetup
.PrintArea = ActiveSheet.Range("A1:E" & [A:A].Find("Solde").Row).Address
lRatio = 10.5 / ((LA4 - .LeftMargin - .RightMargin) / Unity)
hRatio = 14.85 / ((HA4 - .TopMargin - .BottomMargin) / Unity)
.Zoom = CInt(100 * (lRatio + hRatio) / 2)
End With
ActiveSheet.PrintOut copies:=1
End Sub

MP
================================


Salutations!






"Gus" a écrit dans le message de news:005701c3ad20$5c2a7170$
En voila une question qu'elle est bonne !!!
Voila mon problème .
Dans mon appli, je suis amener à imprimer une
Userform ... Jusque la pas de problème , j'utilise le
code suivant : Userform4.Printform et ça marche..
Mais ou est donc le problème alors me dira vous ?
Et bien mon Userform étant assez large je voudrais
l'imprimer en format paysage et c'est la qu'est le
problème : comment affecter le format paysage a
l'impression d'un Userform ?
je pourrais configurer directement mon imprimante en
paysage , mon appli est utiliser sur notre réseau par
plusieurs personnes donc il est impensable de configure
chaque imprimante une a une à la main ..
Existe t'il un moyen en VBA de contrôler l'imprimante
par défaut et de modifie ses propriétés pour qu'elle
imprime en paysage ?
Je pensais utilise aussi la fonction
PageSetup.Orientation = xlLandscape mais marche pas non
plus.
Je pourrais également utiliser la propriété zoom pour
rétrécir ma Userform , la aussi ça marche mais ça devient
illisible.

Merci a ceux qui se casseront la tête pour me répondre.