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 SubCela 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 SubRe-
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