[Résolu] Besoin de séparer des données dans un texte de formule / XML

Discussions à propos du tableur Calc.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est uniquement dédiée au tableur Calc. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Avatar de l’utilisateur
Profadbel
Fraîchement OOthentifié
Messages : 8
Inscription : 23 sept. 2016 16:48

[Résolu] Besoin de séparer des données dans un texte de formule / XML

Message par Profadbel »

Bonjour,
Je suis en train d'élaborer un Gantt (gestion de projet) sur LibreOffice Calc. Dans un Gantt, chaque tâche peut avoir un ou plusieurs antécédents. Pour calculer la date de début de la tâche suivante, il faut connaitre la date de fin des antécédents : tant que les tâches antécédentes ne sont pas toutes finies, la tâche suivante ne peut pas commencer.
Mon problème, c'est que le nombre d'antécédents est variable.
Donc je voudrais mettre pour chaque tâche une liste d'antécédents dans une cellule, pouvant être séparés par exemple par une virgule, en repérant chaque tâche antécédente par son numéro de ligne (une ligne par tâche).
Si j'avais Excel 365, j'utiliserai la fonction =fractionner.texte(A1;",")
J'ai lu sur "excel-exercice.com/formule-pour-separer-un-texte-sur-un-delimiteur/ " que je pouvais reproduire l'équivalent de cette fonction avec le langage XML. Mais je n'arrive pas à reproduire la solution proposée pour Excel avec Calc. Sur Excel, la fonction est FILTRE.XML et avec Calc, il n'y a pas de point séparateur, donc fonction FILTREXML. Voilà donc ce que j'ai tenté :
En A1 : "26, 2, 66"
En B1 : =FILTREXML("<root><node>"&SUBSTITUE(A1;",";"</node><node>")&"</node></root>";"@//node")
et ça m'affiche #VALEUR ! (le graal est d'obtenir 26 en B1, 2 en B2 et 66 en B3)
Et comme je ne comprends rien à ce que je viens d'écrire dans B1, me voilà bien coincé :D
Si quelqu'un peut m'aider, ça m'aidera grandement à faire avancer mon Schmilblick.
Dernière modification par Profadbel le 23 sept. 2024 18:49, modifié 1 fois.
Stéphane. Professeur de Technologie.
LibreOffice 24.2.4.2 (X86_64) Windows 10 Famille V22H2
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 6069
Inscription : 02 janv. 2009 23:56

Re: Besoin de séparer des données dans un texte de formule / XML

Message par Jean-Louis Cadeillan »

Bonjour,
L'extension lox365 fournit un certain nombre de fonctions, dont Textsplit (Fractionner.texte) qui fait exactement ce que tu souhaites. Le lien de télécharchement de l'oxt se trouve en suivant le lien du Relase (ici).
Cordialement,
Jean-Louis
LibO 24.2.7.2 (x64 et Java 1.8.0_461) et AOO 4.1.15 (et Java x32 1.8.0_431), Windows 7 Édition Intégrale 64 SP1
Avatar de l’utilisateur
Profadbel
Fraîchement OOthentifié
Messages : 8
Inscription : 23 sept. 2016 16:48

Re: Besoin de séparer des données dans un texte de formule / XML

Message par Profadbel »

Bonsoir Jean-Louis,
En effet, c'est exactement ce qu'il me faut, merci. Mais je ne sais pas pourquoi ça ne fonctionne pas :
- J'ai téléchargé l'extension,
- redémarré LibreOffice,
- écrit en F1 la formule =TEXTSPLIT(A1;",") -> avec dans A1 : 26, 2, 66
Résultat : F1 : 26 G1 et H1 restent vides, alors que j'attendais 2 et 66.
Est-ce que j'ai oublié un détail ?
Stéphane. Professeur de Technologie.
LibreOffice 24.2.4.2 (X86_64) Windows 10 Famille V22H2
Avatar de l’utilisateur
tintin
GourOOu
GourOOu
Messages : 9984
Inscription : 18 juil. 2008 15:29
Localisation : F-Oise

Re: Besoin de séparer des données dans un texte de formule / XML

Message par tintin »

Bonjour,
Profadbel a écrit : 23 sept. 2024 16:03 - J'ai téléchargé l'extension,
- redémarré LibreOffice,
On ne voit pas que vous avez installé l'extension ... ?
Installer/Désinstaller une extension
AOO 4.1.15 et LibO 24.8.7.2 / macOS Intel 13.7.7 Ventura
Adoptium-temurinJDK-jre_1.8.0_462 / Firefox/Safari/Thunderbird /Time Machine+cloneCCC
Tutoriels du forum pour macOS
Pour sauvegarder vos documents c'est ceinture ET bretelles
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17188
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Besoin de séparer des données dans un texte de formule / XML

Message par jeanmimi »

Bonjour,
Profadbel a écrit : 23 sept. 2024 16:03 - J'ai téléchargé l'extension,
Il est aussi possible de passer par :
Données > Texte en colonne
LibreOffice : Version : 25.2.0.3 (x64)(20 février 2025)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 6069
Inscription : 02 janv. 2009 23:56

Re: Besoin de séparer des données dans un texte de formule / XML

Message par Jean-Louis Cadeillan »

Profadbel a écrit : 23 sept. 2024 16:03 Est-ce que j'ai oublié un détail ?
Valider la formule en matriciel : Ctrl+Maj+Entrée
Si ta formule est déjà dans la cellule, tu passes en mode édition (F2), tu ajoutes par exemple un espace à la fin (après la parenthèse) pour que l'interpréteur Calc comprenne qu'il y a une modification, puis tu valides par Ctrl+Maj+Entrée. Tu peux aussi passer par l'assistant Fonction et cocher en bas à gauche la case Matrice.
Je n'avais pas précisé parce que je pensais que tu étais familier de Fractionner.Texte()…
Cordialement,
Jean-Louis
Dernière modification par Jean-Louis Cadeillan le 23 sept. 2024 18:54, modifié 1 fois.
LibO 24.2.7.2 (x64 et Java 1.8.0_461) et AOO 4.1.15 (et Java x32 1.8.0_431), Windows 7 Édition Intégrale 64 SP1
Avatar de l’utilisateur
Profadbel
Fraîchement OOthentifié
Messages : 8
Inscription : 23 sept. 2016 16:48

Re: Besoin de séparer des données dans un texte de formule / XML

Message par Profadbel »

Bonsoir Jean-Louis,
C'est maintenant parfait pour moi. Mon problème est résolu, je t'en remercie beaucoup. Il ne me reste plus qu'à valider et mettre la balise "Résolu". :super:
Stéphane. Professeur de Technologie.
LibreOffice 24.2.4.2 (X86_64) Windows 10 Famille V22H2
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 6069
Inscription : 02 janv. 2009 23:56

Re: [Résolu] Besoin de séparer des données dans un texte de formule / XML

Message par Jean-Louis Cadeillan »

La solution avec TEXTSPLIT(), matricielle, comporte certains inconvénients : si la chaîne initiale comporte 4 nombres, le résultat fera apparaître chaque nombre dans une cellule, donc 4 cellules, c'est normal ; mais si on met une chaîne à trois nombres, la quatrième cellule indiquera #N/D ; si la chaîne est à 5 nombres, le 5e nombre n'apparaîtra pas. Pour que cela fonctionne à chaque fois, il faudra effacer la formule, et la réécrire en revalidant.

Je propose un petit complément d'analyse, pour montrer d'autres solutions qui ne font pas appel à TESTSPLIT(), ni à l'extension lox365.

La première solution suppose des lignes intermédiaires et permet de mieux comprendre la (une) manière de couper une chaîne en bouts de longueur variable, séparés par un délimiteur donné. Elle fonctionne aussi sous AOO.

La seconde tente de stocker dans une même formule toutes les formules intermédiaires de la première solution. Elle est donc matricielle, demande moins de mémoire distribuée (pas de cellules intermédiaires) mais plus de temps de calcul et de mémoire en pile. A priori, elle ne fonctionne que sur LibO, qui doit avoir une pile d'interprétation un peu plus conséquente. Elle est aussi beaucoup plus difficile à modifier, essentiellement du fait de son caractère agrégatif.

À tester ci-joint (j'ai mis aussi en A3 la solution avec TEXTSPLIT)
 Ajout : J'ajoute une solution en Feuille2 qui utilise la fonction SUBSTITUE(). Cette fonction permet de viser une occurrence particulière et l'idée ici est d'encadrer successivement chaque nombre d'une borne de début (j'ai choisi le caractère ²) et d'une borne de fin (j'ai choisi le caractère $) en lieu et place de la virgule séparatrice. Ainsi, il n'est pas nécessaire de faire un découpage caractère par caractère comme avec les deux autres solutions. La fonction TROUVE() repère ensuite facilement le début et la fin de chaque mot. La formule finale est beaucoup moins longue et n'est pas matricielle. Elle est plus réactive pour de longs textes à séparer en mots, il est aussi facile de changer de séparateur. Elle est encore plus facile à mettre en œuvre que TEXTSPLIT(). Enfin elle fonctionne aussi bien sous LibO que sous AOO ! 
Cordialement,
Jean-Louis
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibO 24.2.7.2 (x64 et Java 1.8.0_461) et AOO 4.1.15 (et Java x32 1.8.0_431), Windows 7 Édition Intégrale 64 SP1