Saut de page

Bonsoir,

Les feuilles de 1 à 7, représentent le résultat d'une macro. Utilisant une userform, pour extraire d'une bd des données pour reconstituer des formulaires à imprimer. Ce formulaire est formé de 3 parties: en-tête (ligne 1 et 3); 1er tableau (ligne 4 à 4+nb de postes); 2ème tableau (ligne dernière ligne du 1er tableau+1 à dernière ligne).

Les cellules du tableau2 (col2) sont fusionnées. Les lignes 1 jusqu'à l'en-tête du 2ème tableau seront reprises sur toutes les pages.

Je voudrais par macro agir sur les sauts de page, afin d'éviter le tronquage des cellules fusionnées, c'est le cas de la feuille1.

Dans ce cas la dernière ligne est mise sur la 2ème page et du coup on n'a plus la désignation (colonne 2).

Comment déplacer le saut de page par rapport aux lignes des cellules fusionnées.

En vous remerciant par avance.

75saut-de-page.xlsm (30.50 Ko)

Salut,

Dans le fichier ci-joint, si tu imprimes les Feuil1 et Feuil2 normalement, tu as des sauts-de-page qui te dérangent.

Si tu lances l’impression des Feuil1 à Feuil7 par le bouton en place sur la Feuil8, les sauts-de-page sont corrigés selon tes souhaits, j’espère.

Cordialement.

Bonsoir Yvouille,

Je te remercie beaucoup pour ton aide. Je n'ai pas compris le fonctionnement de ton code. Par exemple ton ecriture Range(j) que je n'ai jamais rencontré. Ton code donne répond assez bien à mon problème, sauf pour la feuil1. Pourquoi, y-a-t-il 2 sauts de page? le premier saut est à la ligne 19 alors que pour les autres feuilles, il se situe entre 23 et 36.

Y aurait-il un moyen pour y remédier? En fixant par exemple le nombre de lignes par page.

Dans ton code j'ai juste rajouté pour gérer les lignes du haut à répéter sur toutes les pages.

Option Explicit

Private Sub CommandButton1_Click()
Dim i As Byte, j As String, k As Byte, L As Byte
Application.ScreenUpdating = False

For k = 1 To Sheets.Count
   If Sheets(k).Name <> "Feuil8" Then
        Sheets(k).Activate

