[Résolu][Calc] export pdf en 2 parties si liste trop longue

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
eric63
Membre hOOnoraire
Membre hOOnoraire
Messages : 119
Inscription : 21 janv. 2020 23:49

[Résolu][Calc] export pdf en 2 parties si liste trop longue

Message par eric63 »

Bonjour
j’ai un problème avec une macro qui exporte en pdf une feuille d’un fichier calc et l’imprime en 2 exemplaire et sauve le fichier à ce stade afin d’effectuer des commandes dans un supermarché
c’est le pdf qui est envoyé par mail au supermarché
cette feuille fait 7 colonnes visibles de large
et à 15 lignes fixes qui sont toujours présentes
suivi de 0 à 70 lignes visibles de produits à commander
En fait cette liste fait 150 lignes mais ne sont visibles que les lignes qui ont en commun le même supermarché de référence et dont la commande est supérieur à 0

Cela marche bien jusqu’à 40 lignes de commande (j’ai pas d’exemple d’en avoir mis plus)
mais aujourd’hui ma commande fait 70 lignes de commande et ne sort pas correctement en pdf:
la longue liste est illisible sur une feuille A4 et de plus les 5 premières lignes fixes et les 5 dernières lignes ne sont pas prisent en compte ce qui n’est pas exploitable par le fournisseur

Je cherche un moyen de scinder la liste en deux pour en sortir 2 pages pdf qui soient visible sur une page A4
nommées BON_DE_COMMANDE_FOURNISSEUR_20210831_p1 ET _p2 Si cette liste est trop longue
et d’en garder une sauvegarde.ods si d’aventure il me prennait de modifier ce fichier pour y ajouter ou enlever une quantité ce qui est possible actuellement.
(le fichier est régulièrement sauvegardé avant et après aux étapes importantes )
j’ai un peu peur de perdre les données du premier export par écrasement du second sur le premier
Désolé mais je n’arrive pas à transférer mon fichier (trop lourd) ainsi que ma macro au format .txt
Dernière modification par eric63 le 01 sept. 2021 18:49, modifié 2 fois.
Version: 7.4.4.2 / LibreOffice Community
Build ID: 40(Build:3)
CPU threads: 4; OS: Linux 5.19; UI render: default; VCL: kf5 (cairo+wayland)
Locale: fr-FR (fr_FR.UTF-8); UI: fr-FR
Ubuntu package version: 1:7.4.4 -0ubuntu0.22.10.2
Avatar de l’utilisateur
tintin
GourOOu
GourOOu
Messages : 9362
Inscription : 18 juil. 2008 15:29
Localisation : F-Oise + F-Savoie

Re: [Calc] export pdf en 2 parties si liste trop longue

Message par tintin »

Bonjour,
eric63 a écrit :fichier (trop lourd)
Si vous ne pouvez pas alléger un fichier dépassant les 500 ko acceptés vous pouvez le joindre en passant uniquement par le site https://www.cjoint.com/

Pour la macro, lors de la rédaction de votre message, cliquez sur le bouton

Code : Tout sélectionner

[attachment=1]Capture d’écran 2021-08-14 à 09.03.21.png[/attachment]Vous verrez apparaître deux balises, collez alors le texte de votre macro entre ces deux balises.
Ou alors, faites l'inverse, collez votre code dans le message, sélectionnez-le en entier et cl;iquez sur le bouton [Code]. Résultat :

[attachment=0]Capture d’écran 2021-08-14 à 09.03.09.png[/attachment]
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.15 et LibO stable 7.6.6 / macOS Intel 13.6.6 Ventura
Adoptium-temurinJDK-jre_1.8.0_402 / Firefox/Safari/Thunderbird /Time Machine+cloneCCC
Tutoriels du forum pour macOS
Pour sauvegarder vos documents c'est ceinture ET bretelles
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25173
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] export pdf en 2 parties si liste trop longue

Message par Dude »

