XL 2016 Passer à la page suivante automatiquement

bennp

XLDnaute Occasionnel
Bonjour,

j'ai un tableau créé en macro, et parfois il se retrouve à la jonction de 2 pages. Quelqu'un aurait une idée pour déplacer automatiquement le tableau à la page suivante ?

Merci
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Il n'y a rien que je sache qui indique combien de lignes il tient sur une page. D'ailleurs ça dépend d'un tas de choses. C'est à vous de le fixer arbitrairement et de compter vous même dans des variables à vous combien de lignes vous allez renseigner depuis le début ou le dernier mis pour savoir s'il y a lieu d'ajouter un HPageBreak pour éviter que ce paquet soit coupé par un saut de page automatique si la fin dépasse.
 

Dranreb

XLDnaute Barbatruc
Essayez d'utiliser ces procédures, écrites dans un module séparé :
VB:
Option Explicit
Private CelDéb As Range, CelCou As Range, CelPgBk As Range, _
   NbLMaxParPage, NbLVides As Long, NbColMax As Long, Wsh As Worksheet
  
Sub InitialiserMiseEnPage(ByVal Cel As Range, ByVal NbLMaxPg As Long, NbLVid As Long)
Rem. ——— Commence un garnissage de feuille à partir de la cellule Cel
'        en précisant qu'il ne doit pas y avoir plus de NbLMaxPg lignes dans une page
'        et qu'il faut laisser NbLVid lignes devant chaque PlageSuivante.
'    Exemple :
'        InitialiserMiseEnPage ActiveSheet.Cells(13, "A"), 35, 6
Set CelDéb = Cel: Set CelCou = Cel: Set CelPgBk = Cel
NbLMaxParPage = NbLMaxPg: NbLVides = NbLVid
Set Wsh = Cel.Worksheet
CelDéb.Resize(1000000).EntireRow.Delete
Wsh.ResetAllPageBreaks
End Sub

Function PlageSuivante(TRés(), ByVal LMax As Long) As Range
Rem. ——— Verse LMax lignes du contenu de Trés dans une plage, laquelle est renvoyée
'        au programme appelant pour correction des formats et ajout de formules.
'    Exemple :
'        Dim LaPlage As Range, TR(), L As Long
'        Redim TR(1 to 1000, 1 to 11)
'        … avec dans des boucles L = L + 1
'        …   Puis des TR(L, C) = CeQueVousVoulez
'        Set LaPlage = PlageSuivante(TR, L)
'        LaPlage.Rows(3).Resize(LaPlage.Rows.Count - 2).Borders … etc.
If CelCou.Row + NbLVides + LMax - CelPgBk.Row > NbLMaxParPage Then
   Wsh.HPageBreaks.Add Before:=CelCou
Else
   Set CelCou = CelCou.Offset(NbLVides)
   End If
Set PlageSuivante = CelCou.Resize(LMax, UBound(TRés, 2))
PlageSuivante.Value = TRés
Set CelCou = CelCou.Offset(LMax)
If NbColMax < UBound(TRés, 2) Then NbColMax = UBound(TRés, 2)
End Function

Sub TerminerMiseEnPage()
Rem. ——— Termine le processus.
'        Corrige la zone d'impression et ajuste à 1 page en largeur.
Wsh.PageSetup.PrintArea = Range(CelDéb, CelCou.Offset(-1, NbColMax - 1)).Address
Wsh.PageSetup.FitToPagesWide = 1
Set CelDéb = Nothing
Set CelCou = Nothing
Set CelPgBk = Nothing
Set Wsh = Nothing
NbColMax = 0
End Sub
À tester…
 

bennp

XLDnaute Occasionnel
Hello, merci pour cette macro
ça me marque un message d'erreur

upload_2017-12-21_19-18-58.png
 

Dranreb

XLDnaute Barbatruc
Je vous avais dit d'utiliser ces procédures, écrites dans un module séparé.
En aucun cas dans une procédure.
l'instruction Option Explicit est en général la 1ère instruction d'un module.
Ensuite viennent les déclarations globales, Private et Public.
 

bennp

XLDnaute Occasionnel
ok, j'avais pas compris qu'il fallait que je lance ma procédure ..

je n'arrive pas à insérer ce que tu m'as dit en vert dans la fonction plage_suivante dans ma macro

VB:
Option Explicit
Private CelDéb As Range, CelCou As Range, CelPgBk As Range, _
   NbLMaxParPage, NbLVides As Long, NbColMax As Long, Wsh As Worksheet
 
Sub InitialiserMiseEnPage(ByVal Cel As Range, ByVal NbLMaxPg As Long, NbLVid As Long)
Rem. ——— Commence un garnissage de feuille à partir de la cellule Cel
'        en précisant qu'il ne doit pas y avoir plus de NbLMaxPg lignes dans une page
'        et qu'il faut laisser NbLVid lignes devant chaque PlageSuivante.
'    Exemple :
        InitialiserMiseEnPage ActiveSheet.Cells(13, "A"), 16, 6
Set CelDéb = Cel: Set CelCou = Cel: Set CelPgBk = Cel
NbLMaxParPage = NbLMaxPg: NbLVides = NbLVid
Set Wsh = Cel.Worksheet
CelDéb.Resize(1000000).EntireRow.Delete
Wsh.ResetAllPageBreaks
End Sub

