Tri alphabétique (feuil à feuil)

  • Initiateur de la discussion Rv_mikey
  • Date de début
R

Rv_mikey

Guest
Bonjour à toutes et tous,

Voilà mon soucis :

Sur la feuil1, en colonnes A1 ( sur plusieurs lignes ), j'ai une liste de mots.

J'aimerai que les mots se trient automatiquement sur la feuil2, par colonnes et par ordres alphabétiques c'est à dire que tous les mots commencant par A se mettent dans la colonnes A1, les mots commencant par B dans la colonnes B1 et ainsi de suite....

Je ne sais pas comment faire quoi utiliser...

Quelqu'un aurait-il un début de solution....

Merci par avance....

PS : c'est la première fois que je vois un forum où reigne gentillesse d'esprit, solidarité et respect. Longue vie à ce merveilleux forum.........
 
C

Celeda

Guest
Bonsoir,

Encore une fois on a deux réponses pour une question ; la macro de Laurent * et la formule de Monique . Super ! (dans la database *).

* Macro : je n'y connais rien du tout Laurent mais une chose ; je sais qu'il existe un screen....quelque chose qui évite de voir défiler la feuille - mais tout s'éxécute trés bien.

* Database : voilà un bel exemple Thierry qui me pose de nouveau un probléme - je sais que je te casse les pieds avec cela mais n'oublie pas quant tu auras du temps de voir ce que l'on peut faire. Merci. C'est pas pessé. il s'agit d'avoir l'option macro ou formule. On double les fils ou ???
Ah je sais je t'entends d'ici. Oh Celeda........tu me ..............!!!!!!

Merci.

Celeda
 
L

LaurentTBT

Guest
C'est bien parce que c'est toi, Celeda...

Ceci dit, ta remarque est tout-à-fait judicieuse, car si le nombre de mots est très important, et cela semble le cas, empècher le rafraîchissement de l'affichage pendant l'exécution du code fera sans doute gagner du temps non négligeable.

Alors, ces tournesols?
(Pour moi, le jardinage, c'est pour demain, enfin, si Mr. météo le veut bien)
 

Pièces jointes

  • TriAlphaTBT.zip
    13.3 KB · Affichages: 16
  • TriAlphaTBT.zip
    13.3 KB · Affichages: 17
  • TriAlphaTBT.zip
    13.3 KB · Affichages: 18
Z

zon

Guest
Bonsoir à tous,




Je me permets de m'insérer dans ce fil, car l'algo de Laurent est excellent, mais on peut encore accélerer l'exécution du code...


Laurent, c'est dans ta BAL, à toi de le mettre ou pas puisque ces tes macros...



A+++
 
L

LaurentTBT

Guest
Il y a eu quelques croisements dans les réponses...

Merci pour ces précieux conseils, Zon.
Voilà une version nettoyée.
Juste une petite interrogation sur ma façon de compter le nombre de mots pour remettre le tri dans le bon ordre. n'y a-t-il pas mieux (j'ai encore plusieurs select!)
 

Pièces jointes

  • TriAlphaTBT.zip
    13.4 KB · Affichages: 19
  • TriAlphaTBT.zip
    13.4 KB · Affichages: 22
  • TriAlphaTBT.zip
    13.4 KB · Affichages: 19
C

Celeda

Guest
Bonsoir,

Merci RV Mickey pour tes explications mais tu sais je suis curieuse alors....et je pense que tu as le choix maintenant.
Merci messieurs pour la macro et Madame pour la formule.


Bon dimanche.

Celeda
 
Z

zon

Guest
Re,


