I. Préambule▲
Dans une entreprise, la rédaction des documents demande du temps et des efforts pour le chargé d'affaires, mais aussi pour ceux qui liront son mémoire technique. Or, de ce lecteur, en réalité, nous ne savons rien de lui.
Utilise-t-il une impression papier, couleur, noir et blanc ou plutôt un format informatique (PDF) ?
Sait-il bien utiliser son lecteur PDF (navigation, recherche, etc.) ?
Est-il parfaitement au fait des techniques exposées ?
La réflexion ayant motivé cette macro, c'est de vouloir se mettre à la place du lecteur inconnu. Que faire pour rendre sa lecture plus fluide et agréable, rendant ainsi notre document plus pertinent sans forcément inventer la roue à chaque page, mais simplement en mettant en valeur le contenu ? Une lecture en « diagonale » peut faire des ravages quand il s'agit de juger un document, surtout si la note finale en est affectée. Et dans le cas d'une entreprise, cela peut signifier la perte d'un marché au profit d'un concurrent qui aura su mettre en valeur son document. Sachant que les entreprises sont notées pour déterminer l'attribution des lots et, parmi les notes attribuées, la présentation des documents en fait partie, il devient évident qu'une réflexion sur l'ergonomie, voire l'esthétique est un sage préalable.
Donc, que faire ? Quand un document fait 300 pages, un joli sommaire ne suffit plus. Une réponse parmi d'autres, c'est de permettre au lecteur de naviguer dans le document plus facilement. Dans les dossiers d'appels d'offres, les documents sont fournis au format PDF, en majorité.
LibreOffice étant bien équipé pour fournir des documents PDF, le choix est fait de travailler le document final avec Writer. Dans les outils disponibles, Draw est un atout indéniable. Malheureusement pour la facilité de ce choix, Word est encore présent dans l'entreprise et les réticences classiques ne tardent pas à refaire surface. Cela fait deux outils à gérer, l'objectif se corse et se résume ainsi :
-
Rédacteurs :
- laisser les rédacteurs libres de l'outil tout en les aidant à migrer,
- trouver des procédures de travail fluides qui ne pénalisent pas leur temps de production ;
-
Lecteurs :
- trouver une ergonomie esthétique et pratique,
- produire un document PDF exploitable sur toutes sortes d'équipement bureautique et versions de lecteurs PDF.
Les réponses trouvées…
-
Rédacteurs :
- Word si besoin, mais nous finalisons le document avec LibreOffice. L'usage des styles est obligatoire,
- réaliser un index vertical qui se propage automatiquement avec l'entête ;
-
Lecteurs :
- un index vertical esthétiquement comparable aux intercalaires à onglets,
- abandon des technologies récentes pour rester sur un document rustique à hyperliens.
Le résultat ? LibreOffice peut effectivement « propager » un index dans tout le document. L'astuce consiste à poser un index dans un cadre de texte, l'accrocher dans l'entête et le disposer sur le côté de la page. Le problème c'est que le passage en PDF met le bazar dans les hyperliens des index dupliqués. Défaut constaté en collaboration avec le forum LibreOffice. Nous pouvons contourner le problème en copiant un index sur autant de pages que nécessaire. Nous pouvons colorier les entrées selon une charte graphique, mais ce formatage appliqué sur un style est perdu en cas d'actualisation. Et pour 300 pages, il faut compter 296 index…
Je ne suis pas certain que les index soient faits pour cela. De plus si une actualisation s'impose après copie, c'est autant d'index à gérer !
L'esthétique d'un index étant trop basique même en le coloriant, malgré ses avantages et devant ses inconvénients, l'index dans l'entête (ou pas) est laissé de côté. Nous nous tournons vers une barre à onglets dessinée dans Draw.
I-A. Le choix▲
La version Draw est bien plus esthétique. Elle est plus souple et sujette aux variations. Un texte sur chaque onglet, le tout groupé et collé dans le document Writer avec un ancrage à la page et le tour de passe-passe est joué !
Pour les hyperliens, LibreOffice est plutôt rapide. La boite de dialogue est bien faite, nous ne la quittons pas tant que tous les hyperliens soient posés. C'est rapide et les rédacteurs l'ont vite adopté.
Nous la copions page suivante, nous collons… C'est simple, mais sur 300 pages c'est rédhibitoire.
À la rescousse, reste le morceau de bravoure : la macro.
II. La macro enregistrée▲
Ayant toujours refusé d'utiliser les macros, car incompétent en code malgré des essais jadis, j'ai utilisé l'enregistreur de macro. Mais cette macro était incapable de déterminer le nombre de pages du document et de calculer combien de copies il fallait réaliser.
II-A. Premier jet▲
Affecter cette macro à un bouton dans une barre d'outils n'arrange pas le problème, car autant de clics que de pages… Bref !
Se documenter, faire des essais, cela ne permet pas de rattraper des années passées à ignorer le codage.
sub
Copie
dim
document
as
object
dim
dispatcher
as
object
document
=
ThisComponent
.
CurrentController
.
Frame
dispatcher
=
createUnoService
(
"com.sun.star.frame.DispatchHelper"
)
dispatcher
.
executeDispatch
(
document,
".uno:Copy"
,
""
,
0
, Array
())
dispatcher
.
executeDispatch
(
document,
".uno: PageDown"
,
""
,
0
, Array
())
dispatcher
.
executeDispatch
(
document,
".uno: Paste"
,
""
,
0
, Array
())
dispatcher
.
executeDispatch
(
document,
".uno: PageDown"
,
""
,
0
, Array
())
end
sub
Texte 1 : La macro de départ, brut de décoffrage. |
Le plus raisonnable étant de demander de l'aide, je me suis tourné vers Developpez.com, que je connaissais du temps où j'avais espéré me former au Basic.
II-B. Un coup de pouce▲
Une première réponse me met sur le chemin.
Sub
Zoom61
()
Dim
monDocument
As
Object
Dim
PageEncours
As
Object
Dim
PageActive
As
Integer
, PageFin
As
Integer
monDocument
=
ThisComponent
PageEncours
=
monDocument
.
CurrentController
.
ViewCursor
PageActive
=
PageEncours
.
Page
PageEncours
.
jumpToLastPage
PageFin
=
PageEncours
.
Page
PageEncours
.
jumpToPage
(
PageActive
)
Print
"Page en cours : "
&
PageActive
&
" - Nombre de pages : "
&
PageFin
End
Sub
Texte 2 : La macro qui trace le chemin. |
Compter les pages depuis la page courante, puis afficher le résultat. Les données de type « Integer » sont stockées dans des variables et, donc, sont exploitables pour calculer le nombre de copies à faire.
Mais comment associer les deux macros dans un code correct ? Là aussi le forum apporte une réponse bienvenue d'autant que le résultat de mes recherches est trop général ou spécifique pour en tirer un enseignement utile rapidement.
Dim
I
For
I
=
1
To
10
' ... Inner part of loop
Next
I
Texte 3 : Le code à cogiter. |
Dans le principe il est facile de déduire que la structure du code sera de cette veine :
Var1
=
N° de la page en cours
Var2
=
Nombre de pages
Var3
=
Var2-Var1 nombre de copies à réaliser
Objet1
=
objet présélectionné
Boucle
PageDown compteur
+
1
Coller
Compteur
=
Var3
=
Non je boucle Oui
goto
fin
Fin
Mais nous sommes loin de la syntaxe exacte.
III. La macro▲
III-A. Premier essai▲
Là encore le forum vient à ma rescousse et Zoom61 me propose ce code :
Sub
Zoom61
()
Dim
monDocument
As
Object
Dim
PageEncours
As
Object
Dim
Compteur
As
integer
Dim
PageActive
As
Integer
, PageFin
As
Integer
, PageNb
As
Integer
dispatcher
=
createUnoService
(
"com.sun.star.frame.DispatchHelper"
)
monDocument
=
ThisComponent
PageEncours
=
monDocument
.
CurrentController
.
ViewCursor
PageActive
=
PageEncours
.
Page
PageEncours
.
jumpToLastPage
PageFin
=
PageEncours
.
Page
PageNb
=
PageFin-PageActive
PageEncours
.
jumpToPage
(
PageActive
)
document
=
ThisComponent
.
CurrentController
.
Frame
rem : C'est dans la macro enregistrée je laisse
dispatcher
=
createUnoService
(
"com.sun.star.frame.DispatchHelper"
)
rem -----Copie de l'objet sélectionné C'est dans la macro enregistrée je laisse
dispatcher
.
executeDispatch
(
document,
".uno:Copy"
,
""
,
0
, Array
())
For
Compteur
=
PageActive
+
1
To
PageFin
PageEncours
.
jumpToPage
(
Compteur
)
dispatcher
=
createUnoService
(
"com.sun.star.frame.DispatchHelper"
)
rem -----Collage de l'objet sélectionné C'est dans la macro enregistrée je laisse
dispatcher
.
executeDispatch
(
document,
".uno:Paste"
,
""
,
0
, Array
())
Next
Compteur
Print
"Page en cours : "
&
PageActive
&
" - Nombre de pages : "
&
PageFin
&
" - Nombre de copies : "
&
PageNb
End
Sub
Texte 4 : La macro de la dernière ligne droite… le but est proche |
Mais bizarrement, cela fonctionne sur les zones de texte qui contiennent les index, mais pas sur la barre réalisée dans Draw.
Au lieu d'être copiée sur toutes les pages, toutes les copies se font sur une page. Pour effacer les copies, il faut annuler la copie autant de fois…
Une fois de plus le forum me vient en aide.
III-B. La variable Anchor▲
C'est jurassic pork qui trouve le problème. Un objet dessin de Draw est affecté par une option AnchorPageNo. Donc en gérant cette variable d'ancrage à la page, la copie peut se propager dans tout le document.
Maintenant, que faire de ce code ?
Sub
Zoom61
()
rem : Retouche par Jurassic Pork
Dim
monDocument
As
Object
Dim
PageEncours
As
Object
Dim
oSel
As
Object
Dim
Compteur
As
integer
Dim
PageActive
As
Integer
, PageFin
As
Integer
, PageNb
As
Integer
dispatcher
=
createUnoService
(
"com.sun.star.frame.DispatchHelper"
)
monDocument
=
ThisComponent
PageEncours
=
monDocument
.
CurrentController
.
ViewCursor
PageActive
=
PageEncours
.
Page
PageEncours
.
jumpToLastPage
PageFin
=
PageEncours
.
Page
PageNb
=
PageFin-PageActive
PageEncours
.
jumpToPage
(
PageActive
)
document
=
ThisComponent
.
CurrentController
.
Frame
rem : C'est dans la macro enregistrée je laisse
dispatcher
=
createUnoService
(
"com.sun.star.frame.DispatchHelper"
)
rem -----Copie de l'objet sélectionné C'est dans la macro enregistrée je laisse
dispatcher
.
executeDispatch
(
document,
".uno:Copy"
,
""
,
0
, Array
())
For
Compteur
=
PageActive
+
1
To
PageFin
PageEncours
.
jumpToPage
(
Compteur
)
dispatcher
=
createUnoService
(
"com.sun.star.frame.DispatchHelper"
)
rem -----Collage de l'objet sélectionné C'est dans la macro enregistrée je laisse
dispatcher
.
executeDispatch
(
document,
".uno:Paste"
,
""
,
0
, Array
())
oSel
=
monDocument
.
CurrentController
.
Selection
.
getByIndex
(
0
)
oSel
.
AnchorPageNo
=
Compteur
Next
Compteur
Print
"Page en cours : "
&
PageActive
&
" - Nombre de pages : "
&
PageFin
&
" - Nombre de copies : "
&
PageNb
End
Sub
Texte 5 : La macro de la dernière chance. Adaptée pour copier les objets dessins de Draw. |
IV. Conclusion▲
Bien que béotien de la programmation, les recherches effectuées et l'aide reçue ont vraiment changé mon avis sur la programmation. Certes c'est une programmation basique dans le sens où l'objectif n'est pas de réaliser un logiciel complet, mais pour un amateur, cela reste un cap difficile à franchir.Je dirais donc qu'il faut prendre le temps de lire le code. Les termes employés sont compréhensibles avec un petit effort. Ce n'est pas de la prose, certes, mais ce n'est pas opaque non plus.
Un peu de recherche personnelle pour comprendre où nous allons et acquérir du « vocabulaire », un peu d'aide par la bonne volonté des intervenants du forum et nous avançons.
V. Intégration dans votre menu Writer▲
D'abord il faut importer la macro sur votre poste. Ouvrez le gestionnaire des macros :
- « Outils > Macros > Gérer les macros > LibreOffice.Basic » ;
- Déroulez « Mes macros », sélectionnez « Module1 » et cliquez sur « Éditer » ;
- Collez le code de la macro sous la partie déjà en place. Le code sera reconnu et colorié selon les règles standard du langage Basic.
La macro est prête à être utilisée. Vous pouvez la lancer depuis « Outils > Macros > Exécuter la macro ».
Ajoutez votre macro dans le menu Outils du traitement de texte. Ouvrez l'utilitaire de personnalisation (« Outils > Personnalisation »).
- Onglet : Menus.
- Menu : Outils.
- Contenu du menu : positionnez la sélection sur macro (ou ailleurs).
- Cliquez sur Ajouter. Une fenêtre de sélection apparaît.
- Sélectionnez la macro (Macros LibreOffice>Mes macros>Standard>Module1).
- Cliquez sur Ajouter puis Fermer.
- La macro est insérée dans le menu. Sa position dans le menu peut être modifiée.
- Le nom dans le menu peut être modifié.
VI. La macro au travail▲
Pour copier la barre d'onglets dans tout votre document :
- Sélectionnez la barre, puis copiez (CTRL+C) ;
- Déroulez le menu « Outils », puis cliquez sur la macro (CopieBarre) ;
- La commande copie la barre d'onglets, depuis la page en cours autant de fois qu'il reste de pages pour atteindre la fin du document. À la fin de son exécution, la commande vous donne le résultat du travail effectué.
VII. Remerciement▲
Je remercie Claude Leloup pour la relecture orthographique.