Salut,
eric63 a écrit :Désolé mais je n’arrive pas à transférer mon fichier (trop lourd)
Comme d'habitude, il est inutile de nous envoyer un document si complexe qu'on va perdre du temps à l'étudier.
Il nous faut juste l'exhaustif visant à comprendre et reproduire.
Tu joins ce document avec uniquement les données nécessaires et la macro.
Tu ajoutes des copies écran avec l'effet de départ et d'arrivée et/ou escompté

Il y a fort à parier qu'en faisant cet exercice, tu résolves toi-même le problème. :)
eric63
Membre hOOnoraire
Membre hOOnoraire
Messages : 119
Inscription : 21 janv. 2020 23:49

Re: [Calc] export pdf en 2 parties si liste trop longue

Message par eric63 »

J’avance un peu dans mes recherches mais je bute toujours sur un résultat final souhaité
export d’un pdf de la zone concerné et impression de cette zone dans la foulée
mais pour l’instant j’ai soit l’impression de la page haute et de la page basse soit l’export pdf jamais les trois dans la foulée
je pars d’une feuille de travail de 11 colonnes sur 151 lignes
au départ toutes les cellules sont visibles
les cellules blanches sont des formules les jaunes sont les seules à être remplies manuellement
le fournisseur en C3 et la date de commande en C7 sont rentrés au préalable et sauvegardé sous le nom du fichier Commande_FOURNISSEUR_AAAAMMJJ.ods
je rempli manuellement les colonnes en I pour indiquer le nombre de lots à commander
puis
en appuyant sur un Bouton (en jk1) je démarre une «supermacro» composée de plusieurs macros
j’ai en fait une dizaine de macros qui sont imbriqué à partir d’un corps central main
qui affichent puis masquent les colonnes et lignes inutiles
donc je me retrouve avec un fichier1 en cours de macro juste avant les macros d’impression et d’export pdf
Screenshot_Commande_Intermarche_20210831.ods - LibreOffice Calc20210815_212937.png
comme la liste de commande est longue 70 lignes de commande
je suis obligé de la scinder en 2 partie
je peux choisir au départ le nombre de lignes visibles dans la partie 1 ici c’est 31 (en L12) lignes visibles sur 87 lignes concernées (L11)
c’est la zone imprimable en blanc

donc il me reste à imprimer cette première partie en double exemplaire (qui me sert de liste lors des receptions de commandes) puis exporter le pdf (qui sert pour l’envoi par mail au fournisseur) et imprimer la partie 2 et exporter en pdf la partie 2
c‘est cette phase qui ne fonctionne pas bien de bout en bout
macro ExportPlage variable global valid et page à 1 début ligne 900

Code : Tout sélectionner

Sub ExportPlage 'vient de 155

If valid=1 Then 
msgbox("903:macro adaptée de celle de zutix")
Else EndIf

dim oDoc As Object, oSheet As Object
dim Plage(0) as new com.sun.star.table.CellRangeAddress
dim Plage2(0) as new com.sun.star.table.CellRangeAddress
dim d as integer,page as integer, f as integer,f1 as integer,f2 as integer,f3 as integer, g as integer, t as integer, nb as integer, droite as integer, gauche as Integer
Dim Props() As New com.sun.star.beans.PropertyValue
oDoc=ThisComponent
oSheet=oDoc.Sheets(0)
oDoc.CurrentController.ActiveSheet=oSheet

t= oSheet.GetCellRangeByName("A2").String 'total lignes
f= oSheet.GetCellRangeByName("L11").String 'nombre de lignes totales sur la première page
f1= oSheet.GetCellRangeByName("L12").String 'NUMERO de ligne VISIBLE DU SAUT DE PAGE
f2=oSheet.GetCellRangeByName("L10").String 'NUMERO DE LIGNE PRIS EN COMPTE AU SAUT DE PAGE DE la deuxième page
f3=oSheet.GetCellRangeByName("L9").String 'nombre de lignes totales sur la deuxième page

If f2=0 Then 
msgbox("922:Aucun lot enregistré pour ce fournisseur: Impression ANNULÉE ")
Exit Sub
End if

page=1		'numero page
nb=f 		'nombre de lignes visibles par page voulues à l’impression
d=1-nb 		'debut ligne impression 
g=0			'etat du compteur de ligne activées impression faire un compteur pour 
droite=10 	'position colonne visible la plus a droite
gauche=1	'position colonne visible la plus a gauche