Comme tu utilises la méthode autofill (la plus rapide car elle incrémente automatiquement les formules), on se retrouve avec 13 lignes sur 26 colonnes de formules, donc il n'y a pas d'autres solutions que faire une boucle sur la sélection pour récupérer les cellule contenant un texte. (Même avec la méthode specialcells, j'arrive à les trier mais les cellules contenant une formule sans "résultat" (cellules blanches ) sont en premieres positions ... )


Tu as juste oublié de modifier complétement le code réinitialisation ....il y a toujours des select sinon on divise par 2 le nb de lignes.


A+++



PS: THIERRY, j'ai arrêté le ping pong cette semaine (lol):comme Laurent est un nouveau venu actif , j'ai préféré le conseiller par BAL que sur le post afin que mes remarques sur son code ne le blessent pas au yeux de tout le monde d'autant plus que je ne suis pas toujours un modèle....
 
L

LaurentTBT

Guest
Bonsoir à tous,

Après ce dimanche bien chargé me revoilà à nouveau sur ce fil, bien conscient d'être grandement responsable de sa longueur...

Et oui, puisqu'on s'est lancé dans le nettoyage de mes macros, et bien il y a du boulot. D'ailleurs, Zon, n'ai pas peur de me "blesser", car si je suis devenu aussi actif sur ce forum génial découvert depuis si peu, c'est bien dans le but principal de ma perfectionner!

Zon, tu dis qu'il reste des "select" dans mon code réinitialisation, or je n'en vois plus. Peut-être n'était-ce pas la bonne version (j'aurais du numéroter, il y en a eu tellement). Peux-tu être plus précis, s'il te plait?
Pour la deuxième partie du code, et plus précisemment pour le deuxième tri pour remettre dans l'ordre alphabétique sur chaque colonne, j'ai trouvé ceci pour passer outre les cellules blanches:
NbreDonnées = 65536 - WorksheetFunction.CountBlank(Range("A1").Cells(1, i).Resize(65536, 1))

En perfectionniste que je suis, je me demandais (et je vous demande donc):
Vaut-il mieux définir cette variable, et donc rajouter une ligne, ou avoir une ligne de code très longue, mais sans passer par la variable? ie:
Avec variable:
NbreDonnées = 65536 - WorksheetFunction.CountBlank(Range("A1").Cells(1, i).Resize(65536, 1))
If NbreDonnées > 1 Then _
Range("A1").Cells(1, i).Resize(NbreDonnées, 1).Sort Key1:=Rang("A1"). _ Cells(1, i), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom
Sans variable:
If Range("A2").Cells(1, i)<> "" Then _
Range("A1").Cells(1, i).Resize(65536 - WorksheetFunction.CountBlank(Range("A1").Cells(1, i).Resize(65536, 1)), 1).Sort Key1:=Rang("A1"). _
Cells(1, i), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom

C'est vraiment une question pour pinailler!

En tout cas , je n'ai plus un seul select dans cette version que j'espère être la der des ders. Et dans un grand élan d'inconscience, je me risque à joindre cette version que j'ose appeler TriAlphaUltime.
 

Pièces jointes

  • TriAlphaUltime.zip
    13 KB · Affichages: 17
Z

zon

Guest
Bonsoir à tous,



Laurent, je n'avais pas pensé à faire un copier collage spécial, pour cette histoire de formules... Effectivement ce n'était pas la bonne version que tu avais mise.

Beau boulot.
Il manque juste en début de macro, une gestion d'erreur, cela évite que la macro s'arrête en cours d'exécution...


On error Goto Fin
.....
le code
Fin:
end sub

Les paramètres Order1 etc.., on peut les omettre car ce sont les paramètres par défaut de la méthode Sort.




A+++
 
L

LaurentTBT

Guest
Merci, Zon.

A quoi sert exactement la gestion d'erreur? Autrement dit, dans quel cas la macro peut-elle s'arrêter en cours d'exécuton?
Ou bien est-ce une précaution, au cas où? Mais ne vaut-il pas mieux laisser l'éventuel message d'erreur apparaître, car si la macro ne s'exécute pas complétement, la suite du traitement de Rv_Mickey risque aussi de poser problème...

En tout cas, maintenant que tu m'as montré mes faiblesses, je vais avoir un sacré boulot pour reprendre mon appli de gestion de mes finances personnelles qui est bourrées de select...

