VBA 2010: Automatiser un tri colonne par colonne

Résolu/Fermé
MIKI - 3 juil. 2020 à 18:55
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 - 4 juil. 2020 à 21:34
Bonsoir, nouveau dans le domaine, je cherche à créer deux boucles pour réaliser 2 tris.

a) Pour un tableau, je cherche à enfermer la séquence suivante : (Colonne change)

....End With
Range("E6:E225").Select
ActiveWorkbook.Worksheets("Result 25-50").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Result 25-50").Sort.SortFields.Add Key:=Range("E6" _
), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Result 25-50").Sort
.SetRange Range("E6:E225")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("F6:F225").Select ....

et ainsi de suite jusqu'à : Range("FB6:FB225")

b) Pour un autre, c'est celle ci : (ligne change)

........End With
Range("C7:DA7").Select
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("Result Perm").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Result Perm").Sort.SortFields.Add Key:=Range( _
"C7:DA7"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Result Perm").Sort
.SetRange Range("C7:DA7")
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
Range("C8:DA8").Select ......

et ainsi de suite jusqu'à : Range("C150:DA225")

Voili, je n'arrive pas à trouver la syntaxe juste de loop qui plait à la machine ... et le faire ligne par ligne à la mimine ... j'ose pas imaginer. Dans les 2 cas, la longueur des plages reste fixe.
Si d'aventure se trouve l'âme d'un connaisseur .... D'avance Merci
MIKI
A voir également:

6 réponses

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
3 juil. 2020 à 21:23
bonjour,
pour commencer, utilise les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
explique-nous ce que tu connais en programmation, cela nous aidera à mieux t'aider
tu parles de 2 tris, et il me semble que tu veux en faire beaucoup plus. ai-je mal compris?
ensuite, si tu veux simplement faire une boucle en te déplaçant d'une colonne, tu peux faire ainsi:
dim zone as range
set zone = Range("E6:E225")
'instruction de début de boucle
     ' ..... traitement dans la boucle
     set zone=zone.offset(0,1)
'instruction de fin de boucle
0
Bonsoir, merci pour ton intervention. Connaissance en VBA = 0 !! j'ai recherché dans le net les infos pour écrire ce qui fonctionne déjà mais sans plus. Je ne comprends pas bien ce qu'est le Pb de balises ? (Je pense être meilleur en mécanique générale ou en électronique)
Ce sont 2 TYPES de tri que je cherche à créer.
a) Il existe plusieurs tableaux avec les données entrées en colonnes, la zone complète à traiter serait donc (par ex) de E6 à CD225 à trier colonne par colonne ( de E6 à E225, puis F6 à F225 ... jusqu'à CD6 à CD225). Le type de tri comporte dans sa "structure" la zone dans laquelle il travaille et je ne sais pas comment la faire évoluer pour passer le tri à la partie renseignée de la colonne suivante.
b) Il existe aussi plusieurs tableaux avec des données entrées par lignes et il conviendrait de trier toute la zone (fixe) exploitée ligne par ligne donc par ex trier de B6 à DA6 puis de B7 à DA7 et ainsi de suite, sans aucune interaction entre les résultats de chaque ligne
=> D'où ma demande pour créer 2 types de boucles de tri qui seront effectués chacun sur la page active qui leur est propre.
Voilà, j'espère ne pas avoir été trop confus dans mon explication et encore merci pour l'intérêt porté.
MIKI
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
4 juil. 2020 à 00:54

Je ne comprends pas bien ce qu'est le Pb de balises ?

