2009-10-23 7 views
0

J'ai quelques centaines de lignes de données dans quatre colonnes (varA, varB, varC, varD). Je veux écrire une macro telle qu'un utilisateur puisse définir l'ordre de tri de ces colonnes, c'est-à-dire d'abord trier par varD, puis par varA, varC, varB ... et ainsi de suite. En tout il y en a 4! ou 24 possibilités de permutation différentes. JE NE VEUX PAS QUE LES UTILISATEURS SE RENDENT DIRECTEMENT SUR LES DONNÉES, mais plutôt qu'ils aient un moyen de définir l'ordre dans lequel ils veulent trier les colonnes. Une façon dont je pensais était de leur donner une table avec ces noms de colonne et ils peuvent simplement fournir le rang (1 à 4). En fonction de ces rangs, la macro déterminera dynamiquement l'ordre de tri.Tri de colonnes multiples défini par l'utilisateur dans Excel

Toute aide est grandement appréciée.

Merci, chintoo

Répondre

0

Vous pouvez utiliser cette fonction pour déterminer l'ordre de tri correct:

Function getColumnByRank(rankSearch As Byte) As Range 

    Dim c As Byte 

    For c = 1 To 4 
     With ActiveWorkbook.Worksheets("Sheet1") 
      If .Cells(1, c).Value = rankSearch Then Set getColumnByRank = Cells(3, c) 
     End With 
    Next 

End Function 

La façon dont j'ai les dossiers mis en place, est que les valeurs de rang sont sur la rangée 1, il y a une rangée vide entre les rangs et les en-têtes (excelle vis les références d'en-tête si je ne fais pas cela) et ont alors les données tabulaires ci-dessous.

A  B  C  D     
1 1  4  2  3 
2 
3 varA varB varC varD 
4 data1 data2 data3 data4 
5 data5 data6 data7 data8 

vous pouvez donc maintenant utiliser la fonction getColumnByRank dans la méthode utilisée par Alex .Sort pour déterminer la référence de colonne.

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=getColumnByRank(1), _ 
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=getColumnByRank(2), _ 
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=getColumnByRank(3), _ 
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=getColumnByRank(4), _ 
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 

Si vous souhaitez déplacer votre classement à une autre feuille ou autre, il suffit de changer la fonction pour y répondre. HTH

+0

Parfait. Merci JakeTheSnake. Aussi, merci à imfrancisd et Alex dont la logique m'a donné quelques idées à essayer. Je vais travailler dans ma feuille de calcul et voir si je peux l'obtenir au travail ou coincé avec autre chose. – chintoo

0

Je ne suis pas familier avec les nouvelles versions d'Excel, donc je ne sais pas s'ils ont quelque chose à vous faciliter la tâche.

Voici ce que je ferais

  1. Réorganiser les colonnes de rang
  2. Trier par des colonnes A, B, C, D
  3. Disposez les colonnes de retour à l'ordre d'origine

Voici comment je mettrais la feuille

La ligne d'en-tête est dans la ligne 2. Les données commencent dans la rangée 3 et vers le bas.

A  B  C  D     
1 
2 varA varB varC varD 
3 data1 data2 data3 data4 
4 data5 data6 data7 data8 

utilisateur entre dans la colonne se classe dans la rangée 1

A  B  C  D     
1 2  4  3  1 
2 varA varB varC varD 
3 data1 data2 data3 data4 
4 data5 data6 data7 data8 

Ajouter numéro de colonne en face des noms d'en-tête de colonne

A  B  C  D     
1 2  4  3  1 
2 1varA 2varB 3varC 4varD 
3 data1 data2 data3 data4 
4 data5 data6 data7 data8 

Trier par ROW 1 (trier de gauche à droite, organiser les colonnes par r ank)

A  B  C  D 
1 4  3  2  1 
2 2varB 3varC 1varA 4varD 
3 data2 data3 data1 data4 
4 data6 data7 data5 data8 

Trier par la colonne A, B, C, D ou D, C, B, A (en fonction de ce que vous voulez)

A  B  C  D 
1 4  3  2  1 
2 2varB 3varC 1varA 4varD 
3 data2 data3 data1 data4 
4 data6 data7 data5 data8 

Trier par ROW 2 (Réorganiser les colonnes dans l'ordre original)

A  B  C  D     
1 2  4  3  1 
2 1varA 2varB 3varC 4varD 
3 data1 data2 data3 data4 
4 data5 data6 data7 data8 

Supprimer le numéro de colonne en face des noms d'en-tête de colonne

A  B  C  D     
1 2  4  3  1 
2 varA varB varC varD 
3 data1 data2 data3 data4 
4 data5 data6 data7 data8 
+0

Mécaniquement, cela fonctionne. Mais mes données sont basées sur des formules (principalement vlookup) et d'autres calculs qui ne font pas partie de ce type, donc le tri de gauche à droite ou par lignes le désactive et je ne peux pas utiliser de cette façon. J'espérais plus en utilisant VB, je serais en mesure d'assigner dynamiquement l'ordre de tri sans avoir à retourner les colonnes. Merci. – chintoo