Function PlageSuivante(TRés(), ByVal LMax As Long) As Range
Rem. ——— Verse LMax lignes du contenu de Trés dans une plage, laquelle est renvoyée
'        au programme appelant pour correction des formats et ajout de formules.
'    Exemple :
'        Dim LaPlage As Range, TR(), L As Long
'        Redim TR(1 to 1000, 1 to 11)
'        … avec dans des boucles L = L + 1
'        …   Puis des TR(L, C) = CeQueVousVoulez
'        Set LaPlage = PlageSuivante(TR, L)
'        LaPlage.Rows(3).Resize(LaPlage.Rows.Count - 2).Borders … etc.

If CelCou.Row + NbLVides + LMax - CelPgBk.Row > NbLMaxParPage Then
   Wsh.HPageBreaks.Add Before:=CelCou
Else
   Set CelCou = CelCou.Offset(NbLVides)
   End If
Set PlageSuivante = CelCou.Resize(LMax, UBound(TRés, 2))
PlageSuivante.Value = TRés
Set CelCou = CelCou.Offset(LMax)
If NbColMax < UBound(TRés, 2) Then NbColMax = UBound(TRés, 2)
End Function

Sub TerminerMiseEnPage()
Rem. ——— Termine le processus.
'        Corrige la zone d'impression et ajuste à 1 page en largeur.
Wsh.PageSetup.PrintArea = Range(CelDéb, CelCou.Offset(-1, NbColMax - 1)).Address
Wsh.PageSetup.FitToPagesWide = 1
Set CelDéb = Nothing
Set CelCou = Nothing
Set CelPgBk = Nothing
Set Wsh = Nothing
NbColMax = 0
End Sub
 

bennp

XLDnaute Occasionnel
Vu que la macro que vous m'avez proposé est trop compliquée pour moi, j'ai essayé de chercher une autre solution :
J'ai essayé de déterminé combien de tableau devaient être afficher sur ma 1ère pas, avec des formules et ça à l'air de fonctionner. Maintenant comment le mettre en vba, et dire au tableau n° X de passer à la page suivante, je sais pas. Voici mon fichier, ça peut peut-être donner des solutions.

Je sélectionne d'abord mon tableau et supprime tous les lignes vides avec une macro (remonter).

A voir...

Je reste bien sûr à l'écoute de votre 1ère proposition.

Merci encore !
 

Pièces jointes

  • forum-excel (5) (3).xlsm
    49.8 KB · Affichages: 22

Dranreb

XLDnaute Barbatruc
Bonjour.
La structure de la feuille de donnée est toujours aussi incompréhensible et forcément votre code qui en découle aussi. Qu'est-ce qui est compliqué. C'est pas difficile de mettre le résultat dans un tableau au lieu de le mettre dans des cellules et d'appeler PlageSuivante pour qu'il le mette, lui, dans des cellules, en s'occupant d'ajouter devant soit un saut de page soit des lignes vides.
 

bennp

XLDnaute Occasionnel
Bonjour, merci c'est génial !! ça à l'air d'être plus rapide que mon code (à voir avec la mise en forme des tableaux) Par contre j'ai rajouté données pour vérifier et j'ai le dernier tableau qui est à la page suivante alors qu'il devrait être à la suite de l'autre. Je ne vois pas comment modifier ça. d'autre part, les colonnes épaiseur étaient multipliées par 100 pour l'avoir en cm, vous pouvez me le rajouter svp ?
Merci beaucoup pour votre aide !
 

Pièces jointes

  • MiseEnPageBennp.xlsm
    369.2 KB · Affichages: 18

Dranreb

XLDnaute Barbatruc
Bonjour.
C'était un oubli : dans la Function PlageSuivante, derrière Set CelCou = CelCou.Offset(1) ajoutez :
VB:
   Set CelPgBk = CelCou
Par ailleurs dans TerminerMiseEnPage il y a un …Offset(-1, … qui n'était pas sans une certaine logique mais incohérent avec le reste, de sorte qu'il faut … Offset(0, … pour que le dernier total ne se retrouve plus en dehors de la zone d'impression.
On voit mieux les choses, je trouve, avec l'affichage Avec les sauts de page qu'avec le Mise en page.
Pour la multiplication par 100 profitez de son versement depuis TE(LE, 3) vers TS(LS, 3) pour le faire au passage. Ça ne vaut plus le coup de faire une boucle pour les deux qui restent. Remplacez donc la boucle des 3 C et le Next C, LE par :
VB:
   If Not IsEmpty(TE(LE, 3)) Then TS(LS, 3) = TE(LE, 3) * 100
   If Not IsEmpty(TE(LE, 4)) Then TS(LS, 4) = TE(LE, 4)
   If Not IsEmpty(TE(LE, 5)) Then TS(LS, 5) = TE(LE, 5)
   Next LE
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous n'avez pas ajouté l'instruction Set CelPgBk = CelCou pour mettre à jour la cellule de référence du dernier HPageBreak quand on en ajoute un, comme je vous l'avais dit.
Remarquez on pourrait se contenter de noter la ligne dans une variable LgnPgBk et de remplacer partout ailleurs CelPgBk.Row par LgnPgBk
 

Discussions similaires