[Résolu][Writer] Section affichée via dialogue et liste de choix multiples avec épurage par regex

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 !
Libro75
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 09 oct. 2022 13:21

[Résolu][Writer] Section affichée via dialogue et liste de choix multiples avec épurage par regex

Message par Libro75 »

Bonjour à tous,

Je cherche à réaliser une macro qui affiche / masque des sections selon les choix portés par une boite de dialogue avec liste déroulante à choix multiples.

Jusque là, je m'en suis sorti avec les fils du forum sur le sujet.

Je cherche toutefois à "épurer" les noms de sections pour ne garder que celles qui m'intéressent

Il s'agirait de faire un regex sur ces noms de sections ainsi listées pour n'en conserve à l'affichage de la boite de dialogue que certaines.

Difficile à expliquer, le mieux est un fichier avec l'exemple plus parlant.

Dites moi ce que vous en pensez.
GestionsSections1.odt
D'ici là passez de bonnes fêtes.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Libro75 le 31 déc. 2023 10:17, modifié 3 fois.
LibreOffice 7.2.1.2 (x64)
Windows 10.0 Build 19044
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 639
Inscription : 09 août 2017 22:15

Re: [Writer] Affichage sections selon un dialogue avec liste de choix multiples / épurage par regex possible ?

Message par Jurassic Pork »

Hello,
sous LibreOffice depuis la version 6.2 on peut appeler la fonction formule REGEX ( n'existe pas sous OpenOffice).
Exemple d'utilisation :

Code : Tout sélectionner

Sub RegexSearch()  
Dim Texte,elem, res, StartTicks As Long, StopTicks As Long
Texte = Array("Texte_Code_12345","Libelle_Code_67890","Texte_Code_67890","Autre_section_1","Autre_section_2")
StartTicks = GetSystemTicks()
res = ""
for each elem in Texte
    if Not isempty(createUnoService("com.sun.star.sheet.FunctionAccess").callFunction("REGEX", Array(elem,"_\d{5}")))  then
       res = res +elem + " - "
    end if
Next elem
StopTicks = GetSystemTicks()
msgbox "Résultats : " + res +  " temps : " + (StopTicks - StartTicks) + " ms"
End Sub
Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
Libro75
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 09 oct. 2022 13:21

Re: [Writer] Affichage sections selon un dialogue avec liste de choix multiples / épurage par regex possible ?

Message par Libro75 »

Merci Jurassic Pork !

Effectivement, j'ai donc réussi à faire deux arrays, un pour les items, mais je n'arrive pas à supprimer les doublons.
Et un array qui listerait les sections (je ne sais pas si c'est utile)

Après il me faudrait arriver à le faire le lien entre les deux. Refaire le schéma inverse avec les regex pour retrouver les sections Libelle_ et Texte_ qui correspondent ou moyen plus simple ?
GestionsSections1.odt
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.2.1.2 (x64)
Windows 10.0 Build 19044
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25976
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Affichage sections selon un dialogue avec liste de choix multiples / épurage par regex possible ?

Message par Dude »

Salut,

Si l'objectif est d'extraire les 5 derniers chiffres dans une table mémoire sans doublon :

Code : Tout sélectionner

GlobalScope.BasicLibraries.loadLibrary ("Tools")

 DialogLibraries.loadLibrary("Standard")
 Dialog1 = DialogLibraries.getByName("Standard").getByName("Dialog1")
 oDlg = CreateUnoDialog(Dialog1)

 oDoc = ThisComponent
 lesSections = oDoc.TextSections
 aListeSections = lesSections.ElementNames
 Dim aListe(0)
 for i = 0 to UBound(aListeSections)
  	sVal$ = Val(Right(aListeSections(i),5)) 
 	if not FieldinList(sVal, aListe()) then
 		aListe(j) = sVal 
 		j = j+1
 		Redim Preserve aListe(0 to j) 		
 	endif
 next
 Redim Preserve aListe(0 to j-1)
 aListeSections = aListe
Libro75
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 09 oct. 2022 13:21

Re: [Writer] Affichage sections selon un dialogue avec liste de choix multiples / épurage par regex possible ?

Message par Libro75 »

Merci Dude, pas exactement cela mais çà m'a permis d'avancer !
Peut être pas très conventionnel mais le résultat est là.

Un dernier point peut-être je voudrais ajouter un texte explicatif derrière chaque "identifiant numérique"
Je les ai mis dans un dictionnaire

Dim dico As New Collection
dico.Add("12345", "Libellé explicatif Item pour 12345") '
dico.Add("67890", "Libellé explicatif Item pour 67890")

Et je voudrais donc ajouter le libellé explicatif pour chaque item dans ma boite de dialogue.

J'imagine qu'il faut que les repasses en revue et créé une condition sur la clé mais je n'y arrive pas.

Je remets mon fichier d'exemple ainsi mis à jour avec vos aides respectives :super:
GestionsSections1.odt
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.2.1.2 (x64)
Windows 10.0 Build 19044
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 639
Inscription : 09 août 2017 22:15

Re: [Writer] Affichage sections selon un dialogue avec liste de choix multiples / épurage par regex possible ?

Message par Jurassic Pork »

Hello,
en ce qui concerne les expressions régulières j'ai retrouvé du code de l'excellent Bernard Marcelly qui utilise le service TextSearch :

Code : Tout sélectionner

Sub SearchWithRegExp()
Dim rch As Object, resu As Object, r As Long, x As Long
Dim opts As New com.sun.star.util.SearchOptions
Dim Texte,elem, res, StartTicks As Long, StopTicks As Long
Texte = Array("Texte_Code_12345","Libelle_Code_67890","Texte_Code_67890","Autre_section_1","Autre_section_2")
StartTicks = GetSystemTicks()
res = ""
rch = createUnoService("com.sun.star.util.TextSearch")
with opts
  .searchString = "_\d{5}"
  .algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
  .searchFlag = com.sun.star.util.SearchFlags.REG_EXTENDED
end with
rch.setOptions(opts)
for each elem in Texte
       resu = rch.searchForward(elem, 0, Len(elem))
       if resu.subRegExpressions = 1 then
               res = res +elem + " - "
       end if
Next elem
StopTicks = GetSystemTicks()
msgbox "Résultats : " + res +  " temps : " + (StopTicks - StartTicks) + " ms"
End Sub
Cela est plus rapide que l'utilisation de la fonction Regex et cela fonctionne sous LibreOffice et OpenOffice.

Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
Libro75
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 09 oct. 2022 13:21

Re: [Writer] Affichage sections selon un dialogue avec liste de choix multiples / épurage par regex possible ?

Message par Libro75 »

Merci à tous les deux
J'ai pris en compte le regex pour openoffice et j'ai solutioné mon problème de collection, j'avais inversé la clé et la valeur, voilà qui est donc résolu.
Terminez bien l'année

Le fichier au besoin si çà peut aider :
GestionsSections1.odt
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.2.1.2 (x64)
Windows 10.0 Build 19044