[Excel VBA] tri sur plusieurs criteres

lolonene

XLDnaute Nouveau
Bonjour à tous,

J'ai un tableau qui comporte entre autres 3 colonnes dont nom, prénom et ages.
je cherche à trier ce tableau en vba en fonction de deux critères tri par ages croissant par ordre alphabétique. mon problème est qu'il faudrait que mon résultat soit un tri alphabétique des 6 9 ans par exemple puis dessous un tri alphabétique des 7 12ans et la je peche.
j'ai bien essayé avec un sort key mais je ne m'en sort pas avec les criteres (dont jene trouve pas de documentations soit dit en passant).
L'un de vous à t'il une astuce ?
 

lolonene

XLDnaute Nouveau
Re : [Excel VBA] tri sur plusieurs criteres

en fait mon tableau vient de la fusion de deux autres tableaux un 3-5 et un 6-12 que j'aurais aimé trier comme je l'ai dit. la solution serait peut être de les trier avant puis de les joindre, mais ne connaissant pas le nombre de ligne de chaque tableau par avance, je ne sais pas faire avec mes maigres connaissance.

Mon code actuel :
Code:
Sub SelectRecopie()
' *********************
' * Macro de synthese *
' *********************

' Rend visible la feuille calcul
Worksheets("calcul").Visible = True

'Efface tout le contenu de la feuille calcul
Worksheets("calcul").Range("A1:IV65536").ClearContents

' Copie le contenu des cellules a7 à a40 de la feuille 3-5 ans vers la feuille calcul en A1
Worksheets("3-5 ans").Range("A7:Q40").Copy Worksheets("calcul").[A1]

' Copie le contenu des cellules a7 à a40 de la feuille 6-12 ans vers la feuille calcul en A1
Worksheets("6-12 ans").Range("A7:Q40").Copy Worksheets("calcul").[A41]

' Tri le contenu de la feuille calcul par ordre croissant
Worksheets("calcul").Range("A1:Q100").Sort key1:=Worksheets("calcul").Range("A1:C100"), order1:=xlAscending, key2:=Worksheets("calcul").Range("C1:C100"), order2:=xlAscending

' copie le resultat obtenu sur la feuille calcul dans le tableau de synthèse en feuille recap
Worksheets("calcul").Range("A1:Q40").Copy Worksheets("recap").[A7]

'Efface tout le contenu de la feuille calcul
Worksheets("calcul").Range("A1:IV65536").ClearContents

' Rend invisible la feuille calcul
Worksheets("calcul").Visible = False

End Sub

Sub Tri3a5()
'Macro de tri par ordre alphabetique la feuille 3 à 5 ans
Worksheets("3-5 ans").Range("A7:Q40").Sort key1:=Worksheets("3-5 ans").Range("A7:B40"), order1:=xlAscending
End Sub

Sub Tri6a12()
'Macro de tri par ordre alphabetique la feuille 6 à 12 ans
Worksheets("6-12 ans").Range("A7:Q40").Sort key1:=Worksheets("6-12 ans").Range("A7:B40"), order1:=xlAscending
End Sub
 

lolonene

XLDnaute Nouveau
Re : [Excel VBA] tri sur plusieurs criteres

3-5 6-12 pardon pour l'erreur plus haut, mais la valeur des tranches n'influe pas sur la méthode à appliquer. C'est quand même étrange que je ne trouve aucun doc complète sur le net sur sort key (enfin sur les arguments et qui fait quoi).
Je cherche encore
 

tototiti2008

XLDnaute Barbatruc
Re : [Excel VBA] tri sur plusieurs criteres

à tester (pas trop facile sans le fichier...)

