Сортировка нескольких строк в Excel для перемещения пустых столбцов вправо - PullRequest
0 голосов
/ 01 марта 2019

У меня есть электронная таблица с примерно 3000 строк и 2500 столбцов.Большинство столбцов заполнены нулями (но они должны быть там, по другим причинам).Я хотел бы отсортировать лист так, чтобы все пустые столбцы находились справа.Лист выглядит следующим образом:

ID       val1       val2       val3 ..... val2499       val2500   
1         1         2           0            0             1   
2         2         6           0            0             5   
3         0         5           0            0             0  
4         0         3           0            0             0   
5         1         1           0            0             2

Я хочу, чтобы все столбцы, которые имеют по крайней мере одну ненулевую запись, собирались слева (в любом порядке) и все столбцы, которые полностьюнули должны быть справа, поэтому приведенный выше пример будет выглядеть так:

ID       val1       val2     val2500 ..... val3         val2499   
1         1         2           1            0             0   
2         2         6           5            0             0   
3         0         5           0            0             0  
4         0         3           0            0             0   
5         1         1           2            0             0

Не имеет значения, если val3 и val2499 были наоборот.Я попробовал следующее, и это не сработало:

for row=1 to 2500
    Range("A1:CAA2500").Sort Key1:=Range("B" & b), Order1:=xlDescending, Orientation:=xlLeftToRight
next row

Я знаю, что приведенный выше код глуп, и повторение каждой строки, вероятно, не будет работать, но я не могу думать, как сделать это за один раз, или еслиэто можно сделать вообще.

Заранее благодарен за помощь.

1 Ответ

0 голосов
/ 02 марта 2019

Возможно, есть лучший способ сделать это, но это то, что у меня есть на данный момент.

  • Код предполагает, что данные (для сортировки) находятся на листе "Sheet1", но меняются по мере необходимости.
  • Использует временную строку (непосредственно под вашими данными) и определяет количество ненулевых элементов в каждом столбце.
  • Каждый столбец сортируется по ненулевому количеству (вычисленному в предыдущемшаг)
  • После сортировки временная строка очищается, и процесс сортировки считается завершенным.

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

Может быть полезно переключать Application.ScreenUpdating и Application.Calculation до и после кода.Кроме того, если у вас есть данные непосредственно ниже диапазона, который вы хотите отсортировать, возможно, вы можете вместо этого Range.Insert новую строку использовать как temporaryRow.

Option Explicit

Private Sub CustomSort()

    With ThisWorkbook.Worksheets("Sheet1")

        Dim rangeToSort As Range
        Set rangeToSort = .Range("A1:F6")

        Dim temporaryRow As Range
        Set temporaryRow = rangeToSort.Offset(rangeToSort.Rows.Count, 0).Resize(1)
        temporaryRow.Formula = "=COUNTIFS(" & rangeToSort.Columns(1).Address(True, False, xlA1) & ",""<>0"")"

        Application.Union(rangeToSort, temporaryRow).Sort Key1:=temporaryRow, Order1:=xlDescending, Orientation:=xlLeftToRight

        temporaryRow.Clear

    End With

End Sub

Как я уже сказал, возможно, есть лучшийпуть.Но я не смог найти ничего в документации для Range.Sort или через Macro Recorder.Так что это всего лишь обходной путь.

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