J'ai un document excel qui possède datatables de colonne suivantes:
Country,AnimalName,Year,ResultsQuality(1-6),ResultA,ResultB,ResultC.....ResultZ
ResultQuality est un indicateur de la précision du résultat dans la ligne (ResultA-ResultZ), la qualité la plus élevée est ResultsQuality = 1, le niveau de qualité inférieur est ResultsQuality = 6.
Voici quelques exemples de lignes:
row#1: US,Camel,1985,2,111,222,333.....999 row#2: US,Camel,1985,5,114,227,338.....958 row#3: CANADA,Camel,1985,3,214,257,638.....858 row#4: CANADA,Shark,1985,1,14,27,38.....8 row#5: CANADA,Shark,1985,2,14,257,3.....628 row#6: CANADA,Shark,1985,4,14,25,63.....568 row#7: CANADA,Shark,1985,6,14,25,6.....838
Comme vous le voyez, la key [Country, AnimalName, Year] peut contenir une ou plusieurs lignes qui ont une qualité de résultat différente.
La macro devrait: parcourir toutes les lignes, et pour chaque [Country, AnimalName, année] – garder la ligne de résultats de la plus haute qualité. Les autres lignes de less qualité pour cela [Country, AnimalName, Year] devraient être supprimées.
Après avoir exécuté la macro sur les 3 lignes ci-dessus – les résultats devraient être:
row#1: US,Camel,1985,2,111,222,333.....999 row#2: CANADA,Camel,1985,3,214,257,638.....858 row#3: CANADA,Shark,1985,1,14,27,38.....8
Merci beaucoup!
Cela peut être accompli sans déclarer une seule variable. L'enlèvement des duplicates fonctionne de bas en haut, donc, si datatables sont correctement sortingées et les colonnes appropriées fournies pour déterminer la duplication, l'opération devrait être morte facilement.
Sub Highest_Priority_Weight() With ActiveSheet.Cells(1, 1).CurrentRegion 'this method can only use three key columns on a sort so we do it twice .Cells.Sort Key1:=.Columns(4), Order1:=xlAscending, _ Orientation:=xlTopToBottom, Header:=xlYes .Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _ Key2:=.Columns(2), Order2:=xlAscending, _ Key3:=.Columns(3), Order3:=xlAscending, _ Orientation:=xlTopToBottom, Header:=xlYes 'now that the best are at the top, dedupe to clear all others .RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes End With End Sub
Cela devrait faire cela,
… dans quelque chose comme ça,
Pour Excel, c'est la façon la plus rapide dont je connais. Une routine de sorting ultérieure pourrait être ajoutée après l'opération .RemoveDuplicates
si vous préférez un autre format affiché.