If valid=1 Then 
msgbox "934:Le pdf de la page " & page & " se fera de la colonne "& gauche+1 &" ligne "& d+nb+1 & " à la colonne "& droite+1 &" ligne "& g+nb+1 
Else EndIf

while g<f3-1				'démarrage  
   d=d+nb   			' debut de ligne

   If page=1 then g=g+nb'fin de ligne page1 
   if page=2 then g=f3  'fin de ligne page2 
   if g>t then g=t	

   Plage(0)=Plage2(0)   'la deuxième page est basculée
   'la page s’imprime de la cellule A 
   'msgbox("impression de la colonne "&cgauche&"et ligne "&d&"à colonne "&cdroite&" et ligne "&g)
   Plage(0)=oSheet.getCellRangeByPosition(1,d,10,g).RangeAddress
   oSheet.PrintAreas=Plage()
   msgbox("949:Vous avez préparé les feuilles dans l’imprimante ? pour les lignes " & d+1 & " à " & g+1)
oDoc.Print(Props())
   msgbox("951:export pdf fait pour les lignes " & d+1 & " à " & g+1)
'sauvegarde de la page pdf
 msgbox "953:sauvegarde de la page " & Page  
'
sauvePdf ("BON DE COMMANDE") 'va à 1000
 'vient de 1120
page=page+1
Wend 'retour au while 937
If valid=1 Then 
msgbox("960:impression achevée")
Else endif
if MsgBox ("962:un autre exemplaire ?", 292, "Nombre d'exemplaire")=6 Then

page=1		'numero page
nb=f 		'nombre de lignes visibles par page voulues à l’impression
d=1-nb 		'debut ligne impression 
g=0			'etat du compteur de ligne activées impression faire un compteur pour 
droite=10 	'position colonne visible la plus a droite
gauche=1	'position colonne visible la plus a gauche
msgbox "796:votre impression se fera de la colonne "& gauche+1 &" ligne "& d+nb+1 & " à la colonne "& droite+1 &" ligne "& g+nb+1 
while g<f3-1				'démarrage  
   d=d+nb   			' debut de ligne
   If page=1 then g=g+nb'fin de ligne page1 
   if page=2 then g=f3  'fin de ligne page2 
   if g>t then g=t		'
   Plage(0)=Plage2(0)   'la deuxième page est basculée
   'la page s’imprime de la cellule A 
'msgbox"804:impression de la colonne "&gauche&"et ligne "&d&"à colonne "&droite&" et ligne "&g
   Plage(0)=oSheet.getCellRangeByPosition(1,d,10,g).RangeAddress
   oSheet.PrintAreas=Plage()
  oDoc.Print(Props())
   msgbox("982:impression faite pour les lignes " & d+1 & " à " & g+1)
Page=page+1
wend
msgbox("985:impression achevée")
Else  EndIf

End Sub 'retour en157
macro SauvePdf

Code : Tout sélectionner

Sub SauvePdf (sTableName As String) 'vient de ligne 955

dim oDoc as object, oSheets as object, oSheet as object, oPlage as object, oEnCours as object, oRanges as object, maCellule As Object,oFeuille1 As Object,oCol as Object
dim lEndCol as long, lEndRow as long, lCoord(1) as long
dim nVar as integer, tri as integer, nBascule as integer,NombreProduits As Integer
dim sPath as string,sStandard as string, sName as string, validation as string
'
	oDoc = ThisComponent
'
	MaFeuil = oDoc.CurrentController.ActiveSheet
    REM introduction de la cellule date en texte aaaammjj - 20180102
    Madate = MaFeuil.GetCellRangeByName("D7").String
    rem Récupération du contenu de la cellule C2 (nom et date du fichier) dans la feuille active
    Montextedate = MaFeuil.GetCellRangeByName("C2").String
    rem Récupération du contenu de la cellule C3 (fournisseur)dans la feuille active
    MonFournisseur = MaFeuil.GetCellRangeByName("C3").String
    rem Récupération du contenu de la cellule H2 (nom et date fichier bon de commande pour pdf)dans la feuille active	
	MonTexteExport = MaFeuil.GetCellRangeByName("H2").String
