Как вы сортируете, используя динамическое количество сортировочных ключей? - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно отсортировать данные в VBA, используя несколько столбцов в качестве ключей, но количество столбцов заранее неизвестно.

Я пытался использовать метод sheets.sort и использовать .sortfields.add в цикле for, но это не имело никакого эффекта.

Вот код, используемый для сортировки данных:

For sh = 1 To 2
        Sheets(sh).Sort.SortFields.Clear
        For i = 1 To idSize
            Sheets(sh).Sort.SortFields.Add Key:=Sheets(sh).UsedRange.Columns(idList(sh)(i)) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        Next i
        With Sheets(sh).Sort
         .Header = xlYes
         .MatchCase = False
         .Orientation = xlTopToBottom
         .Apply
        End With
    Next sh

где sh перебирает листы в рабочей книге, а числовой индекс каждого столбца, который будет использоваться в качестве ключа, находится в idList. Например, idList(2)(1) представляет индекс столбца из листа 2, который должен быть основным ключом сортировки.

Этот код не приводит к сортировке вообще.

1 Ответ

0 голосов
/ 31 мая 2019

Попробуйте что-нибудь подобное.Это просто пример того, как циклически проходить по вашим листам и столбцам, возможно, вы захотите изменить внутреннюю логику порядка сортировки.

Dim intCols As Integer
Dim rng As Range
Dim sht As Worksheet

For Each sht In Sheets
    With sht

        Set rng = .Range("A1").CurrentRegion

        intCols = rng.Columns.Count

        .Sort.SortFields.Clear
        For i = 1 To intCols
            .Sort.SortFields.Add Key:=Columns(i), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        Next

        With .Sort
            .SetRange rng
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With

Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...