Saut de page conditionnel

Bonjour à tous,

Je souhaite ajouter un saut de page dès lors que le mot "SAUT" apparaît dans la colonne A.

Après quelques recherches sur des forums, j'ai trouvé cette solution :

Sub SautDePage()

ActiveSheet.ResetAllPageBreaks

Dim R As Range

Dim Adr As String

    Application.ScreenUpdating = False

    With Sheets("Feuil1")

        Set R = .Columns(1).Find("SAUT")

        If R Is Nothing Then Exit Sub

        Adr = R.Address

        Do

            .HPageBreaks.Add R.Offset(1, 0)

            Set R = .Columns(1).FindNext(R)

        Loop While Not R Is Nothing And R.Address <> Adr

    End With

    Application.ScreenUpdating = True

End Sub

Cela fonctionne bien si et seulement si le mot "SAUT" est écrit textuellement dans la cellule.

En revanche, si au lieu d'écrire le mot "SAUT", j'ajoute une formule conditionnelle ( ex : =SI(B1="";"";"SAUT") ) dans la colonne A, cela ne fonctionne plus.

Je pense avoir localisé le problème : La fonction "Find" recherche le mot dans la cellule (et non le résultat de la cellule).

Malheureusement, mes compétences VBA étant très limitées, je ne sais pas comment faire...

Merci d'avance,

Romain

Bonjour,

à tester,

Set R = .Columns(1).Find(What:="SAUT", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlWhole)

ps/ expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

si tu n'indique pas le nom des Paramètres

il faut mettre tous les virgules

par exemple pour ajouter le Paramètre MatchCase

Set R = .Columns(1).Find("SAUT", Range("A1"), xlValues, xlWhole,,,True)

Bonjour SabV,

Merci de ce retour.

Entre temps, j'ai testé ce code :

Set R = .Columns(1).Find("SAUT", LookIn:=xlValues)

Ça semble fonctionner... du coup, je me demande ce qu'apportent les autres paramètres que tu proposes ?

Merci,

Romain

Bonjour,

J'ai une question subsidiaire :

La macro fonctionne bien sur la feuille nommée.

Si je souhaite que cette macro s'applique aussi à d'autres feuilles, comment dois-je l'écrire (ce que j'ai testé ne fonctionne pas) ?

Merci,

rom3210

Bonjour,

je souhaite que cette macro s'applique aussi à d'autres feuilles

à toutes les feuilles ou à des feuilles (prédéteminées) ou à la feuille active uniquement ?

Bonjour sabV,

Si possible, je veux bien les deux situations pour bien comprendre la mécanique :

  • toutes les feuilles du classeur
  • les feuilles prédéterminées

Merci,

Romain

Bonjour Romain,

voici l'exemple,

Sub SautDePage()

ActiveSheet.ResetAllPageBreaks
Dim R As Range
Dim Adr As String
Application.ScreenUpdating = False

'pour tous les onglets du classeur
For Each f In Worksheets

  'ou bien pour les onglets électionnés
  'For Each f In ActiveWorkbook.Windows(1).SelectedSheets

    With Sheets(f.Name)
        Set R = .Columns(1).Find("SAUT")
        If R Is Nothing Then Exit Sub
        Adr = R.Address
        Do
            .HPageBreaks.Add R.Offset(1, 0)
            Set R = .Columns(1).FindNext(R)
        Loop While Not R Is Nothing And R.Address <> Adr
    End With

Next

Application.ScreenUpdating = True
End Sub

Sub Reset_PageBreaks()
For Each f In Worksheets
 With Sheets(f.Name)
  ActiveSheet.ResetAllPageBreaks
 End With
Next
End Sub

Re-

Merci de cette réponse, je vais tester.

Par contre, pour la seconde solution, j'ai mal dû m'exprimer : je souhaite les nommer dans le code VBA (sans avoir besoin de les sélectionner au préalable).

Merci,

rom3210

Bonjour sabV et les autres,

N'ayant pas trouvé la solution pour appliquer le saut de page seulement sur certaines feuilles (cf. mon message précédent), j'ai utilisé la seconde solution pour le moment (sur l'ensemble des feuilles).

J'ai ensuite intégrer ce code dans ma macro. Cela semble fonctionner, mais un problème apparaît : mes feuilles ne sont plus protégées malgré la protection à la fin de la macro.

En résumé :

  • comment faire pour que la macro "saut de page conditionnelle" puisse s'appliquer qu'aux feuilles préalablement nommée (ex : Feuille 1, Feuille 2) ?
  • comment faire pour que l'ensemble des feuilles (toutes) soient protégées à la fin de l’exécution de la macro ?

Mon code peut probablement être amélioré (pour éviter les redondances, par exemple) mais n'étant pas un crac du VBA, c'est ce que je fais de mieux

Merci d'avance,

rom3210

Sub Masquer()

' Déprotection de l'ensemble des feuilles du classeur
    For i = 1 To Sheets.Count
    Sheets(i).Unprotect Password:="monmotdepasse"
    Next

'Désactive l'actualisation de l'écran (pour accélérer l'exécution de la macro)
Application.ScreenUpdating = False

'Afficher

    Sheets("Feuille 1").Activate
    Rows("1:999").Select
    Selection.EntireRow.Hidden = False
    Range("A1").Select

    Sheets("Feuille 2").Activate
    Rows("1:999").Select
    Selection.EntireRow.Hidden = False
    Range("A1").Select

'Masquer / Feuille 1

    Dim ws As Worksheet

    Set ws = Sheets("Feuille 1")

    Dim cel As Range
    For Each cel In ws.Range("AO1:AO200")
    If cel = "" Then
    cel.EntireRow.Hidden = True
    End If
    Next

'Masquer / Feuille 2

    Set ws = Sheets("Feuille 2")

    For Each cel In ws.Range("AO1:AO200")
    If cel = "" Then
    cel.EntireRow.Hidden = True
    End If
    Next

Sheets("Feuille 1").Activate
Range("A1").Select

'Saut de page conditionnel

ActiveSheet.ResetAllPageBreaks

Dim R As Range

Dim Adr As String

For Each f In Worksheets

    With Sheets(f.Name)
        Set R = .Columns(1).Find("SAUT")
        If R Is Nothing Then Exit Sub
        Adr = R.Address
        Do
            .HPageBreaks.Add R.Offset(1, 0)
            Set R = .Columns(1).FindNext(R)
        Loop While Not R Is Nothing And R.Address <> Adr

    End With

Next

'Réactive l'actualisation de l'écran
Application.ScreenUpdating = True

' Protection de l'ensemble des feuilles du classeur
    For i = 1 To Sheets.Count
    Sheets(i).Protect Password:="monmotdepasse"
    Next

End Sub
Rechercher des sujets similaires à "saut page conditionnel"