XL 2010 Editer en pdf dernière page Sans "les lignes à répéter du haut"

cathodique

XLDnaute Barbatruc
Bonjour:),

Une feuille à éditer en PDF (ou imprimer ), sur laquelle une entête à reproduire sur toutes les pages sauf la dernière qui contient un petit encadré.
Je parvins à gérer les sauts de page mais je n'ai aucune idée pour ne pas imprimer l’entête sur la dernière page.
VB:
Option Explicit
Sub mep()
    Dim dl As Long, col As Byte, HPage As Integer, VPage As Byte, x As Integer
    ActiveWindow.View = xlPageBreakPreview

    With ActiveSheet
        dl = .UsedRange.Rows.Count
        .ResetAllPageBreaks
        .PageSetup.PrintArea = "A1:k" & dl
        .PageSetup.PrintTitleRows = "$1:$4"
        HPage = .HPageBreaks.Count
        VPage = .VPageBreaks.Count
      
        If VPage >= 1 Then .VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
      
        If HPage >= 1 Then
            For x = dl To 1 Step -1
                If .Cells(x, 9).Borders(xlEdgeTop).LineStyle = xlContinuous Then
                    .HPageBreaks.Add Before:=Range("A" & x - 1)
                    Exit For
                End If
            Next x
        End If
    End With
    ActiveWindow.View = xlNormalView
End Sub
Merci pour votre aide.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
et oui mais visiblement on peut pas enlever l'entete sur la derniere page
je suis en train de tester une autre solution
Merci Patrick de me consacrer de ton temps. Si ça peut t'inspirer une solution. Pour éditer plusieurs, j'utilisais ce code au boulot, pour faire un rapport constitué de 3 feuilles en 1 seul fichier pdf.
VB:
Sub En_PDF()
Dim Chemin As String, MonFichier As String, Ch As String
Application.ScreenUpdating = False

Ch = ThisWorkbook.Path
Chemin = Ch & "\Contrôle"
MonFichier = Chemin & "\" & "Rapport CP" & " " & Sheets("bd").Range("C2") & ".pdf"

txt = Dir(MonFichier)
If txt = "" Then
   Sheets(Array("A", "B", "C")).Select '***choix des feuilles'
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=MonFichier, Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
Else
    End
 End If
MsgBox "Opération terminée!"
End Sub
 

patricktoulon

XLDnaute Barbatruc
oui c'est ce que j'etait en train de voir justement
reconstruire une feuille avec chaque tableau page +entete ou sur plusieur pages

teste ceci et dis moi si ce que dis le message est bon pour toi
VB:
Sub test()
    debut = 5
    With ActiveSheet
        dl = .UsedRange.Cells(.UsedRange.Cells.Count).Row    'Là on est sur!!!!
        For i = 5 To dl
            If .Rows(i).PageBreak <> xlNone Then texte = texte & "entete : A1:K4 ; page " & "A" & debut & ":K" & i - 1 & vbCrLf: debut = i
        Next
         texte = texte & "pas d'entete : page " & "A" & debut & ":K" & dl

    End With
MsgBox texte
End Sub
 

cathodique

XLDnaute Barbatruc
oui c'est ce que j'etait en train de voir justement
reconstruire une feuille avec chaque tableau page +entete ou sur plusieur pages

teste ceci et dis moi si ce que dis le message est bon pour toi
VB:
Sub test()
    debut = 5
    With ActiveSheet
        dl = .UsedRange.Cells(.UsedRange.Cells.Count).Row    'Là on est sur!!!!
        For i = 5 To dl
            If .Rows(i).PageBreak <> xlNone Then texte = texte & "entete : A1:K4 ; page " & "A" & debut & ":K" & i - 1 & vbCrLf: debut = i
        Next
         texte = texte & "pas d'entete : page " & "A" & debut & ":K" & dl

    End With
MsgBox texte
End Sub
Voici une capture d’écran
1612000144706.png
 

patricktoulon

XLDnaute Barbatruc
et bien maintenant tu sais comment faire
soit un addsheet puis dans la boucle copy destination ( entete + plage)plus add hpagebreak a chaque tour sur le usedrange(methode patrick(important!!!!))

ou
créer autant de sheets que de plage et copy destination entete + plage

et enfin selection l'array de sheet puis save as pdf

fait le et je le fait de mon coté ;) (je teste le plus facile en premier [chaque plage sur une feuille différente])
 

cathodique

XLDnaute Barbatruc
et bien maintenant tu sais comment faire
soit un addsheet puis dans la boucle copy destination ( entete + plage)plus add hpagebreak a chaque tour sur le usedrange(methode patrick(important!!!!))

ou
créer autant de sheets que de plage et copy destination entete + plage

et enfin selection l'array de sheet puis save as pdf

fait le et je le fait de mon coté ;) (je teste le plus facile en premier [chaque plage sur une feuille différente])
Non Patrick, je ne veux pas ajouter de feuilles. Merci beaucoup, je vais essayer de creuser du côté de l'édition de plusieurs plages dans un seul PDF. Est-ce possible? Je ne sais pas encore🔦☺️.

Bonne journée.
 

cathodique