Bonne nuit à tous, et à bientôt.
 
Z

zon

Guest
Re,

Si t'es sûr que ta macro ne plante jamais, pas besoin de gestion d'erreurs.


Par contre pour une raison ou une autre le programme plante, cela peyt éviter bien des tracas à l'utilisateur, en lui rajoutant un message d'erreur.


Par exemple si tu as plus de 32767 lignes ta macro va planter car Nbredonnees est déclarée en integer...


Si on supprime la feuille 2, plantage aussi..
Vérifier que la calcul est en mode auto, car tu utilises des formules...


A+++
 
@

@+Thierry

Guest
Bonsoir à tout ce fil

Bon ben tant qu'on est sur un fil long, je vais y mettre ma couche !! lol

Bon alors deux trois remarques comme çà à la volée...


Nom des Fichiers Postés

Vu que Laurent tu as l'air aimer produire des fichier et des versions...

Si tu as l'intention de t'y retrouver et que les autres suivent tes Fichiers et surtout leur évolution, il est important de ne pas poster TRiAlphaTbt à plusieurs reprises et reprises avec le même nom.

Surtout pour un fichier que tu souhaites faire évoluer et pour lequel tu demandes participation.

Le même nom, provoque
1: On ne peut ouvrir les deux en même temps pour voir la différence...
2: On finit par plus savoir de quelle version on parle, ou on finit par poster la vieille version (voir juste ici :))

L'implémentation standard des noms de versions s'effectue comme ceci
TriAlphaTbt => fichier de départ ou base de donnée
TriAlpha01 => Premier Programme
TriAlpha01.01 => Premiere Version Corrigée du Premier Programme (pour un rectificatif de bug)
TriAlpha02.00 => Deuxième Version du Programme (Ajout de Fonctionnalités)
TriAlpha02.01 => Première Version Corrigée de la Version Deux... etc etc...

C'est pas pour la frime et se prendre pour Bill c'est vraiment important si tu veux t'y retrouver...


Pour ce qui est de ta Question Variable or Not Variable

D'ailleurs personne ne t'a encore répondu.

En fait il ne faut pas croire que le fait d'utiliser des Variables va ralentir un code... Si tu déclares et définis bien tes variables et surtout clairement tu y gagnera en lisibilité du code. De plus si je me souviens les leçons de Ti, il a dit quelque chose dans le sens que dans les languages compilés même si on n'écrit pas nous même les variables, les compilateurs en créé eux-même des temporaires.

De plus comme dans tout langage, le fait de pouvoir utiliser une variable, peut permettre une mise à jour en masse d'un code en ne changeant qu'une ligne de code... Donc un programme bien construit avec des variables sera toujours plus facilement évolutif.

Un dernier avantage, avec option Explicit, et des variables rééllement déclarées (pas juste Dim Toto..... Mais As Kekchose) te permettra de voir de suite où ton code plante.


Pour la gestion d'erreur...

Là je ne sais pas trop, et surtout je ne vois pas la raiZon de la proposition de Zon...
Dans certains cas une gestion d'erreur est nécessaire si par exemple il y a un facteur risque que le user ait encore la possibilité de faire un action qui planterait l'execution du déroulement d'une procédure. (Par exemple on click sur un Bouton de UserForm et on a pas rempli ce qu'il fallait avant.... et donc la gestion d'erreur fait qu'on n'exécute pas le code de Validation par exemple)

Mais sur une procédure comme la tienne et donc comme ceci, non je suis plutôt de ton avis, on pourrait avoir un plantage mais le User pourrait du coup ne pas le voir et avoir des données dont l'intégrité seraient plus que douteuses... Donc, non, je ne vois pas la nécessité de gestion d'erreur ici. (il ne faut pas cacher le erreurs... si on supprime la feuille 2, ben c'est la faute du couillon qui l'a virée pas celui qui a écrit le code !!!) lol


Pour les Select...

Je pense que la question est réglèe

