[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 !
hoctopussy
Fraîchement OOthentifié
Messages : 8
Inscription : 07 juil. 2011 14:39

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

Message par hoctopussy »

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

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 modification par Oukcha le 08 juil. 2011 06:19, modifié 3 fois.
Raison : Ajout coche (balise présente)
LibreOffice 3.3.2 sur Vista et Ubuntu 11.04
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25175
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

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

Message par Dude »

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 : http://user.services.openoffice.org/fr/ ... 565#p59600
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

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

Message par Churay »

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

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
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 01:50

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

Message par Loopingss »

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
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 5752
Inscription : 02 janv. 2009 23:56

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

Message par Jean-Louis Cadeillan »

Bonsoir,
...à titre de divertissement, une version sans macro
hoctopussy_01.ods
==> 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:
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibO 7.6.6.3 (x64 avec Java 1.8.0_411) et AOO 4.1.15 (avec Java x32 1.8.0_381), Windows 7 Édition Intégrale 64 SP1
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

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

Message par Churay »

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...
hoctopussy
Fraîchement OOthentifié
Messages : 8
Inscription : 07 juil. 2011 14:39

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

Message par hoctopussy »

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

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
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

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

Message par Churay »

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

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

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

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

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...
hoctopussy
Fraîchement OOthentifié
Messages : 8
Inscription : 07 juil. 2011 14:39

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

Message par hoctopussy »

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

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

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

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é
Messages : 8
Inscription : 07 juil. 2011 14:39

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

Message par hoctopussy »

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

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
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

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

Message par Churay »

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

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
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 5752
Inscription : 02 janv. 2009 23:56

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

Message par Jean-Louis Cadeillan »

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
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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibO 7.6.6.3 (x64 avec Java 1.8.0_411) et AOO 4.1.15 (avec Java x32 1.8.0_381), Windows 7 Édition Intégrale 64 SP1
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

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

Message par Churay »

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...