XLDnaute Barbatruc
ben avec save As tu va être obligé
trouillard!!!!! 🤣 ;)
tiens regarde
Je te remercie beaucoup. Je connais bien tes capacités. Mais je veux pas ajouter de feuilles.
J'étais entrain d'exploiter ton code pour récupérer les pages dans des variables plages (je n'ai pas encore réussi).
Car, j'ai trouvé un code de Kiki29 qui pourrait convenir. ICI
VB:
Option Explicit
 
Sub Tst()
Dim Rg As Range
    Set Rg = Application.Union(Range("Plage_01"), Range("Plage_02"), Range("Plage_03"))
    Rg.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
                           ThisWorkbook.Path & "\" & "Test.pdf", _
                           Quality:=xlQualityStandard, _
                           IncludeDocProperties:=True, _
                           IgnorePrintAreas:=False, _
                           OpenAfterPublish:=False
    Set Rg = Nothing
End Sub
Encore merci.

Bon appétit😉
 

patricktoulon

XLDnaute Barbatruc
re
et oui mais je sais pas si avec union tu pourra faire
Set Rg = Application.Union(range("entete"),Range("Plage_01"), range("entete"),Range("Plage_02"), range("entete"),Range("Plage_03"),range("plage_04"))

a tester ;)
pour info dans mon model tout est supprimé a la fin il revient a l'original
 

cathodique

XLDnaute Barbatruc
re
et oui mais je sais pas si avec union tu pourra faire
Set Rg = Application.Union(range("entete"),Range("Plage_01"), range("entete"),Range("Plage_02"), range("entete"),Range("Plage_03"),range("plage_04"))

a tester ;)
Re,
et oui, à tester.
Cependant, étant que le nombre de pages n'est pas connu au préalable. Donc, il faut créer les plages que je n'ai pas encore réussi à faire. Et, madame se met de la partie... c'est le moment de manger🤬 me dit-elle.

Allez à toute à l'heure. 😉
 

patricktoulon

XLDnaute Barbatruc
ok bon app
pour info
j'ai testé ça ne fonctionne pas l’entête est uni aux plages qu'une fois en premier et il n'y a plus de saut de pages
VB:
Option Explicit
 
Sub Tst()
Dim Rg As Range
    Set Rg = Application.Union(Range("A1:K4"), Range("A5:k10"), Range("A1:K4"), Range("A11:k15"), Range("A1:K4"), Range("A16:k20"), Range("A21:k29"))
    Rg.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
                           ThisWorkbook.Path & "\" & "Test.pdf", _
                           Quality:=xlQualityStandard, _
                           IncludeDocProperties:=True, _
                           IgnorePrintAreas:=False, _
                           OpenAfterPublish:=False
    Set Rg = Nothing
End Sub

WRONG WAY !!!!!
;)
 

cathodique

XLDnaute Barbatruc
ok bon app
pour info
j'ai testé ça ne fonctionne pas l’entête est uni aux plages qu'une fois en premier et il n'y a plus de saut de pages
VB:
Option Explicit

Sub Tst()
Dim Rg As Range
    Set Rg = Application.Union(Range("A1:K4"), Range("A5:k10"), Range("A1:K4"), Range("A11:k15"), Range("A1:K4"), Range("A16:k20"), Range("A21:k29"))
    Rg.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
                           ThisWorkbook.Path & "\" & "Test.pdf", _
                           Quality:=xlQualityStandard, _
                           IncludeDocProperties:=True, _
                           IgnorePrintAreas:=False, _
                           OpenAfterPublish:=False
    Set Rg = Nothing
End Sub

WRONG WAY !!!!!
;)
OK, WRONG WAY!
Merci beaucoup. Qui ne tente rien n'a rien!
Sur ce forum et d'autres, on disait bien qu'on pouvait tout faire en VBA.
Avec cet exemple, on pourra aussi dire que VBA à ses limites.

En tout cas, je te remercie beaucoup pour ta patience et ta pertinence.
Mais une dernière question, pourquoi dl = .UsedRange.Rows.Count renverrais une fausse une formation
et ta suggestion dl = .UsedRange.Cells(.UsedRange.Cells.Count).Row 'Là on est sur!!!!
Le "UsedRange d'un UsedRange" donne la bonne information. Je reconnais que tu as plus d'un tour dans ton sac.

Bon week-end.
 

patricktoulon

XLDnaute Barbatruc
ben c'est simple et tout bete
supposons: que ta plage utilisée commence en A4 et termine en K20 et que au dessus il n'y ai rien


donc quand tu boucle comme tu le fait ici
VB:
With ActiveSheet
        dl = . dl = .UsedRange.Rows.Count    
        For i = 5 To dl'???????????????
d'apres toi la boucle va s’arrêter a la ligne 20 ou 16

maintenant si je fait

VB:
With ActiveSheet
        dl = .UsedRange.Cells(.UsedRange.Cells.Count).Row    'Là on est sur!!!!
        For i = 5 To dl'???????????????
d’après toi la boucle va s’arrêter à 16 ou à 20

c'est bon ? ça rentre ;)
 

cathodique

XLDnaute Barbatruc
ben c'est simple et tout bete
supposons: que ta plage utilisée commence en A4 et termine en K20 et que au dessus il n'y ai rien


donc quand tu boucle comme tu le fait ici
VB:
With ActiveSheet
        dl = . dl = .UsedRange.Rows.Count   
        For i = 5 To dl'???????????????
d'apres toi la boucle va s’arrêter a la ligne 20 ou 16

maintenant si je fait

VB:
With ActiveSheet
        dl = .UsedRange.Cells(.UsedRange.Cells.Count).Row    'Là on est sur!!!!
        For i = 5 To dl'???????????????
d’après toi la boucle va s’arrêter à 16 ou à 20

c'est bon ? ça rentre ;)
Encore merci. Il faut que je fasse un test pour m'en rendre compte de moi-même. C'est en forgeant qu'on devient forgeron. Et des fois, il y a des ratées comme pour les voitures. Mais pour les voitures on peut changer les bougies. Pour nous autres humains pas possible malgré les grands avancés scientifiques😏.

MERCIIIIIIIIIIIIIIIIII
 

Statistiques des forums

Discussions
315 104
Messages
2 116 252
Membres
112 697
dernier inscrit
administratif@ets-delestr