N'y connaissant quasiment rien en Macro OOo, j'ai profité d'une demande spécifique pour me jeter à l’eau.
Le but, ... exporter chacune des feuilles d'un classeur dans un PDF spécifique.
J'ai fait des recherche, testé les solutions déjà proposées mais impossible d'obtenir le bon résultat... même en utilisant l'option du "DataFilter" & "PageRange".
Je me suis donc orienté sur les zone d'impressions et ai écrit une macro qui fait pil-poil ce qu'on lui demande (en supprimant les Zone d'Impressions définies dans le document, néammoins) (Voir "Code1").
Je me suis dis que ce serait intéressant de l'améliorer en permettant de faire l'export en PDF des onglets sélectionnés.
... Et c'est là que mon incompétence me pose problème.
Le code semble fonctionner (Voir Code2). Mais en faisant quelques test lors du nettoyage de celui-ci je me suis rendu compte qu’il plantait sur les onglets dont le nom comporte des espaces.
Cela ce produit uniquement sur une sélection multiple. Un onglet unique comportant des espaces est exporté correctement.
J’en conclu que le problème provient de la récupération du nom des onglets à partir du tableau TableauOnglets() … mais je cale.
Si l’un d’entre vous à une solution, ce serait sympa.
A noter : il y a du Pierre-yves, du Churay, et d’autre Inside... merci à eux
PS : j’ai également jeté un oeil sur GetPrintData dans le but de récupérer les zone d’impression existantes afin de les remettre en place en fin de macro, mais j’ai fait chou blanc
Code1 :
Code : Tout sélectionner
'Cette macro exporte chacune des feuilles d'un classeur dans un fichier PDF spécifique.
'Ce PDF est enregistré dans le même dossier que le classeur (Le fichier Calc doit être préalablement enregistré).
'Le nom de ces PDF est constitué du nom du classeur suivi du nom de la feuille.
'ATTENTION ! cette macro supprime les zones d'impressions existantes.
Option Explicit
Private NomFeuille as string
'-----------------------------------------------------
Sub Export_Feuilles_Vers_PDF
Dim oDoc As Object
Dim NbFeuille as variant
Dim x as integer
Dim NumFeuille as string
Dim Feuille As Object
Dim Curseur As Object
Dim Cible As Object
Dim ZoneImpr(0) as New com.sun.star.table.CellRangeAddress
oDoc=ThisComponent
NbFeuille=oDoc.Sheets.Count
For x=0 to NbFeuille-1
'suppression de toutes les zones d'impression du classeur.
'appel "sub PysRazZoneImprmpr"
PysRazZoneImpr
'Numfeuille=val(x+1)
Numfeuille=x+1
NomFeuille=oDoc.sheets(x).getname
'----------Definition de la zone d'impression pour la feuille en cours
Feuille = ThisComponent.Sheets.getByIndex(x)
Curseur = Feuille.createCursor()
Curseur.gotoStartOfUsedArea(False)
Curseur.gotoEndOfUsedArea(True)
Cible = Curseur.getRangeAddress()
With ZoneImpr(0)
.Sheet = Numfeuille
.StartColumn = Cible.StartColumn
.StartRow = Cible.StartRow
.EndColumn = Cible.EndColumn
.EndRow = Cible.EndRow
End With
ThisComponent.Sheets.getByName(NomFeuille).setPrintAreas(ZoneImpr())
'export PDF
'Appel de "Export_Calc_Vers_PDF"
Export_Calc_Vers_PDF
next x
PysRazZoneImpr
End Sub
'-----------------------------------------------------
'-----------------------------------------------------
sub PysRazZoneImpr
dim PysFeuille as object
for each PysFeuille in thiscomponent.sheets
PysFeuille.PrintAreas = array()
next PysFeuille
end sub
'-----------------------------------------------------
'-----------------------------------------------------
Sub Export_Calc_Vers_PDF
dim ArgsProprietes(2) as new com.sun.star.beans.PropertyValue
dim Fichier as string
dim oDoc as object
'Indique le nom de la sauvegarde au format pdf.
'Nom du classeur + nom de la feuille
'(Le fichier pdf sera cré dans le même répertoire que le classeur.)
Fichier = Left( ThisComponent.URL , Len(ThisComponent.URL) - 4 ) & "-" & NomFeuille & ".pdf"
'--- Spécifie le filtre de conversion ---
ArgsProprietes(0).Name = "FilterName"
ArgsProprietes(0).Value = "calc_pdf_Export"
ArgsProprietes(1).Name = "CompressMode"
ArgsProprietes(1).Value = 1
'--- exporte au format PDF ---
ThisComponent.storeToUrl( Fichier , ArgsProprietes())
End Sub
'-----------------------------------------------------Code : Tout sélectionner
'Cette macro exporte chacune des feuilles sélectionnées d'un classeur dans un fichier PDF spécifique.
'Ce PDF est enregistré dans le même dossier que le classeur (Le fichier Calc doit être préalablement enregistré).
'Le nom de ces PDF est constitué du nom du classeur suivi du nom de la feuille.
'ATTENTION ! cette macro supprime toutes les zones d'impressions existantes dans ce classeur.
Option Explicit
Private NomFeuille as string
Private NumFeuille as integer
'-----------------------------------------------------
Sub Export_Feuilles_Selectionnees_vers_PDF()
Dim OngletsSelectionnes As String
Dim TableauOnglets() As String
Dim i As Integer
Dim Cible As Object
Dim Collect As New Collection
Dim NomFeuilleSel As String
Cible = ThisComponent.CurrentController
If Cible.Selection.supportsService("com.sun.star.sheet.SheetCellRanges") Then
'S'il y a plusieurs feuilles de sélectionnées.
OngletsSelectionnes = ThisComponent.CurrentSelection.RangeAddressesAsString
'msgbox OngletsSelectionnes
TableauOnglets() = Split( OngletsSelectionnes , ";" )
On Error Resume Next
For i = 0 To UBound (TableauOnglets())
NomFeuilleSel = Left( TableauOnglets( i ) , Instr( 1 , TableauOnglets( i ) , "." ) - 1 )
'Récupère le nom des feuilles sans doublon
Collect.Add NomFeuilleSel , Cstr(NomFeuilleSel)
Next i
On Error GoTo 0
For i = 1 To Collect.Count
'MsgBox Collect(i)
NomFeuille=Collect(i)
'Numfeuille=thisComponent.Sheets.getByName(NomFeuille).getCellRangeByName("A1").RangeAddress.Sheet
Numfeuille=thisComponent.Sheets.getByName(Collect(i)).RangeAddress.Sheet
Export_Feuilles_Vers_PDF
Next
Else
'S'il y a une seule feuille de sélectionnée.
Numfeuille=thisComponent.CurrentController.ActiveSheet.RangeAddress.Sheet
NomFeuille=thisComponent.sheets(Numfeuille).getname
Export_Feuilles_Vers_PDF
End If
End Sub
'-----------------------------------------------------
'-----------------------------------------------------
Sub Export_Feuilles_Vers_PDF
Dim oDoc As Object
Dim x as integer
Dim Feuille As Object
Dim Curseur As Object
Dim Cible As Object
Dim ZoneImpr(0) as New com.sun.star.table.CellRangeAddress
oDoc=ThisComponent
'suppression de toutes les zones d'impression du classeur.
'appel "sub PysRazZoneImprmpr"
PysRazZoneImpr
'----------Definition de la zone d'impression pour la feuille en cours
Feuille = ThisComponent.Sheets.getByIndex(Numfeuille)
Curseur = Feuille.createCursor()
Curseur.gotoStartOfUsedArea(False)
Curseur.gotoEndOfUsedArea(True)
Cible = Curseur.getRangeAddress()
With ZoneImpr(0)
.Sheet = Numfeuille
.StartColumn = Cible.StartColumn
.StartRow = Cible.StartRow
.EndColumn = Cible.EndColumn
.EndRow = Cible.EndRow
End With
ThisComponent.Sheets.getByName(NomFeuille).setPrintAreas(ZoneImpr())
'export PDF
'Appel de "Export_Calc_Vers_PDF"
Export_Calc_Vers_PDF
End Sub
'-----------------------------------------------------
'-----------------------------------------------------
sub PysRazZoneImpr
dim PysFeuille as object
for each PysFeuille in thiscomponent.sheets
PysFeuille.PrintAreas = array()
next PysFeuille
end sub
'-----------------------------------------------------
'-----------------------------------------------------
Sub Export_Calc_Vers_PDF
dim ArgsProprietes(2) as new com.sun.star.beans.PropertyValue
dim Fichier as string
dim oDoc as object
'Indique le nom de la sauvegarde au format pdf.
'Nom du classeur + nom de la feuille
'(Le fichier pdf sera cré dans le même répertoire que le classeur.)
Fichier = Left( ThisComponent.URL , Len(ThisComponent.URL) - 4 ) & "-" & NomFeuille & ".pdf"
'--- Spécifie le filtre de conversion ---
ArgsProprietes(0).Name = "FilterName"
ArgsProprietes(0).Value = "calc_pdf_Export"
ArgsProprietes(1).Name = "CompressMode"
ArgsProprietes(1).Value = 1
'--- exporte au format PDF ---
ThisComponent.storeToUrl( Fichier , ArgsProprietes())
End Sub
'----------------------------------------------------- Ajout : ah ben vi... ça peut être une bonne idée en effet... sorry |



