Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lignes qui se répètent ne s'impriment pas

4 réponses
Avatar
rmillerlcxl
Bonjour,

Dans deux fichiers Excel et dans toutes les feuilles ... dans les options d=
e mise en page et dans l'onglet Feuille j'ai des lignes qui se r=C3=A9p=C3=
=A8tent en haut.

Ces lignes qui se r=C3=A9p=C3=A8tent en haut ... ne font pas partie de la z=
one d'impression.

Mais au m=C3=AAme endroit dans un fichier la case Noir et blanc est coch=C3=
=A9e et dans l'autre fichier la case Noir et blanc n'est pas coch=C3=A9e.

Par programmation je produis un fichier .pdf avec PDF Creator.=20

Je remarque que pour le fichier dont la case Noir et blanc n'est pas coch=
=C3=A9e ... et que donc le pdf est en couleur les lignes qui se r=C3=A9p=C3=
=A8tent en haut n'y sont pas dans le pdf alors que dans l'autre ... oui.

J'en conclue donc que si la case Noir et blanc n'est pas coch=C3=A9e ... so=
it que la fonction n'est pas active ou qu'il y a un param=C3=A8tre manquant=
.

Auriez-vous une solution pour imprimer en couleur ... donc que la case Noir=
et blanc n'est pas coch=C3=A9e mais qui inclurait les lignes qui se r=C3=
=A9p=C3=A8tent en haut?

Peut-=C3=AAtre qu'il y a un param=C3=A8tre ou encore un zoom ou?

Merci =C3=A0 l'avance.

4 réponses

