XL 2016 *** RESOLU MERCI :)*** Impression personnalisée.

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 !

Agecanonix35400

XLDnaute Junior
Bonjour à tous.

J'aurais besoin de vos lumières si vous le permettez.
En effet je vous ai mis mon fichier de facturation en exemple.
Lorsque je veux imprimer, je voudrais imprimer avec les filtres présents colonnes "A" et "H"
En revanche lorsque j'imprime cela me sort la liste complète
Ce que je voudrais c'est 1 jour par feuille
Par exemple
feuille 1 le 1er janvier.
feuille 2 le 02 janvier recto/verso
feuille 3 le 03 janvier.

Actuellement je dois sélectionner ma date et imprimer et refaire la même chose pour les autres jours.
Cela prend un temps fou car j'ai 3 fichiers gros comme celui-ci à imprimer.

Merci de me dire s'il y a un moyen d'imprimer en selectionnant le mois complet et que ca imprime 1 feuille par date ou bien une autre manière de faire.
 

Pièces jointes

Solution
Bonjour le forum,

Dans le fichier joint j'ai augmenté le nombre de lignes du 02/01/2025 pour que ce jour occupe 2 pages.

Dans la macro Imprimer il faut ôter Application.ScreenUpdating = False pour que l'aperçu puisse afficher la 2ème page.

A+
Il a trouvé, par contre moi je n'y comprends rien 😉 Je te laisse le soin d'analyser sa réponse
Je vais d'abord essayer de trouver une solution par moi-même, mais merci d'avoir partagé sa solution.



ps : quand tu postes du code VBA, entoure-le de la balise code pour qu'il soit plus lisible. 😉

Exemple :
[ code = vb ]
ici tu mets ton code VBA
[ /code ]
(sans les espaces, bien sûr)
 
Je vais d'abord essayer de trouver une solution par moi-même, mais merci d'avoir partagé sa solution.



ps : quand tu postes du code VBA, entoure-le de la balise code pour qu'il soit plus lisible. 😉

Exemple :
[ code = vb ]
ici tu mets ton code VBA
[ /code ]
(sans les espaces, bien sûr)
Voilà c'est fait 😉
Désolé je ne savais pas 🙂
 
Je vais d'abord essayer de trouver une solution par moi-même, mais merci d'avoir partagé sa solution.



ps : quand tu postes du code VBA, entoure-le de la balise code pour qu'il soit plus lisible. 😉

Exemple :
[ code = vb ]
ici tu mets ton code VBA
[ /code ]
(sans les espaces, bien sûr)
En fin de compte d'après ce que je vois après avoir testé, c'est qu'il fait une impression par jour et pas à la suite.
Cela ne rend pas fluide du tout l'impression.
Cela fonctionne mais ce n'est pas fluide.
Voilà ce que j'ai pu observer.

Admettons que je veuille imprimer en PDF, du coup il m'imprime 1 fichier par jour au lieu de me faire 1 fichier pour tous les jours.
 
Dernière édition:
En fin de compte d'après ce que je vois après avoir testé, c'est qu'il fait une impression par jour et pas à la suite.
C'est une des deux possibilités que j'envisageais, mais avec l'inconvénient de créer autant de documents que de jours.

L'autre possibilité étant d'insérer, si besoin, une page vierge, le plus dur étant sûrement d'arriver à savoir s'il faut ou non ajouter une page vierge à la fin de chaque jour.


J'ai l'impression que les problèmes d'impression posent toujours des problèmes...
 
C'est une des deux possibilités que j'envisageais, mais avec l'inconvénient de créer autant de documents que de jours.

L'autre possibilité étant d'insérer, si besoin, une page vierge, le plus dur étant sûrement d'arriver à savoir s'il faut ou non ajouter une page vierge à la fin de chaque jour.


J'ai l'impression que les problèmes d'impression posent toujours des problèmes...
C'est ça.
 
Bonjour le forum,

