Il va falloir vous accrocher :
- Créer un onglet : BLOCS et un tableau structuré : TableDesImpressions.
- C4 correspond à la zone nommée NbCellulesVides. C'est la valeur repère pour décider qu'un bloc est à imprimer
- C5 correspond à la zone NbLignesParPage. C'est la valeur limite de lignes à imprimer par page.
- C6 correspond à MaxImpression. C'est la dernière ligne qui sera imprimée. La valeur est mise à jour par la procédure GererLesSautsDePage
Dans l'onglet EXEMPLE : Créer les 14 zones nommées (Bloc01 à Bloc14) pour le calcul des cellules vides.
Option Explicit
Sub GererLesSautsDePage(ByVal ShImp As Worksheet, ByVal LigneDeTitre As Integer)
Dim I As Integer, J As Integer, NbLignesMax As Integer, LigneEnCours As Integer, LigneDebut As Integer, DerniereLigne As Integer
Dim AireSautsDePage As Range, AireNbLignes As Range, AireAImprimer As Range
Set AireSautsDePage = Range("TableDesImpressions[Sauts de page]")
Set AireNbLignes = Range("TableDesImpressions[Nb lignes]")
Set AireAImprimer = Range("TableDesImpressions[A imprimer]")
NbLignesMax = Range("NbLignesParPage")
LigneEnCours = 0
LigneDebut = 0
AireSautsDePage.ClearContents
For I = 1 To AireSautsDePage.Count
With AireSautsDePage(I)
LigneEnCours = LigneEnCours + AireNbLignes(I)
If LigneEnCours > NbLignesMax + LigneDebut Then
AireSautsDePage(I) = LigneEnCours - AireNbLignes(I) + LigneDeTitre + 1
LigneDebut = LigneEnCours - AireNbLignes(I)
End If
End With
Next I
With ShImp
.Activate
Application.PrintCommunication = False
.PageSetup.PrintArea = ""
Application.PrintCommunication = True
DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row
Application.Goto (.Cells(DerniereLigne, 1)), True
For J = DerniereLigne To 4 Step -1
For I = 1 To AireSautsDePage.Count
If AireSautsDePage(I).Value = J + 1 Then
.HPageBreaks.Add Before:=.Cells(J + 1, 1)
Exit For
End If
Next I
Next J
' Recherche de la dernière ligne à imprimer
For I = AireSautsDePage.Count To 1 Step -1
If AireSautsDePage(I) > 0 And AireAImprimer(I) = "Non" Then
DerniereLigne = AireSautsDePage(I) - 1
Range("MaxImpression") = DerniereLigne
End If
Next I
Application.PrintCommunication = False
With .PageSetup
.PrintTitleRows = "$1:$" & LigneDeTitre
.PrintArea = "$1:$" & DerniereLigne
End With
Application.PrintCommunication = True
.Cells(LigneDeTitre + 1, 1).Select
End With
Set AireSautsDePage = Nothing: Set AireNbLignes = Nothing: Set AireAImprimer = Nothing
End Sub
Dans le module de l'onglet "Blocs"
Option Explicit
Private Sub BoutonSautsDePage_Click()
SupprimerLesSautsDePage Sheets("EXEMPLE")
GererLesSautsDePage Sheets("EXEMPLE"), 4
End Sub