XL 2019 Imprimer les différentes feuilles excel si complétées

  • Initiateur de la discussion Initiateur de la discussion schum23
  • Date de début Date de début

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 !

schum23

XLDnaute Nouveau
Bonjour tout le monde,

Je reviens vers vous car j'ai encore besoin de vous concernant du VBA.
Je vous explique :

J'aimerai créer un bouton type userform "PRINT TO PDF" qui serait présent sur la page "LAST PAGE" de mon fichier excel. J'aimerai que quand on clique sur celui ci, il y ait une action type Print to PDF ou Save to Pdf et j'aimerai que les pages suivantes soit imprimées :

- 1st Page
- CMD_SOLUTIONS --> mais imprimer que jusqu'à la dernière ligne complétée et que si le tableau est complété
- Hardware_Software --> Que si il y a un élément dans le tableau en dessous
- LAST page

Ca serait top si tout était dans un fichier PDF.

Pensez-vous que c'est possible?
Je vous joins le fichier en annexe.

Je vous remercie d'ores et déjà pour votre aide.
 

Pièces jointes

Bonjour,

Essaie :

VB:
Sub Impression()
  Dim Plage As Range
  Application.ScreenUpdating = False
  With Sheets("CMD_SOLUTIONS")
    Set Plage = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 7)
    .PageSetup.PrintArea = Plage.Address
  End With
  Sheets(Array("1st PAGE", "CMD_SOLUTIONS", "HARDWARE_SOFTWARE", "LAST PAGE")).Select
  ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
  Application.ScreenUpdating = True
End Sub

Daniel
 
Bonjour schum23, danielco,

Voyez le fichier joint et la macro du bouton "PRINT TO PDF" :
VB:
Sub PDF()
Dim w As Worksheet, tablo, ncol%, i&, j%
Application.ScreenUpdating = False
For Each w In Sheets(Array("1st PAGE", "CMD_SOLUTIONS", "HARDWARE_SOFTWARE", "LAST PAGE"))
    w.Select False 'sélection multiple
    tablo = w.UsedRange 'matrice, plus rapide
    If Not IsArray(tablo) Then tablo = w.UsedRange.Resize(2) 'au moins 2 cellules
    ncol = UBound(tablo, 2)
    For i = UBound(tablo) To 1 Step -1
        For j = 1 To ncol
            If CStr(tablo(i, j)) <> "" Then GoTo 1
    Next j, i
1   If i Then w.PageSetup.PrintArea = w.UsedRange.Resize(i).Address 'zone d'impression
Next w
ActiveSheet.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Mon PDF.pdf" 'nom à adapter
Sheets("LAST PAGE").Select
End Sub
Les 4 feuilles sont étudiées une par une pour définir la zone d'impression.

A+
 

Pièces jointes

Bonjour Job75,

Merci beaucoup pour ta réponse!!
Cependant, dernière petite adaptation à faire s'il vous plait :
- Concernant la 1st page : il faudrait limiter la zone d'impression à la colonne "i"
- CMD.solutions : limiter la zone d'impression à la colonne G
- Hardware_software : limiter à la colonne 'i"
- Last page : limiter impression à colonne "i"

Est-ce que ca serait possible?

Merci beaucoup!!!!

Bien à vous,
 
Fichier (2) avec le code modifié :
VB:
Sub PDF()
Dim w As Worksheet, ncol%, tablo, i&, j%
Application.ScreenUpdating = False
For Each w In Sheets(Array("1st PAGE", "CMD_SOLUTIONS", "HARDWARE_SOFTWARE", "LAST PAGE"))
    w.Select False 'sélection multiple
    ncol = IIf(w.Name = "CMD_SOLUTIONS", 7, 9) 'adapter éventuellement selon les feuilles
    tablo = w.UsedRange.Resize(, ncol) 'matrice, plus rapide
    For i = UBound(tablo) To 1 Step -1
        For j = 1 To ncol
            If CStr(tablo(i, j)) <> "" Then GoTo 1
    Next j, i
1   If i Then w.PageSetup.PrintArea = w.UsedRange.Resize(i, ncol).Address 'zone d'impression
Next w
ActiveSheet.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Mon PDF.pdf" 'nom à adapter
Sheets("LAST PAGE").Select
End Sub
 

Pièces jointes

Quand tu dis :"Adapter éventuellement selon les feuilles", tu vois ca comment?
Par exemple avec la fonction Choose :
VB:
Sub PDF()
Dim w As Worksheet, n%, ncol%, tablo, i&, j%
Application.ScreenUpdating = False
For Each w In Sheets(Array("1st PAGE", "CMD_SOLUTIONS", "HARDWARE_SOFTWARE", "LAST PAGE"))
    w.Select False 'sélection multiple
    n = n + 1
    ncol = Choose(n, 9, 7, 8, 9) 'nombre de colonnes à adapter
    tablo = w.UsedRange.Resize(, ncol) 'matrice, plus rapide
    For i = UBound(tablo) To 1 Step -1
        For j = 1 To ncol
            If CStr(tablo(i, j)) <> "" Then GoTo 1
    Next j, i
1   If i Then w.PageSetup.PrintArea = w.UsedRange.Resize(i, ncol).Address 'zone d'impression
Next w
ActiveSheet.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Mon PDF.pdf" 'nom à adapter
Sheets("LAST PAGE").Select
End Sub
Edit : le UsedRange de la 3ème feuille "HARDWARE_SOFTWARE" commence en colonne B il faut donc ncol = 8 pour limiter à la colonne "i".
 
Dernière édition:
Rebonjour,

Dernière petite update si c'est possible.
Peut-on rajouter que via le bouton, la macro imprime juste les onglets sélectionnées au préalable.
Je vous explique pourquoi:
- des fois les offres ne comprennent pas l'onglet "CMD-solutions"
- des fois les offres ne comprennent pas l'onglet "Hardware-software"
- des fois les offres comprennent tous les onglets.

Merci beaucoup pour votre aide!
Cordialement,
 
Bonsoir schum23,

Touche Ctrl enfoncée cliquez sur les onglets des feuilles à imprimer (sélection groupée).

Touches Ctrl+Z pour créer les zones d'impression et le fichier PDF via cette macro :
VB:
Sub PDF()
'se lance par les touches Ctrl+Z
Dim a, b, F As Object, S As Object, w As Worksheet, i As Variant, ncol%, tablo, j%
a = Array("1st PAGE", "CMD_SOLUTIONS", "HARDWARE_SOFTWARE", "LAST PAGE")
b = Array(9, 7, 8, 9) 'nombre de colonnes à imprimer
Set F = ActiveSheet
Set S = ActiveWindow.SelectedSheets 'sélection groupée
F.Select 'dégroupe
If IsError(Application.Match(F.Name, a, 0)) Then MsgBox "Sélectionnez en premier l'une des 4 feuilles...": Exit Sub
Application.ScreenUpdating = False
For Each w In S
    i = Application.Match(w.Name, a, 0)
    If IsNumeric(i) Then
        w.Select False 'regroupe
        ncol = b(i - 1)
        tablo = w.UsedRange.Resize(, ncol) 'matrice, plus rapide
        For i = UBound(tablo) To 1 Step -1
            For j = 1 To ncol
                If CStr(tablo(i, j)) <> "" Then GoTo 1
        Next j, i
1       If i Then w.PageSetup.PrintArea = w.UsedRange.Resize(i, ncol).Address 'zone d'impression
    End If
Next w
ActiveSheet.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Mon PDF.pdf" 'nom à adapter
F.Select 'dégroupe
End Sub
Fichier (3).

A+
 

Pièces jointes

- 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

Retour