rem Récupération du contenu de la cellule A5 (OK OU NON POUR EVITER ERREUR SAISIE COMPLETE DU NOMBRE COMPARER AU PRODUIT bon de commande pour pdf)dans la feuille active	
	Validation = MaFeuil.GetCellRangeByName("A5").String
rem Récupération du contenu de la cellule A2 (NOMBRE TOTAL DE PRODUITS + MARGE DE 60 POUR ENGLOBER TOUS LES PRODUITS CHOISIS)	
	NombreProduits = MaFeuil.GetCellRangeByName("A2").String
'rem Récupération du contenu de la cellule E5 (nom du fichier modèle)	
	NomModele = MaFeuil.GetCellRangeByName("E5").String
'rem Récupération du contenu de la cellule D1 (VALEUR D'ENREGISTREMENT PDF)	
	VALEURD1= MaFeuil.GetCellRangeByName("D1").String 
'rem Récupération du contenu de la cellule BH3 (NIVEAU D’ACCÈS)	
	Niveau= MaFeuil.GetCellRangeByName("BH3").String  
'REM UTILISER LA MACRO OuSuisJe pour verifier le chemin des dossiers 
'  
'rem determine si le système est sur linux (AF4= file:///home) ou windows (AF4= file:///C:)
'
'rem chemin de base linux ET les autres chemins additionnels
  	BaseOSL = MaFeuil.GetCellRangeByName("AF4").String
'  	'chemin du Dossier Personnel linux
  	DpersoL = MaFeuil.GetCellRangeByName("AH4").String	
  	'Chemin Différencié Des Dossiers linux
  	CDDDL = MaFeuil.GetCellRangeByName("AJ4").String
'rem Chemin Commun Des Dossiers
  	CCDD = MaFeuil.GetCellRangeByName("AM4").String
sPath = BaseOSL & DpersoL & CDDDL &CCDD & "/" & MonFournisseur & "/"
if page=0 then
sName = MonTexteExport & ".pdf"
Else sName = MonTexteExport & "-" & page & ".pdf"
endif
oSheets = oDoc.Sheets

'
' Vérifie que le classeur contient une feuille de ce nom
if oDoc.Sheets.hasByName(sTableName) then
        oSheet = oDoc.Sheets.getByName(sTableName) 