'lignes du haut à repeter sur chaque feuille'''''''''''''''''''''''''''''''''''
    L = ActiveSheet.Columns("A").Find("Repères", lookat:=xlWhole).Row
    ActiveSheet.PageSetup.PrintTitleRows = "$1:$" & L
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ActiveWindow.View = xlPageBreakPreview

        For i = 1 To 2 '100 ' Pour 100 sauts de page possibles
            On Error Resume Next
            j = ActiveSheet.HPageBreaks(i).Location.Address

            If j = "" Then GoTo Etiquette
            If Range(j).Offset(0, 1) = "" Then
                Sheets(k).Range(j).Activate
                Do
                ActiveCell.Offset(-1, 0).Activate
                Loop Until ActiveCell.Offset(0, 1) <> ""
            End If
            Set ActiveSheet.HPageBreaks(i).Location = ActiveCell
            j = ""
       Next i

Etiquette:

        ActiveSheet.PrintOut
        ActiveWindow.View = xlNormalView
    End If ' Sheets(k).Name <> "Feuil8"
Next k
Sheets("Feuil8").Activate
End Sub

Merci beaucoup. Bonne soirée.

Re,

Pour comprendre une macro, tu devrais utiliser les points d’arrêt et le pas à pas. C’est d’une très grande aide. Regarde à ce sujet le fil ci-après https://forum.excel-pratique.com/cours-astuces/methodes-point-d-arret-et-pas-a-pas-t59460.html?hilit=arrêt

Dans ma macro je recherche l’adresse de tous les sauts-de-page de la feuille à l’aide de l’instruction j = ActiveSheet.HPageBreaks(i).Location.Address. J prend alors une valeur du genre "$A$33".

Si tu affectes cette valeur à un Range(j), ça correspond au Range("$A$33").

En utilisant la méthode du pas-à-pas, tu verrais par exemple que j prend telle ou telle valeur.

Dans le fichier que je t’ai retourné, j’ai placé manuellement des sauts-de-page un peu au petit bonheur la chance afin de voir comment ma macro les déplaçait au début d’un groupe de cellule fusionnées. Il se peut donc que j’en ai placé un trop haut ou trop bas. Teste plutôt ta macro sur tes feuilles à toi, avec la mise en place des sauts-de-page effectués par Excel.

Si tu as d’autres questions, indique précisément quelle partie du code te crée soucis.

Amicalement.

Bonjour Yvouille,

Je te remercie pour ton aide et tes conseils. J'ai compris grâce à toi (le pas à pas) comment fonctionne ton code.

Au code il manquait juste une instruction pour qu'il fonctionne parfaitement.

ActiveSheet.ResetAllPageBreaks 'RAZ

Pour le partage ce code fonctionne bien, mais au préalable on renseigne le nombre de lignes max par page. Je l'ai mis en dur dans mon cas, mais on peut ajouter une inputbox

Option Explicit

Sub Imprimer()
Dim Nlig As Byte, i As Byte, L As Byte, j As Byte
Nlig = 40   'nombre maximum de lignes d'une page
For j = 1 To 7
Sheets(j).Activate
With ActiveSheet
'lignes du haut à repeter sur chaque feuille'''''''''''''''''''''''''''''''''''
    L = ActiveSheet.Columns("A").Find("Repères", lookat:=xlWhole).Row
    ActiveSheet.PageSetup.PrintTitleRows = "$1:$" & L
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  .ResetAllPageBreaks 'RAZ
  i = 1
  While Application.CountA(Cells(i, "B").Resize(.Rows.Count - i + 1))
    i = i + 40
    i = .Cells(i, "B").MergeArea.Row
    .HPageBreaks.Add .Rows(i)
  Wend
  .PrintOut 'impression
End With
Next j
End Sub

Merci beaucoup et bonne fin de semaine.

Salut,

Je ne comprends pas très bien ni la nécessité de remettre à zéro les sauts-de page en début de macro, ni la nécessité d’indiquer le nombre de ligne maximum par page puisque sans intervention préalable sur les sauts-de-page – comme je l’avais fait pour mon fichier-test – Excel place lui-même les sauts-de-page et fixe lui-même le nombre de lignes maximum en fonction de la détermination de tes marges de base.

Mais, bon, si ça te convient ainsi ……

Chaleureusement.

Re,

Le fichier joint à la discussion, était pour illustrer différents cas de figures des résultats obtenus par macro sur la même feuille; d'où la nécessité d'enlever les précédents sauts de page.

Pour ce qui est de ton premier, je te confirme que par exemple pour la feuille1, le nombre de page était de 3. Mais en supprimant les sauts de page au début de la macro, on obtient 2 pages au lieu de 3.

J'ai donc adapté ton code à mon fichier original, en ajoutant au début de ta macro <<ActiveSheet.ResetAllPageBreaks 'RAZ >>.

Ainsi, c'est parfait pour moi.

Merci et bon week-end.

CP4 a écrit :

Pour ce qui est de ton premier, je te confirme que par exemple pour la feuille1, le nombre de page était de 3. Mais en supprimant les sauts de page au début de la macro, on obtient 2 pages au lieu de 3.

Je maintiens que les sauts-de-page de mon fichier-test avait été modifiés manuellement et que je ne vois pas l’utilité de remettre à zéro les saut-de-page d’un fichier qui n'aurait pas été modifié manuellement.

Mais, bon, si ça te convient ainsi ……

Très bonne continuation.

Rechercher des sujets similaires à "saut page"