Avec cette solution je ne crée pas des sauts de page, je définis la zone d'impression pour chaque jour :
VB:
Sub Imprimer()
Dim T As Range, rc&, d As Object, i&, P As Range, j&
Set T = [Tableau3] 'tableau structuré
rc = T.Rows.Count
Set d = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
For i = 1 To rc
    If Not T.Rows(i).Hidden Then 'lignes visibles
        If Not d.exists(T(i, 2).Value) Then
            d(T(i, 2).Value) = ""
            Set P = T.Rows(i)
            For j = i + 1 To rc
                If Not T.Rows(j).Hidden Then If T(j, 2) = T(i, 2) Then Set P = Union(P, T.Rows(j))
            Next j
            T.Parent.PageSetup.PrintArea = P.Address 'zone d'impression
            'T.Parent.PrintOut ' pour imprimer
            T.Parent.PrintPreview 'aperçu
        End If
    End If
Next i
T.Parent.PageSetup.PrintArea = ""
End Sub
Les dates peuvent être dans n'importe quel ordre.

A+
 

Pièces jointes

Si l'on veut créer un fichier PDF avec une ou deux pages pour chaque jour on peut utiliser cette macro :
VB:
Sub Fichier_PDF()
Dim t0, T As Range, rc&, d As Object, i&, P As Range, j&, n&
t0 = Timer
Set T = [Tableau3] 'tableau structuré
rc = T.Rows.Count
Set d = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
Workbooks.Add 'classeur vierge auxiliaire qui devient le fichier actif
For i = 1 To rc
    If Not T.Rows(i).Hidden Then 'lignes visibles
        If Not d.exists(T(i, 2).Value) Then
            d(T(i, 2).Value) = ""
            Set P = T.Rows(i)
            For j = i + 1 To rc
                If Not T.Rows(j).Hidden Then If T(j, 2) = T(i, 2) Then Set P = Union(P, T.Rows(j))
            Next j
            n = n + 1
            With Sheets.Add(, Sheets(Sheets.Count), 1) 'ajoute une feuille
                .Name = "Page" & n
                T.Rows(0).Copy .Cells(1)
                For j = 1 To .UsedRange.Columns.Count: .Columns(j).ColumnWidth = T(1, j).ColumnWidth: Next j 'largeurs des colonnes
                P.Copy
                .Cells(2, 1).PasteSpecial xlPasteValues 'collage spécial
                .Cells(2, 1).PasteSpecial xlPasteFormats
                .UsedRange.RowHeight = 30 'hauteur des lignes
                With .PageSetup
                    .PrintTitleRows = "$1:$1"
                    .Orientation = xlLandscape
                    .Zoom = False
                    .FitToPagesWide = 1 '1 page en largeur
                    .FitToPagesTall = 2 '2 pages en hauteur
                End With
            End With
        End If
    End If
Next i
Sheets("Page1").Select
For i = 2 To n: Sheets("Page" & i).Select False: Next i 'sélection multiple
ActiveSheet.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Fichier PDF.pdf" 'création du PDF
ActiveWorkbook.Close False 'ferme le classeur auxiliaire
MsgBox "Fichier PDF de " & n & " page" & IIf(n > 1, "s", "") & " créé en " & Format(Timer - t0, "0.00 \sec")
End Sub
 

Pièces jointes

Dernière édition:
Si l'on est sur MAC les 2 macros précédentes ne fonctionneront pas car le Dictionary n'existe pas.

On pourra alors utiliser une Collection qui fonctionne sur PC et sur MAC :
VB:
Sub Imprimer()
Dim T As Range, rc&, i&, dat, coll As New Collection, P As Range, j&
Set T = [Tableau3] 'tableau structuré
rc = T.Rows.Count
Application.ScreenUpdating = False
For i = 1 To rc
    If Not T.Rows(i).Hidden Then 'lignes visibles
        dat = T(i, 2)
        On Error Resume Next
        coll.Add dat, CStr(dat)
        If Err = 0 Then
            Set P = T.Rows(i)
            For j = i + 1 To rc
                If Not T.Rows(j).Hidden Then If T(j, 2) = dat Then Set P = Union(P, T.Rows(j))
            Next j
            T.Parent.PageSetup.PrintArea = P.Address 'zone d'impression
            'T.Parent.PrintOut ' pour imprimer
            T.Parent.PrintPreview 'aperçu
        End If
    End If
