Sub ImpressionRectoJour_Stable()
Dim TS As ListObject
Dim MesDates As Range, NewCel As Range, OldCel As Range
Dim Debut As Boolean
Dim ws As Worksheet
Dim PlageJour As Range
Dim DebutJour As Long, FinJour As Long
Dim dlgResult As Boolean
' Vérifie la feuille
Set ws = ActiveSheet
If ws.Name <> "Feuille pour factu" Then Exit Sub
' Récupère le tableau et les cellules visibles de la colonne 2
Set TS = ws.ListObjects(1)
On Error GoTo ErrNoVisible
Set MesDates = TS.ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
' --- Configuration de l'impression (avant boîte d'impression) ---
With ws.PageSetup
.PrintTitleRows = TS.HeaderRowRange.Address
.PrintTitleColumns = ""
.CenterHorizontally = True
.CenterVertically = False
End With
' --- Ouvre le panneau d'impression pour choisir l'imprimante ---
dlgResult = Application.Dialogs(xlDialogPrinterSetup).Show
If dlgResult = False Then
MsgBox "Sélection d'imprimante annulée. Aucune impression lancée.", vbInformation
Exit Sub
End If
' Supprime les anciens sauts de page
ws.ResetAllPageBreaks
' --- Impression jour par jour ---
Debut = True
DebutJour = 0
For Each NewCel In MesDates
If Debut Then
Set OldCel = NewCel
DebutJour = NewCel.Row
Debut = False
Else
If NewCel.Value <> OldCel.Value Then
' Impression du jour précédent
FinJour = OldCel.Row
Set PlageJour = ws.Rows(DebutJour & ":" & FinJour)
PlageJour.PrintOut
' Ajout d'un saut de page avant le nouveau jour pour forcer le recto
ws.HPageBreaks.Add Before:=ws.Rows(NewCel.Row)
' Nouveau jour
DebutJour = NewCel.Row
Set OldCel = NewCel
Else
Set OldCel = NewCel
End If
End If
Next NewCel
' Impression du dernier jour
If DebutJour > 0 Then
FinJour = OldCel.Row
Set PlageJour = ws.Rows(DebutJour & ":" & FinJour)
PlageJour.PrintOut
End If
MsgBox "Impression terminée : chaque jour commence sur un recto.", vbInformation
Exit Sub
ErrNoVisible:
MsgBox "Aucune cellule visible trouvée dans la 2ème colonne du tableau.", vbExclamation
End Sub