Excel VBA Range.Rows处理行的迭代器顺序

我需要遍历从电子表格底部到电子表格顶部的范围。 范围可以是不连续的,但我已经删除重叠(我只关心行顺序,所以我也已经减less了列“A”),并将范围放在“Overall_Range”。 由于这些区域可以以任何顺序进入范围,所以我构build了一个函数Ge​​t_Loop_Order,它返回一个数组,其顺序是从下到上处理区域。 我的计划是迭代每个区域(从下到上),如下所示:

Loop_Order = Get_Loop_Order(Overall_Range) For A = LBound(Loop_Order) To UBound(Loop_Order) For Each this_row In Overall_Range.Areas(Loop_Order(A)).Rows ... do stuff ... Next this_row Next A 

我意识到Range.Rows上的For Each将不会以相反的顺序处理(事实上,就我所知,我无法保证顺序)。

有谁知道是否有一种方法来循环通过保证以特定的行顺序发生的范围? 当我select(在这里使用单词“select”不应该与Excel VBA术语“select”混淆,上面的代码使用“Overall_Range”)从下到上的范围(A10:A2)顺序,当我从上到下select一个范围(A2:A10)时,按顺序排列。 我不知道如果我做联合(A10:A2,A1:A2)会发生什么情况。 我在想,我将不得不编写另一个函数来返回一个数组来处理事情,但是如果别人有另一个解决scheme,我会喜欢它。 你能帮我吗?

更新:

我做了更多的testing这里是代码:

 Dim my_range As Range 'Range being tested Dim N As Long 'Loop variable when numbers are needed Dim M As Range 'Loop variable when ranges are needed Set my_range = ActiveSheet.Range("A2:A10") ActiveSheet.Range("B1").Value = "A2:A10" ActiveSheet.Range("B1").Font.Bold = True ActiveSheet.Range("B1").HorizontalAlignment = xlCenter ActiveSheet.Range("B1:C1").Merge ActiveSheet.Range("B2").Value = "Row Index" ActiveSheet.Range("B2").Font.Bold = True ActiveSheet.Range("B2").HorizontalAlignment = xlCenter ActiveSheet.Range("C2").Value = "Row Iterator" ActiveSheet.Range("C2").Font.Bold = True ActiveSheet.Range("C2").HorizontalAlignment = xlCenter For N = 1 To my_range.Rows.Count ActiveSheet.Range("B" & N + 2).Value = my_range.Rows(N).Row Next N N = 1 For Each M In my_range.Rows ActiveSheet.Range("C" & N + 2).Value = M.Row N = N + 1 Next M Set my_range = ActiveSheet.Range("A10:A2") ActiveSheet.Range("D1").Value = "A10:A2" ActiveSheet.Range("D1").Font.Bold = True ActiveSheet.Range("D1").HorizontalAlignment = xlCenter ActiveSheet.Range("D1:E1").Merge ActiveSheet.Range("D2").Value = "Row Index" ActiveSheet.Range("D2").Font.Bold = True ActiveSheet.Range("D2").HorizontalAlignment = xlCenter ActiveSheet.Range("E2").Value = "Row Iterator" ActiveSheet.Range("E2").Font.Bold = True ActiveSheet.Range("E2").HorizontalAlignment = xlCenter For N = 1 To my_range.Rows.Count ActiveSheet.Range("D" & N + 2).Value = my_range.Rows(N).Row Next N N = 1 For Each M In my_range.Rows ActiveSheet.Range("E" & N + 2).Value = M.Row N = N + 1 Next M Set my_range = Union(ActiveSheet.Range("A10:A2"), ActiveSheet.Range("A1:A2")) ActiveSheet.Range("F1").Value = "UNION(A10:A2,A1:A2)" ActiveSheet.Range("F1").Font.Bold = True ActiveSheet.Range("F1").HorizontalAlignment = xlCenter ActiveSheet.Range("F1:G1").Merge ActiveSheet.Range("F2").Value = "Row Index" ActiveSheet.Range("F2").Font.Bold = True ActiveSheet.Range("F2").HorizontalAlignment = xlCenter ActiveSheet.Range("G2").Value = "Row Iterator" ActiveSheet.Range("G2").Font.Bold = True ActiveSheet.Range("G2").HorizontalAlignment = xlCenter For N = 1 To my_range.Rows.Count ActiveSheet.Range("F" & N + 2).Value = my_range.Rows(N).Row Next N N = 1 For Each M In my_range.Rows ActiveSheet.Range("G" & N + 2).Value = M.Row N = N + 1 Next M Set my_range = Union(ActiveSheet.Range("A10:A2"), ActiveSheet.Range("A1:A2"), ActiveSheet.Range("A11:A12")) ActiveSheet.Range("H1").Value = "UNION(A10:A2,A13:A15,A11:A12)" ActiveSheet.Range("H1").Font.Bold = True ActiveSheet.Range("H1").HorizontalAlignment = xlCenter ActiveSheet.Range("H1:I1").Merge ActiveSheet.Range("H2").Value = "Row Index" ActiveSheet.Range("H2").Font.Bold = True ActiveSheet.Range("H2").HorizontalAlignment = xlCenter ActiveSheet.Range("I2").Value = "Row Iterator" ActiveSheet.Range("I2").Font.Bold = True ActiveSheet.Range("I2").HorizontalAlignment = xlCenter For N = 1 To my_range.Rows.Count ActiveSheet.Range("H" & N + 2).Value = my_range.Rows(N).Row Next N N = 1 For Each M In my_range.Rows ActiveSheet.Range("I" & N + 2).Value = M.Row N = N + 1 Next M 

结果是我不能张贴的东西,因为我不能张贴图像…叹息…他们表明,无论范围是多么疯狂,当通过行集合访问,他们按行排列。

这似乎表明,无论我对范围做了什么疯狂的事情,如果通过Rows集合访问它,这些行都会一直返回。 我在想,这意味着只是在整个范围后退(如评论中所build议的)的方法将起作用。

这个代码应该做的伎俩。

有一个澄清:从VBA的angular度来看, Range("A2:A10")Range("A10:A2")完全相同(即返回相同的地址: $A$2:$A$10 )。 为了以某种方式循环,您需要传递另一个参数。

编辑

它需要您提供的Overall_Range ,然后UpDown的方向将值分配给在For语句中使用的variables。

没有select使用。

 Option Explicit Sub LoopOrderTest() Dim Overall_Range As Range Dim sLoopDir As String Dim iTtlRows As Integer Dim iLoopStep As Integer Dim iLoopFrom As Integer Dim iLoopTo As Integer Dim n As Integer Set Overall_Range = Range("A2:A10") sLoopDir = "Up" 'or "Down" iTtlRows = Overall_Range.Rows.Count 'Get total rows 'Assign for loop control items based on sLoopDir value If sLoopDir = "Up" Then iLoopFrom = 1 iLoopTo = iTtlRows iLoopStep = 1 ElseIf sLoopDir = "Down" Then iLoopFrom = iTtlRows iLoopTo = 1 iLoopStep = -1 End If Dim i As Integer 'used only to put items in cells for testing i = 1 For n = iLoopFrom To iLoopTo Step iLoopStep 'do stuff. 'for now just print a number showing the order that the loop works through Overall_Range.Cells(n, 1).Value = i i = i + 1 Next n End Sub 

这显示了当我设置sLoopDir = "Up"并运行代码时会发生什么。 数字升序表明它从上到下循环。

从上到下

这显示了当我设置sLoopDir = "Down"并运行代码时会发生什么情况。 数字递减表示从底部到顶部循环。

从下到上