évènement "AfterPrint"

dmc

XLDnaute Occasionnel
Bonjour à tous, et amitiés
Bien sur, cet évènement n'existe pas (sauf erreur de ma part).
Comment contourne ce manque ?
pour m'expliquer, mon besoin est le suivant :
- dans l’évènement "BeforePrint", niveau "ThisWorkbook", j'enrichis avec des sous-totaux la feuille qui va être imprimée.
- après l'impression, je dois enlever ces lignes. Pour cela, j'ai placé dans le BeforePrint une variable booléenne qui m'indique qu'une impression est en cours, mais j'ignore dans quelle macro évènementielle je peux traiter cette variable dès la fin de l'impression.
Merci pour vos idées, nombreuses j'en suis sûr.
Et bon appetit
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : évènement "AfterPrint"

Bonjour dmc,

ou est le problème ?
je suppose que tu as un code pour l'impression; il te suffira d'ajouter tes lignes de code pour l'enlèvement des lignes directement après l'instruction d'impression
ta variable booléenne n'est même pas nécessaire
essaie et si ça ne va pas, mets ton fichier en pièce jointe pour y voir un peu plus clair

à+
Philippe
 

dmc

XLDnaute Occasionnel
Re : évènement "AfterPrint"

Bonjour PHLaurent
le problème, c'est que si je mets l'instruction d'impression, non seulement cela m'oblige à passer par un bouton pour déclencher la macro mais en plus je n'intercepte plus toute demande d'impression. Je souhaite absolument rester à 100% dans le décor Excel, sans ajout de boites USF ou autres.
Pour info, ci-dessous extrait des codes en place : dans "thisworbook", puis dans un module :
HTML:
Public Imprim_en_Cours As Boolean

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Imprim_en_Cours = False
'MsgBox "avant insert de sous-totaux par page"
Imprim_en_Cours = True
Call InserST(False)
End Sub

et :
HTML:
Public Sub InserST(Optional ByVal supprSautPage As Boolean) '(ByVal supprSautPage As Boolean)
Dim C As Range
Dim i As Integer

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
                'Suppression des sous-totaux
With ActiveSheet.Range("$A$1:F" & Range("C" & Application.Rows.Count).End(xlUp).Row)
    Do
        Set C = .Find(What:="-Total", _
                            After:=Cells(1, 1), LookIn:=xlValues, _
                            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                            MatchCase:=False)
        If Not C Is Nothing Then
            Cells(C.Row, "A").EntireRow.Delete
        End If
    Loop While Not C Is Nothing
End With
ActiveSheet.ResetAllPageBreaks
While ActiveSheet.HPageBreaks.Count > 0 And i < 5
    On Error Resume Next
        ActiveSheet.HPageBreaks(1).Delete       'suppression des sauts de page horizontaux
    On Error GoTo 0
    i = i + 1
Wend
'ActiveSheet.Cells.PageBreak = xlPageBreakNone
Application.ScreenUpdating = True
                ' Partie 2 : Définition auto de la zone d'impression
ActiveSheet.PageSetup.PrintArea = "$A$1:F" & Range("E" & Application.Rows.Count).End(xlUp).Row
                ' Partie 3 : gestion des sauts de page
If Not supprSautPage Then Call GestSautPage
ActiveSheet.PageSetup.PrintArea = "$A$1:F" & Range("E" & Application.Rows.Count).End(xlUp).Row
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub


Public Sub GestSautPage()
Dim ligFin As Integer, ligBas As Integer, ligTrav As Integer, colTrav As Integer
Dim Cpb As Range, PBinit As Byte
PBinit = 0

ligFin = ActiveSheet.Range("a1:a500").Find(What:="RepèreduPavéBasdeTotaux", _
                After:=Cells(1, 1), LookIn:=xlFormulas, _
                LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
                MatchCase:=False).Row - 3
ligBas = Range("E" & Application.Rows.Count).End(xlUp).Row

While PBinit <= ActiveSheet.HPageBreaks.Count
    i = PBinit + 1
    'On Error GoTo sortie
        If ActiveSheet.HPageBreaks(i).Extent = xlPageBreakPartial Then
        If ActiveSheet.HPageBreaks(i).Location.Row < ligFin Then
            ligTrav = ActiveSheet.HPageBreaks(i).Location.Row
            Range("A" & ligTrav - 1).EntireRow.Insert (xlShiftDown)
            Range("A" & ligTrav).EntireRow.Insert (xlShiftDown)
            GoSub lignesST
            ligFin = ligFin + 2
            PBinit = i
        Else
            Range("A" & ligFin).EntireRow.Insert (xlShiftDown) 'ok'
            Range("A" & ligFin).EntireRow.Insert (xlShiftDown)
            ActiveSheet.HPageBreaks.Add Before:=Range("a" & ligFin + 1)
            ligTrav = ActiveSheet.HPageBreaks(i).Location.Row
            GoSub lignesST
            ligFin = ligFin + 2
            PBinit = i
            Exit Sub
        End If
    End If
