Определяемая пользователем сортировка по нескольким столбцам в Excel - PullRequest
0 голосов
/ 24 октября 2009

У меня есть несколько сотен строк данных в четырех столбцах (varA, varB, varC, varD). Я хочу написать макрос так, чтобы пользователь мог определить порядок сортировки этих столбцов, то есть сначала сортировать по varD, затем по varA, varC, varB ... и так далее, и так далее. Всего 4! или 24 различных возможностей перестановки. Я НЕ ХОЧУ, ЧТОБЫ ПОЛЬЗОВАТЕЛИ ПОЛУЧИЛИ ПРЯМОЙ ПУСК СОРТИРОВКИ НА ДАННЫХ, но скорее имею способ определить порядок сортировки столбцов. Одним из способов, которым я думал, было дать им таблицу с этими именами столбцов, и они могли просто предоставить ранг (от 1 до 4). На основе этих рангов макрос будет динамически определять порядок сортировки.

Любая помощь очень ценится.

Спасибо, chintoo

Ответы [ 2 ]

0 голосов
/ 24 октября 2009

Вы можете использовать эту функцию для определения правильного порядка сортировки:

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

То, как я настраиваю записи, состоит в том, что значения рангов находятся в строке 1, между рангами и заголовками есть пустая строка (Excel, если я этого не делаю, испортит ссылки на заголовки), а затем иметь табличные данные ниже.

   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

Так что теперь вы можете использовать функцию getColumnByRank в методе .Sort, используемом Алексом для определения ссылки на столбец.

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

Если вы хотите переместить свой рейтинг на другой лист или что-то еще, просто измените функцию, чтобы приспособить это. НТН

0 голосов
/ 24 октября 2009

Я не знаком с новыми версиями Excel, поэтому я не знаю, есть ли у них что-то, чтобы сделать это проще.

Вот что я бы сделал

  1. Расставьте столбцы по рангу
  2. Сортировка по столбцам A, B, C, D
  3. Упорядочить столбцы обратно в исходный порядок

Вот как я бы выложил лист

Строка заголовка находится в строке 2. Данные начинаются со строки 3 и далее.

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

Пользователь входит в ряды столбцов в строке 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

Добавить номер столбца перед именами заголовков столбцов

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

Сортировка по ROW 1 (сортировка слева направо, упорядочение столбцов по рангу)

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

Сортировка по КОЛОННА A, B, C, D или D, C, B, A (в зависимости от того, что вы хотите)

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

Сортировка по ROW 2 (упорядочить столбцы в исходном порядке)

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

Удалить номер столбца перед именами заголовков столбцов

   A      B      C      D                
1  2      4      3      1
2  varA   varB   varC   varD
3  data1  data2  data3  data4
4  data5  data6  data7  data8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...