Microsoft 365 VBA erreur sauts de page ?

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 !

danielco

XLDnaute Barbatruc
Bonjour,

J'ai une feuille avec 16 sauts de page automatiques. L'instruction :

VB:
Debug.Print .HPageBreaks.Count

retourne 16

et l'instruction :

Code:
Set Adr2 = .HPageBreaks(7).Location

renvoie l'erreur d'exécution 9, l'indice n'appartient pas à la sélection.

Avez-vous une explication ?

Merci d'avance.

Daniel
 

Pièces jointes

ce ne sont pas des"ranges"mais des "objets"
Enrichi (BBcode):
Dim Adr1 As Object, Adr2 As Object
ou
Dim Adr1, Adr2
Bonjour et merci,

Cependant, j'ai la même erreur avec :

Sub test()
With ActiveSheet
For i = 1 To .HPageBreaks.Count
Set Var = .HPageBreaks(i).Location
Next i
End With
End Sub

Capture d'écran 2025-11-20 190225.png


Daniel
 
Bonjour et merci,

Cependant, j'ai la même erreur avec :

Sub test()
With ActiveSheet
For i = 1 To .HPageBreaks.Count
Set Var = .HPageBreaks(i).Location
Next i
End With
End Sub

Regarde la pièce jointe 1225021

Daniel
Bonsoir,

essaie ceci:
VB:
Sub test()
    Dim i As Integer
    Dim Var As Range

    With ActiveSheet
        If .HPageBreaks.Count > 0 Then
            For i = 1 To .HPageBreaks.Count
                Set Var = .HPageBreaks(i).Locatio
            Next i
        Else
            MsgBox "Aucun saut de page horizontal trouvé."
        End If
    End With
End Sub
 
Bonjour,

le VBA code selon moi :
Titre : Impression par zones avec vues personnalisées

Description :
Ce script VBA permet de définir plusieurs zones d’impression dans une feuille Excel, basées sur les sauts de page horizontaux, de créer des vues personnalisées pour chaque zone, et d’afficher un aperçu avant impression. Les marges, orientations et sauts de page sont automatiquement réinitialisés pour assurer la stabilité et la précision de l’impression.

VB:
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
 
Bonjour,

le VBA code selon moi :
Titre : Impression par zones avec vues personnalisées

Description :
Ce script VBA permet de définir plusieurs zones d’impression dans une feuille Excel, basées sur les sauts de page horizontaux, de créer des vues personnalisées pour chaque zone, et d’afficher un aperçu avant impression. Les marges, orientations et sauts de page sont automatiquement réinitialisés pour assurer la stabilité et la précision de l’impression.

VB:
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
Bonjour
Je te remerccie beaucoup.Je le testerai ce soir. Je n'avais pas finalisé le code en dessous de l'erreur.
Daniel
 
Bonjour,

le VBA code selon moi :
Titre : Impression par zones avec vues personnalisées

Description :
Ce script VBA permet de définir plusieurs zones d’impression dans une feuille Excel, basées sur les sauts de page horizontaux, de créer des vues personnalisées pour chaque zone, et d’afficher un aperçu avant impression. Les marges, orientations et sauts de page sont automatiquement réinitialisés pour assurer la stabilité et la précision de l’impression.

VB:
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
Bonjour,
Merci, je l'ai adapté à mon vrai classeur.
Daniel
 
- 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

Réponses
3
Affichages
253
Réponses
15
Affichages
17 K
Retour