Wend
sortie: Exit Sub
lignesST:
            Cells(ligTrav - 1, "C") = "Sous-Total :"
            Cells(ligTrav - 1, "D").FormulaR1C1 = "=RC[+2]"
            Range("E" & ligTrav - 1 & ":F" & ligTrav - 1).Merge
            Cells(ligTrav - 1, "E").FormulaR1C1 = "=SUBTOTAL(9,R2C6:R[-1]C6)"
            Cells(ligTrav, "C") = "Report Sous-Total :"
            Cells(ligTrav, "D").FormulaR1C1 = "=RC[+2]"
            Range("E" & ligTrav & ":F" & ligTrav).Merge
            Cells(ligTrav, "E").FormulaR1C1 = "=SUBTOTAL(9,R2C6:R[-2]C6)"
            With Range(Cells(ligTrav - 1, "A"), Cells(ligTrav, "C"))
            .HorizontalAlignment = xlRight
            End With
            With Range(Cells(ligTrav - 1, "A"), Cells(ligTrav, "F"))
                .Interior.ColorIndex = 20
                .Font.Bold = True
            End With
            With Range(Cells(ligTrav - 1, "A"), Cells(ligTrav - 1, "F"))
                With .Borders(xlEdgeBottom)
                    .LineStyle = xlContinuous
                    .Weight = xlMedium
                    .ColorIndex = 5
                End With
            End With
            With Range("E" & ligTrav - 1 & ":E" & ligTrav)
                .NumberFormat = "#,##0.00 $;[Red]-#,##0.00 $;"
            End With
Return
End Sub

En conclusion, l'interception de l'évenement BeforePrint me va très bien, car je peux enrichir mon document selon plusieurs scénarios, provoquer un enregistrement, piloter son emplacement etc... à condition que je sache que ce document vient d'être "enrichi" .
Merci d'avance pour votre aide.
 

PMO2

XLDnaute Accro
Re : évènement "AfterPrint"

Bonjour,

Peut-être avec l'astuce suivante

Dans ThisWorkbook
Code:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
'--- Traitement ---
Dim R As Range
Set R = ActiveSheet.Range("a1:f10")
R.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(6), _
        Replace:=True, PageBreaks:=False, SummaryBelowData:=True
'------------------
Application.OnTime Now + TimeValue("00:00:01"), "DeleteSubtotal"
End Sub

Dans un module standard
Code:
Sub DeleteSubtotal()
ActiveSheet.Cells.RemoveSubtotal
End Sub

Voir l'exemple joint.

Cordialement.

PMO
Patrick Morange
 

dmc

XLDnaute Occasionnel
Re : évènement "AfterPrint"

Merci PM02
J'ai utilisé le onTime, cela fonctionne. Un peu étonnant, le principe que j'en retire est que :
- la procédure en cours programme le lancement de la procédure en temps différé, puis passe le controle au module d'impression;
- tant que excel est occupé (impression en cours ou aperçu avant impression), il n'effectue pas la procédure appelée.
Pour moi, cela semble parfait en terme de résultat.
Merci beaucoup, il me semble malgré tout qu'il devrait exister de vraies méthodes d'interception de la fin d'impression, plutôt que celle-ci qui ressemble plus à une occupation "forcée" d'Excel.
En tout cas, merci encore, pour le moment j'utilise cette méthode.
@+
 

PMO2

XLDnaute Accro
Re : évènement "AfterPrint"

Bonjour dmc,

Voici une autre méthode (à extrapoler) qui intercepte le clic sur les boutons ou menu Impression/Aperçu d'impression.

Dans ThisWorkbook
Code:
Public WithEvents CBBImprMenu  As Office.CommandBarButton
Public WithEvents CBBImprButton  As Office.CommandBarButton
Public WithEvents CBBApercu As Office.CommandBarButton

Private Sub CBBImprMenu_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
Call MakeSubtotal
NO_EVENTS = True
End Sub

Private Sub CBBImprButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
Call MakeSubtotal
NO_EVENTS = True
End Sub

Private Sub CBBApercu_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
Call MakeSubtotal(True)
NO_EVENTS = True
End Sub

Private Sub Workbook_Activate()
Application.OnKey "^p", ""  'désactive Ctrl+P
Set CBBImprMenu = Application.CommandBars.FindControl(ID:=4)
Set CBBImprButton = Application.CommandBars.FindControl(ID:=2521)
Set CBBApercu = Application.CommandBars.FindControl(ID:=109)
End Sub

Private Sub Workbook_Deactivate()
Application.OnKey "^p"
Set CBBImprMenu = Nothing
Set CBBImprButton = Nothing
Set CBBApercu = Nothing
End Sub

Private Sub Workbook_BeforePrint(Cancel As Boolean)
If NO_EVENTS = True Then
  Cancel = True
  NO_EVENTS = False
  Call DeleteSubtotal
End If
End Sub

Dans un module standard
Code:
Public NO_EVENTS As Boolean

Sub MakeSubtotal(Optional Apercu As Boolean = False)
'--- Sous-totaux ---
Dim R As Range
Set R = ActiveSheet.Range("a1:f10")
R.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(6), _
        Replace:=True, PageBreaks:=False, SummaryBelowData:=True
'--- Impression ou Aperçu ---
If Apercu Then
  ActiveSheet.PrintPreview
Else
  ActiveSheet.PrintOut
End If
End Sub

Sub DeleteSubtotal(Optional dummy As Byte)
'--- Retire les sous-totaux ---
ActiveSheet.Cells.RemoveSubtotal
End Sub

Cordialement.

PMO
Patrick Morange
 

dmc

XLDnaute Occasionnel
Re : évènement "AfterPrint"

Bonjour Patrick, et merci encore. Je craignais de paraître "méprisant" dans ma dernière réponse, alors qu'en fait j'étais juste "étonné".
Cette nouvelle solution me parait beaucoup plus "orthodoxe". En fait elle est juste "magnifique".
A tel point que je suggère à nos éminents Barbatrucs et autres "administrators", d'y jeter un oeil, commenter, mais surtout garder dans les faqs où je n'ai rien trouvé sur le sujet.
Avec tout le respect et la bienveillance que je leur dois (à nos barbus, méchants requins et autre boudeuse)
Bonne journée, et à bientôt.
David Massé
 

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal