[Résolu][Calc] Tri alphabétique des lettres d'un mot

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 !

[Résolu][Calc] Tri alphabétique des lettres d'un mot

Messagepar hoctopussy » 07 Juil 2011 16:15

Bonjour à tous,

Je suis un passionné de Scrabble. Tous les 3 ans, une nouvelle mouture du dictionnaire arrive obligeant le joueur que je suis à comparer les deux dictionnaires page par page. Ce travail accouche d'une liste de nouveaux mots entrés dans la colonne A d'un tableur. Je dois ensuite "retravailler" cette liste brute en effectuant plusieurs manipulations fastidieuses. J'aimerai me simplifier la vie avec une macro.

La première étape est la suivante : Je souhaite transformer mes mots en "tirage". Je m'explique : par exemple transformer "BESTIAU" en "ABEISTU" (mettre les lettres dans l'ordre alphabétique en clair).

Pour ce faire, j'ai pensé à créer deux boucles qui permettent de permuter les lettres du mot. Ces boucles se répètent n fois (n étant la longueur du mot -1). Le code nécessiterait 3 variables : deux sont des valeurs numériques entre 1 et la longueur du mot - 1 (ici x et y) et une est une lettre (ici z).

J'ai lu sur des sites qu'il fallait aussi définir le type de variable dans la macro avec Dim. J'avais finalement commencé par coder cela seulement pour une unique cellule (A1) :

Code : Tout sélectionner   AgrandirRéduire
Function Tridumot
Dim x As Integer
Dim y As Integer
Dim z As String
For x = 1 To Len(A1) - 1
   For y = 1 To Len(A1) - 1
      If Mid(A1, y, 1) > Mid(A1, y+1, 1) Then
         z = Mid(A1, y, 1)
         Mid(A1, y, 1) = Mid(A1, y+1, 1)
         Mid(A1, y+1, 1) = z
      End If
   Next y
Next x
End Function


Bien évidemment, c'est un échec cuisant !! :lol: Lorsque j'exécute la macro sur un tableur avec seulement un mot dans A1, rien ne se produit...
J'ai oublié de dire que je débute complètement en programmation. Je souhaiterai que l'on m'oriente sans me mâcher le travail afin que je puisse par moi-même pondre cette macro. Merci de me mettre sur les rails en douceur... :super:
Dernière édition par Oukcha le 08 Juil 2011 07:19, édité 3 fois.
Raison: Ajout coche (balise présente)
LibreOffice 3.3.2 sur Vista et Ubuntu 11.04
hoctopussy
Fraîchement OOthentifié
 
Message(s) : 8
Inscrit le : 07 Juil 2011 15:39

Re: [Calc]Mettre dans l'ordre alphabétique les lettres d'un

Messagepar Dude » 07 Juil 2011 16:29

Salut,

Il faut que tu récupères le contenu de ta cellule et que tu affectes chaque lettre dans une variable de type tableau.

Une fois fait, tu peux utiliser cet exemple pour trier : viewtopic.php?f=8&t=10508&p=59565#p59600
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20801
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Calc]Mettre dans l'ordre alphabétique les lettres d'un

Messagepar Churay » 07 Juil 2011 16:37

Bonsoir

Dans ton code, tu travailles sur A1, que Basic considère comme une variable, non déclarée

En rajoutant en début de code Option Explicit, le lancement de ta macro provoque un message d'erreur qui annonce une variable non déclarée... Et dans l'EDI, la ligne concernée est en surbrillance (attention toutefois, cette info n'est pas toujours pertinente, selon les erreurs).

Une fois déclarée cette variable, il faut encore lui affecter la valeur de la chaîne de caractères.

De même une fois le traitement terminé, il faut faire quelque chose du résultat.

Ce qui peut donner
Option Explicit
Code : Tout sélectionner   AgrandirRéduire
Function Tridumot
Dim x As Integer, y As Integer, z As String
Dim oCell As Object, sCell As String

' Récupération de la Cellule A1
oCell = thisComponent.Sheets(0).getCellRangeByName("A1")

' Récupération du contenu texte de la Cellule A1
sCell = oCell.String

For x = 1 To Len(sCell) - 1
   For y = 1 To Len(sCell) - 1
      If Mid(sCell, y, 1) > Mid(sCell, y+1, 1) Then
         z = Mid(sCell, y, 1)
         Mid(sCell, y, 1) = Mid(sCell, y+1, 1)
         Mid(sCell, y+1, 1) = z
      End If
   Next y
Next x

' on affiche le résultat
MsgBox sCell

' ou on le place en B1
thisComponent.Sheets(0).getCellRangeByName("B1").String = sCell

' Puisque c'est une fonction, on peut retourner le résultat
Tridumot = sCell

' pour le récupérer dans un autre sub (ou une autre fonction)
' avec par exemple : OrdreDesLettres = Tridumot
'
' pour faire plus propre puisque la fonction renvoie un String on la déclare de ce type avec
' Function Tridumot As String
End Function


 Ajout : Je n'avais pas vu le post de Dude... et effectivement j'ai pensé aussi au tableau
mais avoir laissé le code original laisse à la porte ouverte pour une adaptation ;) 


 Ajout : 2
Autre exercice pour découvrir :
- éclater la chaîne, lettre par lettre, dans des cellules distinctes
- utiliser l'API (.Sort) pour trier les cellules
- reconstituer une chaîne et en faire quelque chose
- effacer l'éclatement :marto: 
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: [Calc] Tri alphabétique des lettres d'un mot

Messagepar Loopingss » 07 Juil 2011 17:14

