我在相邻的列中有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)的第三个范围。我该如何循环?
答案 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