Avatar
rmillerlcxl
Désolé ... c'est faux.
Oui il y avait cette différence mais même si la case Noir et blan c n'est pas cochée ... ça ne s'imprime pas non plus. Mais quel pa ramètre peut bien causer ceci?
Avatar
Michd
Bonjour,
Lorsque tu imprimes une feuille de calcul si tu enregistres ce classeur, ce dernier enregistre avec
le classeur la mise en page. Excel ne peut pas enregistrer plus d'une mise en page par feuille. Par
la suite, lorsque tu lances l'impression, il applique les paramètres qu'il a enregistrés. Pour
modifier ces paramètres, il faut modifier les paramètres, imprimer la feuille afin de s'assurer que
tous les paramètres sont OK et enregistrer le classeur.
L'idéal, c'est de définir dans la procédure, les paramètres qui nous intéresse, on s'assure du
résultat. Dans la procédure publiée, tu dois définir ces paramètres ici :
'----------------------------------------------
For Each elt In MesFeuille
With Worksheets(elt)
With .PageSetup
.BlackAndWhite = True
'Tape un point sur la ligne suivante et accède aux
'nombreuses propriétés disponibles.
End With
.PrintOut Copies:=1, ActivePrinter:="PDFCreator"
End With
Next
'----------------------------------------------
J'ai conservé une vieille procédure...depuis le temps, il y a sûrement eu des nouvelles versions de
PDFCreator. Cette procédure n'a pas été testé récemment. Cette procédure imprime toutes les feuilles
qui ont été sélectionnées avant de lancer la procédure "Test" dans le même fichier .pdf. Le nom du
fichier PDF sera le même que le nom du classeur, mais avec une extension .pdf. Tu copies ce qui suit
dans un module standard et tu exécutes la procédure "Test".
J'espère que ce code est toujours fonctionnel. Je n'ai plu PdfCreator pour tester.
'-----------------------------------
Sub test()
Dim Tblo(), A As Integer, Nb As Integer
With ActiveWindow.SelectedSheets
Nb = .Count
ReDim Tblo(1 To Nb)
End With
For Each sh In ActiveWindow.SelectedSheets
A = A + 1
Tblo(A) = sh.Name
Next
Call ImprPDF(Tblo)
End Sub
'-----------------------------------
Sub ImprPDF(MesFeuilles())
Dim PdfJob As Object ' déclaration de la tache qu'on va créer
Dim SpdFname As String ' le nom du fichier
Dim SpdFpath As String ' le nom du répertoire
'**************Variables à définir***************
'Chemin où sera enregistré le document
SpdFpath = "c:UsersDocuments"
'Le nom du fichier Pdf sera le même que le fichier excel
'avec une extension .pdf
SpdFname = Split(ThisWorkbook.Name, ".")(0) & ".pdf"
'*************************************************
' termine toute tache en cours si PDFCreator est encore en exécution
LAPDF.Caption = "1) Initialisation de PDFCreator..."
Application.Cursor = xlWait
killtask ("PDFCreator.exe") 'Procédure écrite plus bas...
' obtention d'une instance pour la tâche d'impression
Set PdfJob = CreateObject("PDFCreator.clsPDFCreator")
Application.Cursor = xlDefault
LAPDF.Caption = ""
With PdfJob
If .cstart("/NoProcessingAtStartup") = False Then
MsgBox "DESOLE... impossible d'initialiser PDF Creator..." & vbCr & _
"Veuillez voir le problème et relancer l'opération plus tard S.V.P..."
Exit Sub
End If
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = SpdFpath
.cOption("AutosaveFilename") = SpdFname
.cOption("AutosaveFormat") = 0
.ccombineall
.cClearCache
End With
' arrete la tache d'impression (pour éviter la création
'automatique du premier fichier)
PdfJob.cPrinterStop = True
LAPDF.Caption = "2) Préparation des fichiers dans la file d'attente..."
Application.Cursor = xlWait
'======================================================== 'Pour être certain que la mise en page est celle que tu veux,
'tu dois définir la valeur des propriétés qui t'intéressent.
For Each elt In MesFeuille
With Worksheets(elt)
With .PageSetup
.BlackAndWhite = True
'Tape un point sur la ligne suivante et accède aux
'nombreuses propriétés disponibles.
End With
.PrintOut Copies:=1, ActivePrinter:="PDFCreator"
End With
Next
'======================================================== ' ou bien activeworkbook.printout, ou activesheet... comme vous voulez/
' attend qu'il y ait tous les documents dans la file
'd'attente cCountOfPrintJobs est le nombre de fichiers dans la file d'attente
' La main retourne à EXCEL pendant le travail de PDF... il faut attendre
Do Until PdfJob.ccountofprintjobs = NBJ
LAPDF.Caption = PdfJob.ccountofprintjobs & "/" & NBJ & _
" fichiers dans la file d'attente..."
DoEvents
Loop
' commande le regroupement en une seule tache d'impression
LAPDF.Caption = "3) Regroupement des fichiers dans la file d'attente..."
Application.Cursor = xlWait
PdfJob.ccombineall
' On attend qu'il n'y ait plus qu'un job.. même chose que plus haut..
'cela prend du temps et excel doit patienter
Do Until PdfJob.ccountofprintjobs = 1
DoEvents
Loop
Application.Cursor = xlDefault
' Plus qu'un seul fichier... on suppose que c'est bon
' libere la tache d'impression (lance la création du fichier) et attend sa fin
LAPDF.Caption = "4) Création du fichier PDF final..."
Application.Cursor = xlWait
PdfJob.cPrinterStop = False
Do Until PdfJob.ccountofprintjobs = 0
DoEvents
Loop
LAPDF.Caption = ""
Application.Cursor = xlDefault
' restauration de l'état
With PdfJob
.cDefaultprinter = defaultprinter
.cClearCache
Application.Wait (Now + TimeValue("0:00:03"))
.cClose
End With
Set PdfJob = Nothing
MsgBox "Le fichier PDF a été créé:' " & SFICPDF & "..."
End Sub
'-----------------------------------
Sub killtask(sappname As String)
' /**** j'ai pris le code tel quel... pas de commentaire/
Dim oProclist As Object
Dim oWMI As Object
Dim oProc As Object
Set oWMI = GetObject("winmgmts:")
If IsNull(oWMI) = False Then
Set oProclist = oWMI.InstancesOf("win32_process")
For Each oProc In oProclist
If UCase(oProc.Name) = UCase(sappname) Then
oProc.Terminate (0)
End If
Next oProc
Else
MsgBox "Killing """ & sappname & _
""" - Can't create WMI Object.", _
vbOKOnly + vbCritical, "CloseAPP_B"
End If
Set oProclist = Nothing
Set oWMI = Nothing
End Sub
'-------------------------------------------------
MichD
Avatar
rmillerlcxl
Un grand merci. Je vais regarder cela en profondeur.
Avatar
Michd
Voici les propriétés à définir (celles qui t'intéressent) de l'impression. Ceci est pour la version
Excel 2016, si tu as une ancienne version, tu en as certainement moins. Tu fais une mise en page et
tu demandes à l'enregistreur de macro de générer le code... Voici le résultat :
'------------------------------------------------------------------------
Application.CutCopyMode = False
Application.CutCopyMode = False
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.PrintTitleRows = "$1:$2"
.PrintTitleColumns = "$A:$B"
End With
Application.PrintCommunication = True
ActiveSheet.PageSetup.PrintArea = ""
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = "MichD"
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = ""
.LeftMargin = Application.InchesToPoints(0.708661417322835)
.RightMargin = Application.InchesToPoints(0.708661417322835)
.TopMargin = Application.InchesToPoints(0.748031496062992)
.BottomMargin = Application.InchesToPoints(0.748031496062992)
.HeaderMargin = Application.InchesToPoints(0.31496062992126)
.FooterMargin = Application.InchesToPoints(0.31496062992126)
.PrintHeadings = True
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintQuality = 300
.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlPortrait
.Draft = False
.PaperSize = xlPaperLetter
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = True
.Zoom = 100
.PrintErrors = xlPrintErrorsDisplayed
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.ScaleWithDocHeaderFooter = True
.AlignMarginsHeaderFooter = True
.EvenPage.LeftHeader.Text = ""
.EvenPage.CenterHeader.Text = ""
.EvenPage.RightHeader.Text = ""
.EvenPage.LeftFooter.Text = ""
.EvenPage.CenterFooter.Text = ""
.EvenPage.RightFooter.Text = ""
.FirstPage.LeftHeader.Text = ""
.FirstPage.CenterHeader.Text = ""
.FirstPage.RightHeader.Text = ""
.FirstPage.LeftFooter.Text = ""
.FirstPage.CenterFooter.Text = ""
.FirstPage.RightFooter.Text = ""
End With
Application.PrintCommunication = True
End Sub
'------------------------------------------------------------------------
MichD
a écrit dans le message de groupe de discussion :
Je crois avoir trouvé. Si ça peut aider quelqu'un.
Mon 1er fichier est en format .xls. Mon 2ème est en format .xlsb.
Celui dont j'ai le problème est en format .xlsb. Pour ensuite l'envoyer dans la file d'attente de
PDF Creator ... par VBA j'utilise .copy de la feuille dans laquelle il y a les lignes à répéter en
haut.
Suite au .copy curieusement ... la valeur dans le champ lignes à répéter en haut est perdue??? Il
n'y a plus rien. Est-ce un bogue dû au fait que le fichier est en .xlsb? Du moins avec un fichier en
.xls avec le même code ... pas de problèmes. Y a t'il une autre variable???
Pour régler la situation j'ai par VBA copié la valeur du champ du fichier source dans le champ du
nouveau classeur.
ActiveWorkbook.activesheet.PageSeup.PrintTitleRows = Workbooks(1).Sheets(1).PageSeup.PrintTitleRows