Bonjour.
Le problème va se situer au niveau des doublons, comme dans nulle ou pomme.
Le plus simple.
Créer une boucle qui balaye le mot de 0 à len(mot)-1
Récupérer le caractère.
Tester le code ascii du caractère avec une boucle qui va du code 65 au code 65+25 (26 lettres)
Si le test est false passer au code avec une incrémentation
Si le test est true alors inscrire cette lettre en position n avec une incrémentation dans une variable du mot mis en ordre alphabétique.
Next jusqu'à la fin du mot.
Ainsi nulle donnera ellnu et pomme, emmop
eBnne eeiors (bonne soirée)
COOordialement
Apache OOo 4.1.0 fr (v officielles sur http://fr.OpenOffice.org) - LibO 4.1.5 Ubuntu 13.10 / Win XP / Win 7) - LibO 5.0.4 (Win 10)
Comment mettre un fichier en ligne - Mettre les bonnes balises dans les fils de discussion
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 687
Inscrit le : 17 Déc 2008 02:50

Re: [Calc] Tri alphabétique des lettres d'un mot

Messagepar Jean-Louis Cadeillan » 07 Juil 2011 17:31

Bonsoir,
...à titre de divertissement, une version sans macro
hoctopussy_01.ods
tri alphabétique des lettres d'un mot par formules
(39.86 Kio) Téléchargé 272 fois
==> mettre le mot dans la colonne jaune
==> lire le mot classé correspondant dans la colonne verte
Cordialement
Jean-Louis
PS : bon, d'accord, il y a des feuilles cachées... mais on peut en dire autant des macros :wink:
LibO 6.2.6.2 (x64 avec Java 1.8.0_221) et AOO 4.1.6 (avec Java x32 1.8.0_201), Windows 7 Édition Intégrale 64 SP1, (Domicile)
LibO 5.4.1.2 (x86) sous Ubuntu LTS 16.04.1, noyau 4.4.0-93 et Xfce 4.12, Java (x86) 1.8.0_131 (Travail) [obligation de version]
Avatar de l’utilisateur
Jean-Louis Cadeillan
ManitOOu
ManitOOu
 
Message(s) : 4413
Inscrit le : 03 Jan 2009 00:56

Re: [Calc] Tri alphabétique des lettres d'un mot

Messagepar Churay » 07 Juil 2011 17:59

Ca m'aurait étonné.... :super:

Cela dit : 1 seule macro sans autre feuille que celle où est saisi le mot...

M'enfin...
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: [Calc] Tri alphabétique des lettres d'un mot

Messagepar hoctopussy » 07 Juil 2011 18:28

Merci à tous pour vos réponses rapides !
Je vous rappelle cependant que je débute totalement. :marto:
Alors, en potassant un peu un bouquin que j'ai emprunté en médiathèque, j'ai modifié un peu la chose pour les "dim".
J'ai donc raccourci en :
Code : Tout sélectionner   AgrandirRéduire
Option Explicit
Function Anagrammes
Dim x%, y%, z$
Dim oCell As Object, sCell As String
oCell = thisComponent.Sheets(0).getCellRangeByName("A1")
sCell = oCell.String
For x = 1 To Len(sCell) - 1
   For y = 1 To Len(sCell) - 1
      If Mid(sCell, y, 1) > Mid(sCell, y+1, 1) Then
         z = Mid(sCell, y, 1)
         Mid(sCell, y, 1) = Mid(sCell, y+1, 1)
         Mid(sCell, y+1, 1) = z
      End If
   Next y
Next x
thisComponent.Sheets(0).getCellRangeByName("B1").String = sCell
Anagrammes = sCell
End Function

Ca fonctionne nickel pour la case A1. Maintenant, je souhaite l'étendre à toute la colonne A sans me soucier d'un ajout ou d'un retrait de mot.
J'ai (naïvement) pensé au départ que changer "A1" en "A1:Aquelquechose" allait marcher mais c'était trop beau. Si quelqu'un peut me guider.
Merci de votre aide.
LibreOffice 3.3.2 sur Vista et Ubuntu 11.04
hoctopussy
Fraîchement OOthentifié
 
Message(s) : 8
Inscrit le : 07 Juil 2011 15:39

Re: [Calc] Tri alphabétique des lettres d'un mot

Messagepar Churay » 07 Juil 2011 19:10

Il te faut faire une boucle qui englobe oCell = thisComponent.Sheets(0).getCellRangeByName("A1")
Donc il faut bâtir le nom de la Cellule, par exemple avec
Code : Tout sélectionner   AgrandirRéduire
For GrandeBoucle = 1 to 1000 'Ligne 1 à 1000
sCell = "A" & CStr(GrandeBoucle"
oCell = thisComponent.Sheets(0).getCellRangeByName(sCell)
' .../...


en condensé ça donne
Code : Tout sélectionner   AgrandirRéduire
For GrandeBoucle = 1 to 1000 'Ligne 1 à 1000
sCell = "A" & CStr(GrandeBoucle"
oCell = thisComponent.Sheets(0).getCellRangeByName("A" & CStr(GrandeBoucle")


Autre option passe par les index de ligne
Code : Tout sélectionner   AgrandirRéduire
For GrandeBoucle = 0 to 999 ' Ligne 1 à 1000, la ligne 1 ayant l'index 0
oCell = thisComponent.Sheets(0).getCellByPosition(0,GrandeBoucle)


Faire une boucle énorme n'est pas très élégant, il faut donc, a-minima, tester sir la Cellule est vide : si c'ext lke cas on sort de la boucle en supposant que les autres sont vides aussi.

Autre solution, déterminer la dernière ligne renseignée (il y a moult exemples sur le sujet) et faire la boucle avec cette valeur maximum.

Après la publication de ta solution, je mettrai la solution sans les boucle et tests
Code : Tout sélectionner   AgrandirRéduire
For x = 1 To Len(sCell) - 1
   For y = 1 To Len(sCell) - 1
      If Mid(sCell, y, 1) > Mid(sCell, y+1, 1) Then


Mais un conseil : regarde la solution de Jean-Louis, ça vaut le coup d'oeil... ;)
On a des Grand Maîtres de la Formule (alambiquée) autant regarder leurs solutions, c'est instructif
et rageant en ce qui me concerne : jamais je n'aurai de tels réflexes avec les fonctions de calc (je patine déjà avec l'API...)
Je me console en apprenant au vu des codes de nos gOOorOOos de la macro et de l'API ;)

Merci à tous

 Ajout : 
Jean-Louis Cadeillan a écrit:mais on peut en dire autant des macros :wink:[/i]

On peut dire aussi que la formule pour LeChienLèveLaPatteSansAiles répond ACLLLPSaaaeeeeehiilnnsstt quand la macro répond aaaACeeeeeèhiiLLLlnnPSssttv
No comment
Merci l'API et ceux qui m'ont appris à l'apprivoiser un peu :lol: 
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: [Calc] Tri alphabétique des lettres d'un mot

Messagepar hoctopussy » 07 Juil 2011 23:07

Merci pour votre aide à tous.
Pour l'instant je peaufine la solution de Churay puis je prendrai le temps de regarder celle des autres membres.
J'essaie de comprendre les lignes de code de Churay notamment celle passant par les index de lignes qui m'inspirent plus.

Admettons que je travaille désormais sur 10 lignes. Je dois donc ajouter un bout de code suivant :

Code : Tout sélectionner   AgrandirRéduire
For GrandeBoucle = 0 to 9
oCell = thisComponent.Sheets(0).getCellByPosition(0,GrandeBoucle)


1ère question : doit-je définir GrandeBoucle comme une variable ? Si oui, dois-je ajouter une ligne avant du type ?
Code : Tout sélectionner   AgrandirRéduire
Dim GrandeBoucle As Integer


2ème question : Pour compléter mes cellules B1:B10 dois-je modifier la ligne du code de la sorte ?
Code : Tout sélectionner   AgrandirRéduire
thisComponent.Sheets(0).getCellByPosition(1,GrandeBoucle).String = sCell


Avec ces modifications, en exécutant le Basic (F5), le module me renvoie sur la dernière ligne (End Function) :
Erreur de syntaxe Basic
Symbole inattendu : End Function

Merci pour vos éclairages
LibreOffice 3.3.2 sur Vista et Ubuntu 11.04
hoctopussy
Fraîchement OOthentifié
 
Message(s) : 8
Inscrit le : 07 Juil 2011 15:39

Re: [Calc] Tri alphabétique des lettres d'un mot

Messagepar hoctopussy » 07 Juil 2011 23:24

Magie du post !

J'ai trouvé mon erreur et la macro fonctionne nickel pour un nombre de lignes données (ici 10)

Code : Tout sélectionner   AgrandirRéduire
Function Anagrammes
Dim x%, y%, z$
Dim oCell As Object, sCell$
Dim GrandeBoucle As Integer
For GrandeBoucle = 0 to 9
   oCell = thisComponent.Sheets(0).getCellByPosition(0, GrandeBoucle)
   sCell = oCell.String
   For x = 1 To Len(sCell) - 1
      For y = 1 To Len(sCell) - 1
         If Mid(sCell, y, 1) > Mid(sCell, y+1, 1) Then
            z = Mid(sCell, y, 1)
            Mid(sCell, y, 1) = Mid(sCell, y+1, 1)
            Mid(sCell, y+1, 1) = z
         End If
      Next y
   Next x
   thisComponent.Sheets(0).getCellByPosition(1,GrandeBoucle).String = sCell
   Anagrammes = sCell
Next GrandeBoucle
End Function


Merci à tous pour votre aide :super:
LibreOffice 3.3.2 sur Vista et Ubuntu 11.04
hoctopussy
Fraîchement OOthentifié
 
Message(s) : 8
Inscrit le : 07 Juil 2011 15:39

Re: [Résolu][Calc] Tri alphabétique des lettres d'un mot

Messagepar Churay » 08 Juil 2011 02:04

Bonne nuit :lol:

Pour la bonne forme :
Les méthodes intervenant sur les cellules et/ou colonnes, définissent les index en Type Long.
Passer en paramètre un Type Integer (ou récupérer les valeurs) ne pose pas de pbs (enfin je n'en ai jamais rencontré jusque là), dans la mesure où l'on gère généralement des feuilles de taille correcte.
Or, LibreOffice peut gérer jusqu'à 1048576 lignes, soit un index de 0 à 1048575 : le Type Integer est explosé ;)
Moralité : il faut mieux essayer de travailler avec les Types prévus
A la question "On fait comment pour les connaître ?", la réponse est simple : XRay (qui permet bien d'autres découverte...) et/ou le SDK...

Et pour le fun :

Code : Tout sélectionner   AgrandirRéduire
Function AnagrammesFun
Dim aConfigTri(0) as new com.sun.star.table.TableSortField
Dim aDesc(1) As New com.sun.star.beans.PropertyValue
Dim oSheet As Object, oCell As Object, sCell As String, oRange As Object
Dim i As Long, sMot As String

   oSheet = thisComponent.Sheets(0)
   oCell = oSheet.getCellRangeByName("A1")
   sCell = oCell.String
   For i = 1 To Len(sCell)
      oSheet.getCellByPosition(1000,i).String = Mid(sCell, i, 1)
   Next i   

   oRange = oSheet.getCellRangeByPosition(1000,0,1000,i)
   aConfigTri(0).Field=0   
   aConfigTri(0).IsAscending=true

   aDesc(0).name="SortFields"
   aDesc(0).value=aConfigTri()
   aDesc(1).name="ContainsHeader"
   aDesc(1).value=true
   oRange.Sort(aDesc())
   
   For i = 1 To Len(sCell)
      sMot = sMot + oSheet.getCellByPosition(1000,i).String
      oSheet.getCellByPosition(1000,i).String = ""
   Next i   

   thisComponent.Sheets(0).getCellRangeByName("B1").String = sMot
End Function

A tester avec un mix Majuscules/Minuscules :lol:
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: [Résolu][Calc] Tri alphabétique des lettres d'un mot

Messagepar Jean-Louis Cadeillan » 08 Juil 2011 11:29

Churay a écrit:On peut dire aussi que la formule pour LeChienLèveLaPatteSansAiles répond ACLLLPSaaaeeeeehiilnnsstt quand la macro répond aaaACeeeeeèhiiLLLlnnPSssttv
Je pouvais répliquer, devant cette mesquine attaque, en faisant remarquer que le SCRABBLE n'a que faire des minuscules et autres lettres accentuées, mais je suis beau joueur, je te propose une solution répondant à ton défi ! :mrgreen:
hoctopussy_02.ods
Tri alphabétique des lettres d'un mot quelle que soit la casse
(68.04 Kio) Téléchargé 166 fois
Quant au nombre de feuilles, j'eusse pu tout mettre sur la même (puisque le plus long mot de la langue française fait 25 lettres), mais j'ai privilégié la présentation pédagogique par étape... :wink:
A+
Jean-Louis
LibO 6.2.6.2 (x64 avec Java 1.8.0_221) et AOO 4.1.6 (avec Java x32 1.8.0_201), Windows 7 Édition Intégrale 64 SP1, (Domicile)
LibO 5.4.1.2 (x86) sous Ubuntu LTS 16.04.1, noyau 4.4.0-93 et Xfce 4.12, Java (x86) 1.8.0_131 (Travail) [obligation de version]
Avatar de l’utilisateur
Jean-Louis Cadeillan
ManitOOu
ManitOOu
 
Message(s) : 4413
Inscrit le : 03 Jan 2009 00:56

Re: [Résolu][Calc] Tri alphabétique des lettres d'un mot

Messagepar Churay » 08 Juil 2011 12:06

Je ne doutais pas que la réponse serait rapide ;)

Jean-Louis Cadeillan a écrit:j'ai privilégié la présentation pédagogique par étape...

Merci pour cette approche :super: Cela dit je ne suis pas convaincu que cela aiguisera mes réflexes formules, mais c'est toujours un plaisir de découvrir...

J'arrête le flood avant qu'on se fasse gronder par les vilains modos :lol:

 Ajout : Comment veux-tu qu'un autre biffin pense à tous ces trucs alambiqués...
Il se contente d'essayer de penser API (du peu qu'il en connait, et dans ce qu'il en connait : il y a beaucoup d'idées empruntées)
Mais chapeau bas ;)

J'ai collé les formules, et j'ai affiché sur un tableau que je consacre à aux suprêmes répertoriés ou non comme tels : non, il n'y a pas que quelques auteurs...
J'adore la tête des mecs de la DSI, quand il s'attardent sur le tableau
:lol: 
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 6 invité(s)