Mais je n'insisterais jamais assez, enregistrez tout ce que vous voulez, mais virez les Select !!! lol (Myta en sait quelque chose !)


Pour la formule utilisée dans ce programme...

Range("A1").FormulaR1C1 = _
"=IF(CODE(UPPER(Feuil1!RC1))=64+COLUMN(RC),Feuil1!RC1,"""")"

Chapeau Laurent !! je ne suis pas arrivé à l'écrire en VBA, en passant par des calcul VBA j'entends (par WorksheetFunction).

Et bravo aussi pour l' AutoFill et les Resize(NbreDonnées, 26)... bien vu.

Toutefois je ne suis pas partisant de faire écrire des formules en dûr sur des cellules par VBA pour pouvoir exécuter une macro et les effacer ensuite... Mais j'ai pas trouvé vraiment mieux !

Enfin voici moi comment j'aurai procédé avec une boucle classique qui à l'avantage de laisser les datas dans l'ordre où elles se trouvaient initialement, et aussi de ne pas mettre #VALEUR! dans toutes les colonnes si jamais il y a une rupture (cellule vide) dans la plage :

Sub MiseEnOrdreAlpha()
Dim Plage As Range, Cell As Range, C As String, L As Integer

Set Plage = Sheets(1).Range("A1:" & Sheets(1).Range("A65536").End(xlUp).Address)
For Each Cell In Plage
If Not IsEmpty(Cell) Then
C = Left(UCase(Cell), 1)
L = Sheets(2).Range(C & "65536").End(xlUp).Row + 1
Sheets(2).Cells(L, C) = Cell
End If
Next Cell
End Sub


J'ai aussi essayé une autre méthode, avec ceci
'C = Asc(UCase(Cell)) - 64
'L = Sheets(2).Columns(C).End(xlUp).Row + 1

Les deux semblent possibles, mais cette dernière me fait un sbinz pour l'incrémentation des ligne d'écriture. Mais bon... vu l'heure çà ira :)

Ah oui la macro ci dessus démarre à la ligne Deux, j'ai laissé aussi, c'est juste pour l'idée en fait...

Bon et bien bonne nuit
@+Thierry
 
C

Celeda

Guest
Bonsoir,

au début de ce fil, RV Mickey avait un petit souci,

et puis Jon lui a donné une solution en VBA

et puis Celeda a voulu s'y frotter en formule,

et puis Laurent s'est mis dans la course du VBA

il a été rejoint par Monique en formule 1 (number one)

puis assisté d'un complément de Zon en VBA

pour ensuite des allers et retours sur la piste de Laurent et de Zon


et puis est arrivé en final un dernier coureur @+Thierry en VBA et surtout en mini-tutorial ....................(je t'ai pas mal suivi cette fois-ci)

Conclusion : plus on est de fous sur un post et plus on s'amuse sur XLD et surtout on apprend plein de choses !!!

et puis il y a plus de soucis !!!!!!!!!!


Bonne semaine à vous toutes et tous et merci pour tout le post.

Celeda
 
@

@+Thierry

Guest
Bonjour le Fil et le Forum

Merci STéphane

C'est bien vu.

Tu me fais réviser le IIf :))

Proper est simple d'emploi pour avois la première lettre en Maj

Pour le Val en combinaison avec le IIf, je saisis comment tu arrives à indiquer ce qui est vrai de ce qui est faux, mais comment fais-tu pour arriver à retourner la valeur Character Code avec Proper (?)... moi j'ai eu besoin de Asc...

Je ne vois pas encore comment incrémenter un tableau avec cette astuce, surtout que tu utilises des références entre crochets qui m'ont toujours très pertubé !

Mais en tout cas merci, car avec toi on en a jamais fini de découvrir decouvrir des trucs pas possibles :)

Bon là on va plus avoir de net pour un moment donc je vous souhaite à tous et toutes un bon apétit et une bonne aprèm.

@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
314 655
Messages
2 111 603
Membres
111 217
dernier inscrit
aladinkabeya2