Code:
Sub SelectRecopie()
Dim Derligne3_5 As Long, Derligne6_12 As Long, Derligne As Long
' *********************
' * Macro de synthese *
' *********************
' Rend visible la feuille calcul
Worksheets("calcul").Visible = True
'Efface tout le contenu de la feuille calcul
Worksheets("calcul").Range("A1:IV65536").ClearContents
' Copie le contenu des cellules a7 à a40 de la feuille 3-5 ans vers la feuille calcul en A1
Derligne3_5 = Worksheets("3-5 ans").Range("A65536").End(xlUp).Row
Worksheets("3-5 ans").Range("A7:Q" & Derligne3_5).Sort Key1:=Range("A7"), Order1:=xlAscending, Key2:=Range( _
        "B7"), Order2:=xlAscending, Header:=xlNo
Worksheets("3-5 ans").Range("A7:Q" & Derligne3_5).Copy Worksheets("calcul").[A1]
' Copie le contenu des cellules a7 à a40 de la feuille 6-12 ans vers la feuille calcul en A1
Derligne6_12 = Worksheets("6-12 ans").Range("A65536").End(xlUp).Row
Derligne = Worksheets("calcul").Range("A65536").End(xlUp).Row
Worksheets("6-12 ans").Range("A7:Q" & Derligne6_12).Sort Key1:=Range("A7"), Order1:=xlAscending, Key2:=Range( _
        "B7"), Order2:=xlAscending, Header:=xlNo
Worksheets("6-12 ans").Range("A7:Q" & Derligne6_12).Copy Worksheets("calcul").Range("A" & Derligne + 1)
Derligne = Worksheets("calcul").Range("A65536").End(xlUp).Row
' copie le resultat obtenu sur la feuille calcul dans le tableau de synthèse en feuille recap
Worksheets("calcul").Range("A1:Q" & Derligne).Copy Worksheets("recap").[A7]
'Efface tout le contenu de la feuille calcul
Worksheets("calcul").Range("A1:IV65536").ClearContents
' Rend invisible la feuille calcul
Worksheets("calcul").Visible = False
End Sub
 

tototiti2008

XLDnaute Barbatruc
Re : [Excel VBA] tri sur plusieurs criteres

à priori ta macro a besoin de 4 feuilles seulement
diminue le nombre de lignes dans chaque tableau

l'erreur a lieu sur un tri ? moi je suis en Excel 2003, je crois que les options de tris peuvent être un peu différentes...

une remarque : je n'arrive pas à ouvrir les zip, ce qui risque de ne pas t'aider...
 

lolonene

XLDnaute Nouveau
Re : [Excel VBA] tri sur plusieurs criteres

J'ai épuré au maximum en ne laissant que les données, viré la feuille 6-12 ans et le code correspondant pour arriver au 48 ko (c'est un peut juste). Toujours erreur 400 à l'exécution de la macro. Version Excel 2000
 

Pièces jointes

  • test clsh 3.xls
    48.5 KB · Affichages: 233

tototiti2008

XLDnaute Barbatruc
Re : [Excel VBA] tri sur plusieurs criteres

version corrigée :

Code:
Sub SelectRecopie()
Dim Derligne3_5 As Long, Derligne6_12 As Long, Derligne As Long
' *********************
' * Macro de synthese *
' *********************
' Rend visible la feuille calcul
Worksheets("calcul").Visible = True
'Efface tout le contenu de la feuille calcul
Worksheets("calcul").Range("A1:IV65536").ClearContents
' Copie le contenu des cellules a7 à a40 de la feuille 3-5 ans vers la feuille calcul en A1
Derligne3_5 = Worksheets("3-5 ans").Range("A65536").End(xlUp).Row
Worksheets("3-5 ans").Activate
Worksheets("3-5 ans").Range("A7:Q" & Derligne3_5).Sort Key1:=Range("A7"), Order1:=xlAscending, Key2:=Range( _
        "B7"), Order2:=xlAscending, Header:=xlNo