'  nVar = 0
'Export_Imprime_pdf
'' Vérifie que le fichier cible existe déjà ou non
'' Si oui, possibilité d'écraser ou donner un autre nom                 
       do while FileExists(sPath & sName) and nVar <> 2 and nVar <> 6
              nVar = MsgBox ("1057:le fichier "& Chr(10) & _
                 Chr(10) & sName & Chr(10) & _
               Chr(10) &" existe déjà. " & Chr(10) & _
                                """Oui"" pour l'écraser ? " & Chr(10) & _
                      Chr(10) & """Non"" pour sauvegarder ce fichier sous la forme" & Chr(10) & _
                  Chr(10) &  MonTexteExport & "-"& "xx" & ".pdf" & Chr(10) & _
                  Chr(10) & "à coté de celui d'origine ou du fichier indexé précédent ou" & Chr(10) & _
                      Chr(10) & """Annuler"" pour arrêter l'export, " & Chr(10)& Chr(10) & _ , 35, "Choix proposés")     
'rem inhibé pour ne pas tenir compte et simplifier la modification du nom
                              if nVar = 7 then
                                      index=index+1
                                       sName = MonTexteExport & "-" & index & ".pdf"
                           'rem incrémantation du fichier si existant
                                     If FileExists(sPath & sName) Then
                                        index= index+1
                                       sName = MonTexteExport & "-" & index & ".pdf"
                                      Else end if
                              end if
 MsgBox ("1075:le fichier sera sauvegardé sous "& sName)       
                 Loop
                  
'if nVar <> 2 then
                                                
                          oDoc.addActionLock
                          oDoc.LockControllers

' Mémorise la sélection courante
            oEnCours = oDoc.currentselection

' Vérifie si au moins une zone d'impression a été définie pour cette feuille
' Si oui on l'utilise, sinon on exporte toute la plage utilisée dans la feuille

if ubound(oSheet.PrintAreas) <> -1 then
' Création d'une instance "plage" vide qui permet de déselectionner
' (utile par ex. si l'utilisateur avait sélectionné un graphisme)                              
  oRanges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
  oDoc.currentcontroller.activeSheet = oSheet
  oDoc.currentcontroller.select(oRanges)
else
 lCoord = GetLastUsed(oSheet)
 oPlage = oSheet.getCellRangeByPosition(0, 0, lCoord(0), lCoord(1))
 oDoc.currentcontroller.select(oPlage)
   end if    
                                
 
 
 
 
 export_pdf(sPath & sName) 'va à 400  
'vient de 	420	
macro export_pdf

Code : Tout sélectionner

sub export_pdf (sFileName AS String) 'vient de 1105; 205

dim propFich(2) as new com.sun.star.beans.PropertyValue
dim filterProps(0) as new com.sun.star.beans.PropertyValue
 
filterProps(0).Name = "Selection"
filterProps(0).Value = thisComponent.currentSelection

propFich(0).Name = "FilterName"
propFich(0).Value = "calc_pdf_Export"
propFich(1).Name = "FilterData"
propFich(1).Value = filterProps()
ThisComponent.storeToURL(sFileName,propFich()) ’j’ai une erreur sur cette ligne
  
MsgBox ("414:enregistrement du pdf; vérifier si la synchro du cloud est terminé" )





end Sub 'retour à 1106;206
je ne sais pas si cela peux vous satisfaire
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: 7.4.4.2 / LibreOffice Community
Build ID: 40(Build:3)
CPU threads: 4; OS: Linux 5.19; UI render: default; VCL: kf5 (cairo+wayland)
Locale: fr-FR (fr_FR.UTF-8); UI: fr-FR
Ubuntu package version: 1:7.4.4 -0ubuntu0.22.10.2
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] export pdf en 2 parties si liste trop longue

Message par zeguedon »

Bonjour,
eric63 a écrit :j’ai une erreur sur cette ligne
Sans approfondissement de ma part, je constate une erreur dans ta sub export_pdf (sFileName AS String) :

Code : Tout sélectionner

dim propFich(2) as new com.sun.star.beans.PropertyValue
propFich(2) 2 signifie que tu dois définir 3 propriétés or il n'y en a que 2 :
"FilterName" et "FilterData".
Essaye en remplaçant par

Code : Tout sélectionner

dim propFich(1) as new com.sun.star.beans.PropertyValue
A+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
eric63
Membre hOOnoraire
Membre hOOnoraire
Messages : 119
Inscription : 21 janv. 2020 23:49

Re: [Calc] export pdf en 2 parties si liste trop longue

Message par eric63 »

merci zeguedon c’est corrigé
j’ai repris en profondeur mes macros et je suis arrivé à un résultat satisfaisant ça imprime la plage haute réimprime celle ci si demandé puis exporte en pdf et recommence pour la partie basse…
Bon j’ai encore un problème sur la fin de mes macros qui galopent plus que nécéssaire, mais le principal est acquis.
Je vous remercie de vos attentions
je passe en résolu même si je ne donne pas ıçi ma solution car d‘une ce n’est pas complètement stable
et je ne sais pas si ça apportera grand chose au moulin
les macros déjà publiées sont toujours d’actualité moyennant quelques modifications à de nombreux endroits
et comme dit Dude Il y a fort à parier qu'en faisant cet exercice, tu résolves toi-même le problème. :bravo: c’est tout à fait ça
Version: 7.4.4.2 / LibreOffice Community
Build ID: 40(Build:3)
CPU threads: 4; OS: Linux 5.19; UI render: default; VCL: kf5 (cairo+wayland)
Locale: fr-FR (fr_FR.UTF-8); UI: fr-FR
Ubuntu package version: 1:7.4.4 -0ubuntu0.22.10.2