Next i
T.Parent.PageSetup.PrintArea = ""
End Sub

Sub Fichier_PDF()
Dim t0, T As Range, rc&, i&, dat, coll As New Collection, P As Range, j&, n&
t0 = Timer
Set T = [Tableau3] 'tableau structuré
rc = T.Rows.Count
Application.ScreenUpdating = False
Workbooks.Add 'classeur vierge auxiliaire qui devient le fichier actif
For i = 1 To rc
    If Not T.Rows(i).Hidden Then 'lignes visibles
        dat = T(i, 2)
        On Error Resume Next
        coll.Add dat, CStr(dat)
        If Err = 0 Then
            Set P = T.Rows(i)
            For j = i + 1 To rc
                If Not T.Rows(j).Hidden Then If T(j, 2) = dat Then Set P = Union(P, T.Rows(j))
            Next j
            n = n + 1
            With Sheets.Add(, Sheets(Sheets.Count), 1) 'ajoute une feuille
                .Name = "Page" & n
                T.Rows(0).Copy .Cells(1)
                For j = 1 To .UsedRange.Columns.Count: .Columns(j).ColumnWidth = T(1, j).ColumnWidth: Next j 'largeurs des colonnes
                P.Copy
                .Cells(2, 1).PasteSpecial xlPasteValues 'collage spécial
                .Cells(2, 1).PasteSpecial xlPasteFormats
                .UsedRange.RowHeight = 30 'hauteur des lignes
                With .PageSetup
                    .PrintTitleRows = "$1:$1"
                    .Orientation = xlLandscape
                    .Zoom = False
                    .FitToPagesWide = 1 '1 page en largeur
                    .FitToPagesTall = 2 '2 pages en hauteur
                End With
            End With
        End If
    End If
Next i
Sheets("Page1").Select
For i = 2 To n: Sheets("Page" & i).Select False: Next i 'sélection multiple
ActiveSheet.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\Fichier PDF.pdf" 'création du PDF
ActiveWorkbook.Close False 'fermeture du classeur auxiliaire
MsgBox "Fichier PDF de " & n & " page" & IIf(n > 1, "s", "") & " créé en " & Format(Timer - t0, "0.00 \sec")
End Sub
 

Pièces jointes

Dernière édition:
J'ai arrêté avec Chat GPT, sa 1ère solution fonctionne mais il n'arrive pas à ne faire qu'un seul fichier.
Si jamais tu y arrives 😉 tu auras battu chatgpt 😉
Eurêka ! J'ai fait un bond (voir pièce jointe), j'ai battu cette stupidité de pseudo "intelligence" artificielle ! 🤓


T'inquiète prend ton temps.
Suis en long weekend je ne reprends que mercredi 😉
Youpi, j'ai deux jours d'avance !


Admettons que je veuille imprimer en PDF, du coup il m'imprime 1 fichier par jour au lieu de me faire 1 fichier pour tous les jours.
Avec ma nouvelle proposition, si tu imprimes en PDF, tu n'as bien qu'un seul fichier tout comme avec mes propositions précédentes.



⚠️ Bon, c'est super hyper méga lent (pas loin de 10 secondes par journée à imprimer !... 😱), mais ça fonctionne.
Ou du moins ça fonctionne avec le tableau que tu as donné. Il faudrait tester avec beaucoup plus de données, de façon à obtenir un tableau sur 2 pages pour une journée.



Noter que la prévisualisation ne fonctionne pas.
Ca semble venir du fait qu'il y a plusieurs feuilles du classeur dans ladite prévisualisation.

Remarque : j'ai laissé des bouts de code qui ne servent à rien. Ca me sert juste d'aide mémoire...
 

Pièces jointes

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

Retour