Worksheets("3-5 ans").Range("A7:Q" & Derligne3_5).Copy Worksheets("calcul").[A1]
' Copie le contenu des cellules a7 à a40 de la feuille 6-12 ans vers la feuille calcul en A1
Derligne6_12 = Worksheets("6-12 ans").Range("A65536").End(xlUp).Row
Derligne = Worksheets("calcul").Range("A65536").End(xlUp).Row
Worksheets("6-12 ans").Activate
Worksheets("6-12 ans").Range("A7:Q" & Derligne6_12).Sort Key1:=Range("A7"), Order1:=xlAscending, Key2:=Range( _
        "B7"), Order2:=xlAscending, Header:=xlNo
Worksheets("6-12 ans").Range("A7:Q" & Derligne6_12).Copy Worksheets("calcul").Range("A" & Derligne + 1)
Derligne = Worksheets("calcul").Range("A65536").End(xlUp).Row
' copie le resultat obtenu sur la feuille calcul dans le tableau de synthèse en feuille recap
Worksheets("calcul").Range("A1:Q" & Derligne).Copy Worksheets("recap").[A7]
'Efface tout le contenu de la feuille calcul
Worksheets("calcul").Range("A1:IV65536").ClearContents
' Rend invisible la feuille calcul
Worksheets("calcul").Visible = False
End Sub

REMARQUE : je précise que le code part du principe que la liste commence en A7 dans les feuilles 3-5 ans et 6-12 ans !
 

lolonene

XLDnaute Nouveau
Re : [Excel VBA] tri sur plusieurs criteres

Merci beaucoup tototiti2008

ça fonctionne, j'ai un peut modifié la plage
Code:
Derligne3_5 = Worksheets("3-5 ans").Range("A40").End(xlUp).Row
en remplaçant 65536 par 40 pour ne prendre que la plage de données qui m'intéresse.
Je vais être pénible, mais est il possible de ne copier que la valeur contenu dans les cellules et non pas la valeur + la mise en forme (ce qui me mets le bazard dans mon tableau d'arrivé)

Merci
 

tototiti2008

XLDnaute Barbatruc
Re : [Excel VBA] tri sur plusieurs criteres

Worksheets("3-5 ans").Range("A65536").End(xlUp).Row

renvoie le numéro de la dernière ligne remplie en colonne A
End(Xlup)
correspond à :
je me mets en A65536
je fais Ctrl + Flèche Haut

C'est plutôt à la 1ère ligne remplie (A7 dans le code) que tu devrais faire attention

Pour éviter la reprise de la mise en forme, il faut passer par des PasteSpecial :

remplacer :

Worksheets("3-5 ans").Range("A7:Q" & Derligne3_5).Copy Worksheets("calcul").[A1]

par :

Worksheets("3-5 ans").Range("A7:Q" & Derligne3_5).Copy
Worksheets("calcul").activate
Worksheets("calcul").Range("A1").PasteSpecial Paste:=xlPasteValues
 

lolonene

XLDnaute Nouveau
Re : [Excel VBA] tri sur plusieurs criteres

Oui pour ce que j'ai changé il me semblait avoir compris c'est pour ça que j'ai remplacé "65536" par "40" car en ligne "41", j'ai les sommes de lignes au dessus que je ne veut pas recopier.

j'ai essayé :
Code:
Worksheets("3-5 ans").Range("A7:Q" & Derligne3_5).Copy
Worksheets("calcul").activate
Worksheets("calcul").Range("A1").PasteSpecial Paste:=xlPasteValues

mais il continue à me coller le trait gras que j'ai en bas de ligne 40 et donc la mise en forme il me semble .

Problème de version (Excel 2000 ?)
EDIT : milles excuses en fait je n'avais pas appliqué le modif de copie sur 6-12ans et calcul vers recap donc je me retrouvait avec la mise en forme de 6-12 ans
 
Dernière édition:

Discussions similaires

Réponses
31
Affichages
1 K

Statistiques des forums

Discussions
312 622
Messages
2 090 273
Membres
104 479
dernier inscrit
Guengant