сортировать кратные диапазоны с помощью цикла VBA - PullRequest
1 голос
/ 03 апреля 2019

У меня есть 65 диапазонов в столбцах рядом друг с другом. Первый диапазон - «D39: D122», следующий диапазон - «E39: E122» ... последний диапазон - «BP39: BP122».

Возможно, что все 65 диапазонов заполнены данными, но также возможно, что только 10 диапазонов заполнены данными. Мне уже удалось, что если есть 10 диапазонов, заполненных данными, то это первые 10 диапазонов, которые заполнены.

Данные: это список максимум из 84 различных ячеек (от D39 до D122), иногда только 15 ячеек заполнены данными, иногда 24, иногда ничего.

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

Пример

        D           E           F       etc... BP
39    ID0077      ID0325     ID0037
40    ID0134      ID0704     ID0206
41    ID0001      ID0011     ID0042
42    ID3481      ID2005     ID0215
43    ID0280      etc..      ID0005
      etc...                 ID0015
                             ID0328
                             ID0712
                             ID0332
                             ID0713
                             etc...

Второй вопрос: есть второй и третий диапазоны, подобные этому: второй диапазон от (D126: D209) до (BP126: BP209), третий диапазон от (D299: D303) до (BP299: 303). Как я могу пройти через это?

enter image description here

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Следующие подгруппы сортируют каждый столбец, начиная с 4-го столбца ("D"), сохраняемого в переменной FCol до последнего столбца, найденного в указанном рабочем листе, LCol.

Определяет последнюю заполненную строку в столбце, а затем сортирует ячейки, начиная с первой строки (39) до последней строки.

Если первая строка динамическая, или если вам необходимо изменить ее в будущем, вам просто нужно изменить переменную FRow.

Sub sortcols()

Dim FRow as Long, FCol as Long, LRow as Long, LCol as Long, i As Long

With Workbooks(REF).Sheets(REF)

    FRow = 39
    FCol = 4 'column "D"
    LCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

    For i = FCol to LCol

        'Determine the last filled row in the column (starting from the top)
        LRow = .Cells(.Rows.Count, i).End(xlDown).Row

        'Sort the cells on the condition that there is data present  
        With .Range(.Cells(FRow, i), .Cells(LRow, i))
            If Not LRow = 1 Then .Sort key1:=.Cells(1), order1:=xlAscending, Header:=xlYes
        End With  

    Next i

End With

End Sub
1 голос
/ 03 апреля 2019

Используйте Offset для циклического перемещения по столбцам и функцию COUNTA на рабочем листе, чтобы убедиться, что есть что сортировать. Пустая ячейка будет просто сдвинута вниз.

Option Explicit

Sub sort65()
    Dim i As Long

    'define the worksheet
    With Worksheets("sheet1")

        'loop through 65 columns
        For i = 0 To 64

            'offset original by the loop increment
            With .Range("D39:D122").Offset(0, i)

                'make sure there is something to sort
                If Application.CountA(.Cells) > 0 Then

                    'sort ascending with no header
                    .Sort key1:=.Cells(1), order1:=xlAscending, Header:=xlNo

                End If

            End With

        Next i

    End With

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