Option Explicit
Sub ImpressionZones()
' Nota : Actuellement, es utilisés HPageBreaks(3) et HPageBreaks(7).
' On pourrais créer un tableau de numéros de saut pour gérer N zones dynamiquement.
'
' Orientation et PrintArea
' Après ResetPageSetup, je redéfinis Orientation pour chaque zone = Bonne Procédure.
' L’ordre PrintArea + Orientation est important pour éviter les recalculs de saut = c'est respecté.
'
Dim wb As Workbook
Dim ws As Worksheet
Dim Adr1 As Range
Dim Adr2 As Range
Dim rep As VbMsgBoxResult
Set wb = Workbooks(ActiveWorkbook.Name)
Set ws = wb.Worksheets(ActiveSheet.Name)
'====================================================
' 1) PREMIÈRE ZONE : de A1 au saut de page n°3
'====================================================
' === Correction Microsoft : FORCER Excel à calculer les sauts ===
Call ResetPageSetup(ws)
Call ForcePageBreaks(ws)
' Supprimer ancienne vue si elle existe
On Error Resume Next
wb.CustomViews("Vue1").Delete
On Error GoTo 0
If ws.HPageBreaks.Count < 3 Then
MsgBox "Moins de 3 sauts de pages ? Zone 1 impossible", vbCritical
Exit Sub
End If
' Appliquer l'orientation
ws.PageSetup.Orientation = xlLandscape
' Récupération des positions des sauts
Set Adr1 = ws.Range("A1")
Set Adr2 = ws.HPageBreaks(3).Location.Offset(-1, 0)
' Définir la zone d'impression
ws.PageSetup.PrintArea = ws.Range(Adr1, Adr2).Address
' Créer la vue
wb.CustomViews.Add "Vue1", True, True
' Réinitialise les variables
Set Adr1 = Nothing: Set Adr2 = Nothing
'====================================================
' 2) DEUXIÈME ZONE : entre le saut n°3 et le saut n°7
'====================================================
' === Correction Microsoft : FORCER Excel à calculer les sauts ===
Call ResetPageSetup(ws)
Call ForcePageBreaks(ws)
' Supprimer ancienne vue si elle existe
On Error Resume Next
wb.CustomViews("Vue2").Delete
On Error GoTo 0
If ws.HPageBreaks.Count < 7 Then
MsgBox "Moins de 7 sauts de pages ? Zone 2 impossible", vbCritical
Exit Sub
End If
' Appliquer l'orientation
ws.PageSetup.Orientation = xlPortrait
' Récupération des positions des sauts
Set Adr1 = ws.HPageBreaks(3).Location
Set Adr2 = ws.HPageBreaks(7).Location.Offset(-1, 0)
' Définir la zone d'impression
ws.PageSetup.PrintArea = ws.Range(Adr1, Adr2).Address
' Créer la vue
wb.CustomViews.Add "Vue2", True, True
' Réinitialise les variables
Set Adr1 = Nothing: Set Adr2 = Nothing
'====================================================
' 3) Aperçu + impression des vues ( 1 et 2 )
'====================================================
' Show --->>> Vue1
'==================
wb.CustomViews("Vue1").Show
ws.PrintPreview
rep = MsgBox("Imprimer la Vue 1 ?", vbYesNo)
If rep = vbYes Then
' Impression de la Vue1
ws.PrintOut From:=1, To:=3
End If
' Show --->>> Vue2
'==================
wb.CustomViews("Vue2").Show
ws.PrintPreview
rep = MsgBox("Imprimer la Vue 2 ?", vbYesNo)
If rep = vbYes Then
ws.PrintOut From:=5, To:=7
End If
End Sub
Private Sub ForcePageBreaks(ws As Worksheet)
' RESTAURE la feuille avant de calculer une autre zone
' comment définir la zone d’impression sur la zone active de la feuille
ws.PageSetup.PrintArea = ""
'Cette méthode redéfinit tous les sauts de page de la feuille de calcul spécifiée.
ws.ResetAllPageBreaks
' FORCE LE CALCUL DES SAUTS DE PAGES (MS BUG FIX)
ws.UsedRange.Cells(ws.UsedRange.Cells.Count).Select
ws.DisplayPageBreaks = True
DoEvents
End Sub
Sub ResetPageSetup(ws As Worksheet)
With ws.PageSetup
' Marges
.LeftMargin = Application.InchesToPoints(0.7)
.RightMargin = Application.InchesToPoints(0.7)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
' Orientation & papier
.Orientation = xlPortrait
.PaperSize = xlPaperA4
' Échelle
.Zoom = 100
.FitToPagesWide = False
.FitToPagesTall = False
' Centrage
.CenterHorizontally = False
.CenterVertically = False
' Impressions
.PrintGridlines = False
.PrintHeadings = False
.PrintTitleRows = ""
.PrintTitleColumns = ""
' Zone d'impression
.PrintArea = ""
' Premier numéro de page
.FirstPageNumber = xlAutomatic
' En-têtes et pieds de page
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = ""
End With
'MsgBox "Mise en page réinitialisée pour la feuille : " & ws.Name
End Sub