bon c'est pas très explicite mais je vous la fait courte :
je créé un classeur masqué à la volée pour imprimer à la suite différentes feuilles de différents classeurs sur une imprimante réseau.
les feuilles sont copiées et empilées dans ce classeur, et une commande permet de l'afficher dans le backstage PrintPreviewAndPrint pour choisir manuellement les options d'impressions (tirages, couleur, rectoverso, assemblage...)
le problème est :
comment fermer ce classeur par VBA après l'avoir imprimé en cliquant manuellement sur le bouton ''imprimer'' du backstage ?!
volontairement je vous donne pas le code pour laisser libre court à vos idées les plus folles !
(mais bien sur je le fournirai si ça peut aider...)
Private Sub Workbook_BeforePrint(Cancel As Boolean)
' (code de Richie(UK)
Application.EnableEvents = False
'stop infinite Loop re printing
Cancel = True
'cancel original print instruction
'do your printing here via VBA
'do your AFTER print stuff here
Application.EnableEvents = True
'reset event-checking
End Sub
ça n'est compatible avec la conception de la sub.
le panneau d'impression est appelé pour laisser l'utilisateur choisir ses paramètres d'impression
mais il n'a pas 'la main' sur la procédure et l'éxécution du code se poursuit avant même qu'il ait vu quoi que ce soit !
donc, si j'ai pas le temps de cliquer sur imprimer, et que ma procédure n'a aucune instruction d'impression, je peux mettre tout ce que je veux dans la workbook_beforeprint, y risque pas de se passer grand chose...
voici le code à finaliser :
VB:
Static Sub QueuePrint(Queue As Boolean)
On Error GoTo ErrIntercept
Application.ScreenUpdating = False
If Queue Then
MyWb = ActiveWorkbook.Name
Temp_Print_WB = Workbooks(Temp_Print_WB).Name
Windows(Temp_Print_WB).Visible = True
Windows(MyWb).Activate
ActiveSheet.Copy after:=Workbooks(Temp_Print_WB).Sheets(1)
ActiveWorkbook.Sheets(Sheets.Count).Name = Left(MyWb, Len(MyWb) - 5)
If Not TempWb Then Sheets(1).Delete: TempWb = True
ActiveWindow.Visible = False
Windows(MyWb).Activate
Exit Sub
Else
Windows(Temp_Print_WB).Visible = True
If TempWb Then
Application.CommandBars.ExecuteMso ("PrintPreviewAndPrint")
'ce menu n'est pas modal donc la sub se poursuit _
l'idée était donc de faire tourner une boucle ''à vide'' _
jusqu'à ce que l'utilisateur clic sur ''imprimer''
Do
DoEvents
Loop ' until l'utilisateur ait cliqué et l'impression soit envoyée vers l'imprimante
End If
ActiveWorkbook.Close False
Exit Sub
End If
ErrIntercept:
If Err.Number = 9 Then
With Workbooks.Add
Temp_Print_WB = .Name: TempWb = False
End With
ActiveWindow.Visible = False
Resume
else : exit sub
End If
End Sub
j'avais penser tester la propriété activeworkbook.BuiltinDocumentProperties(10)
mais la ou s'est fort c'est qu'elle se met à jour sur printpreview aussi bien que sur printout !!
donc impasse...
et j'ai viré la boucle qui tourne à vide
ce form étant modal, il me laisse paramétrer et lancer mon impression avant de poursuivre et de fermer le classeur.
c'est donc en partie résolu, mais je reste sur ma faim