用循环vba排序倍数范围

时间:2019-04-03 09:17:45

标签: vba

我在相邻的列中有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 个答案:

答案 0 :(得分:1)

使用“偏移”在各列和工作表的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

答案 1 :(得分:1)

以下子项对从存储在变量FCol中的第 4 列(“ D”)开始的每一列进行排序,直到在指定工作表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