Il te suffit de lire le contenu du lien donné par Yg_be pour comprendre de quoi il s'agit...
0
J'ai oublié de préciser que je n'ai rien écris moi même des lignes de codes posées ! j'ai simplement fait dans EXCEL 2010 :
- enregistrer une macro
- sélectionner une zone (B6 à B225 par exemple)
- clic sur "trier"
- renseigner la boite de dialogue du tri pour l'adapter à mon besoin.
- dire "non" pour étendre la zone.
- clic "ok"
- sélectionner une zone (C6 à C225)
- clic sur "trier".... et ainsi de suite.
- macro arrêter l'enregistrement
Je souhaite donc de l'aide pour créer une boucle qui réalise ce tri de la colonne C à DA sans avoir à poser cette routine autant de fois qu'il y a de colonnes à trier. (Idem pour les autres fichiers ou il faut trier des lignes)
Je suppose que le "langage" utilisé par excel est du VBA mais je n'en sais pas plus. Encore Merci
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
4 juil. 2020 à 10:42
malheureusement, tu ne nous montres pas le code pour la zone (C6 à C225). En ne nous montrant que le code pour une zone, tu ne nous permets pas de déterminer ce qui change entre les deux zones.
0
Bonjour, hélas pas grand chose ne change !! Simplement les lettres de colonnes et c'est ce qui me pose Pb ! Je suppose que la balise en question à défaut de VBA est peut être le XML ??

End With
Range("D6:D225").Select
ActiveWorkbook.Worksheets("Result 100").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Result 100").Sort.SortFields.Add Key:=Range("D6" _
), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Result 100").Sort
.SetRange Range("D6:D225")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Range("E6:E225").Select
ActiveWorkbook.Worksheets("Result 100").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Result 100").Sort.SortFields.Add Key:=Range("E6" _
), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Result 100").Sort
.SetRange Range("E6:E225")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Range("F6:F225").Select
ActiveWorkbook.Worksheets("Result 100").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Result 100").Sort.SortFields.Add Key:=Range("F6" _
), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Result 100").Sort
.SetRange Range("F6:F225")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range ......
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
4 juil. 2020 à 11:30
en ce qui concerne les balises, as-tu lu la page dont j'ai donné le lien?
suggestion:
Dim col As Long
For col = 4 To 82
    Range(Cells(6, col), Cells(225, col)).Select
    ActiveWorkbook.Worksheets("Result 100").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Result 100").Sort.SortFields.Add Key:=Cells(6, col) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
        xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("Result 100").Sort
        .SetRange Range(Cells(6, col), Cells(225, col))
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
Next col
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Balises : J'ai bien compris la résultante, mais pour le néophyte que je suis( et resterait probablement) j'ai tout lu et cela reste une sombre histoire, comment savoir que la balise pour les macros d'Excel est : ??? je ne le sais hélas toujours pas .

Suggestion : Bravo et ENCORE BRAVO !!! cela fonctionne parfaitement sans aucune modif ! j'avais bien tourné autour sans jamais trouver la syntaxe correcte. Je le redis : 1000 Mercis.

Pour la macro qui trie par ligne je suppose donc que ce sera :

Dim lin As Long
For lin = 2 To 105
Range(Cells(lin, B), Cells(lin, DA)).Select ...... etc etc
ou bien les colonnes doivent elles être nommées par leur N° ??
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
4 juil. 2020 à 17:52
pour les balises, il faut utiliser "basic", le langage de Excel étant le VBA, "visual basic for applications". en cas de doute, il est préférable d'utiliser les balises sans spécifier le langage, plutôt que pas de balise du tout.

pour le tri par ligne, on n'est pas obligé de spécifier les colonnes par leur numéro. Cependant, il faut mettre les noms de colonnes entre guillemets:
Cells(lin, "B")
. En effet, il ne s'agit pas de la variable nommée B.

il est recommandé d'avoir une ligne
option explicit
en début de module, cela aide à détecter l'utilisation de variables non déclarées, qui peuvent, sinon, créer des soucis compliqués à comprendre.
0
Je n'ose plus dire Merci, c'est plus de réponses que je n'en espérait.
De zéro, je suis passé à quelque chose qui fonctionne parfaitement en moins de 24h !
Je te souhaite de pouvoir continuer dans cette voie et un excellent Dimanche.
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
4 juil. 2020 à 21:34
cela a bien avancé, en bonne partie parce que tu as expliqué clairement.
j'ai marqué la discussion comme résolue, supposant que tu ne pouvais pas le faire, ayant changé d’identifiant entre le début et la fin.
bonne progression à toi aussi!
0