Besoin d'aide sur Userform et impression

Asmoden

XLDnaute Junior
Bonjour tout le monde!!!

j'espère que vous allez bien, cela fait longtemps que je suis pas venu pleins de soucis à régler mais bon...

Je viens une fois de plus demander conseils :

je dispose d'un UF a assez important (il ne tient pas dans une page) de plus celui ci dispose de texbox avec scrollbar bref la totale...

j'aurai voulu connaitre vos moyens pour que lorsque je clique sur un bouton, celui-ci soit imprimer en recto verso afin d'avoir toutes les données.

je suis ouvert à toutes propositions, et toutes méthodes j'ouvre le sujet à discussion donc :)

Merci!
 

PMO2

XLDnaute Accro
Re : Besoin d'aide sur Userform et impression

Bonjour,

Une piste bien compliquée qui, utilisant les APIs, n'est valide que sous Windows.

ATTENTION : pour un fonctionnement sans problème il est IMPERATIF d'avoir des UserForms avec la propriété ShowModal = False.
Soit, en mode création, on fixe la propriété ShowModal à False.
Soit, dans le code d'appel du UserFom, on utilise la ligne de code UserForm1.Show (vbModeless)

MARCHE A SUIVRE
1) créez un UserForm1 (avec la propriété Width = 1500) et, dans sa partie gauche, un CommandButton1 (Caption = Fermer) et
un CommandButton2 (Caption = Impression UserForm).
2) créez un UserForm2 (avec la propriété Height = 1500) et, dans sa partie haute, un CommandButton1 (Caption = Fermer) et
un CommandButton2 (Caption = Impression UserForm).
3) dans leur fenêtre de code respective, copiez le code suivant
Code:
Private Sub CommandButton1_Click()
Unload Me
End Sub

Private Sub CommandButton2_Click()
Dim x As New cls_ImprUSF
Call x.PrintOutUSF(Me)
End Sub
4) dans un module Standard copiez le code suivant
Code:
Sub USF_TresLarge()
UserForm1.Show (vbModeless)
End Sub

Sub USF_TresHaut()
UserForm2.Show (vbModeless)
End Sub
5) créez un module de classe, appuyez sur F4 pour faire apparaître la fenêtre de Propriétés et fixez (Name) = cls_ImprUSF
6) dans la fenêtre de code du module de classe cls_ImprUSF, copiez le code suivant
Code:
Private Declare Function ShowWindow& Lib "User32" ( _
  ByVal hWnd As Long, ByVal nCmdShow As Long)
Private Declare Function FindWindow& Lib "User32" Alias "FindWindowA" ( _
  ByVal lpClassName As String, ByVal lpWindowName As String)
Private Declare Sub keybd_event Lib "User32" ( _
  ByVal bVk As Byte, ByVal bScan As Byte, _
  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
  
Private Const SW_NORMAL As Long = &H1
Private Const SW_MINIMIZE As Long = &H6
Private Const KEYEVENTF_KEYUP = &H2
  
Private Sub ApercuImpression(USF As Object)
Dim S As Worksheet
On Error GoTo Erreur
Application.ScreenUpdating = False
Application.DisplayAlerts = False
DoEvents
keybd_event vbKeySnapshot, &H1, 0, 0
DoEvents
keybd_event vbKeySnapshot, 0, KEYEVENTF_KEYUP, 0
Set S = Sheets.Add
With S
  .Paste Destination:=.[a1]
  ShowWindow FindWindow(vbNullString, USF.Caption), SW_MINIMIZE
  .PrintPreview
  .[a1].Copy
   ShowWindow FindWindow(vbNullString, USF.Caption), SW_NORMAL
  .Delete
End With
Erreur:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Sub PrintOutUSF(USF As Object)
Dim EtatAppli As Long
Dim AppWidth As Single
Dim AppHeight As Single
Dim LargUF As Single
Dim HautUF As Single
Dim Coeff As Single
With Application
  .ScreenUpdating = False
  EtatAppli = .WindowState
  .WindowState = xlMaximized
  AppWidth = .Width
  AppHeight = .Height
  .WindowState = EtatAppli
End With
With USF
  LargUF = .Width
  HautUF = .Height
  If LargUF < AppWidth And HautUF < AppHeight Then
    Coeff = 1
  Else
    If LargUF > HautUF Then
      Coeff = (AppWidth * 100) \ LargUF
      .Zoom = Coeff
      .Width = AppWidth - 5
      .Height = .Height * (Coeff / 100)
    Else
      Coeff = (AppHeight * 100) \ HautUF
      .Zoom = Coeff
      .Height = AppHeight - 5
      .Width = .Width * (Coeff / 100)
    End If
  End If
  Call ApercuImpression(USF)
  .Zoom = 100
  .Width = LargUF
  .Height = HautUF
End With
Application.ScreenUpdating = True
End Sub

Lancez la macro USF_TresLarge OU la macro USF_TresHaut pour faire des tests.

L'idée est de zoomer les UserForms pour qu'ils puissent s'inscrire dans l'écran puis de stocker leur image dans le
presse-papiers. On colle cette image dans une feuille temporaire Excel et on actionne la prévisualisation d'impression.
On peut, dans l'aperçu d'impression, faire différents réglages (les marges, l'orientation, etc) puis imprimer le document.

L'inconvénient de cette méthode est que, à la suite des différents zooms, l'image résultante apparaît floue.

Cordialement.

PMO
Patrick Morange
 

Statistiques des forums

Discussions
312 500
Messages
2 089 004
Membres
104 003
dernier inscrit
adyady__