gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:45:42 24 4
gpt4 key购买 nike

我需要遍历从电子表格底部到电子表格顶部的范围。范围可以是不连续的,但我已经删除了重叠(我只关心行顺序,因此我还将列减少为“A”)并将范围放置在“Overall_Range”中。由于这些区域可以按任何顺序进入该范围,因此我构建了一个函数 Get_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 不会以相反的顺序处理(事实上,据我所知,我根本无法保证顺序)。

有谁知道是否有一种方法可以循环遍历保证以特定行顺序出现的范围?当我选择(此处使用的“选择”一词不应与 Excel VBA 术语“选择”混淆,上面的代码使用“Overall_Range”)从下到上的范围 (A10:A2) 时,循环位于该范围内顺序,当我选择从上到下的范围(A2:A10)时,它就是按这个顺序。我不知道如果我做 Union(A10:A2, A1:A2) 之类的事情会发生什么。我想我将不得不编写另一个函数来返回一个数组以及处理事物的顺序,但如果其他人有另一个解决方案,我会很高兴。你能帮忙吗?

更新:

我做了一些更多的测试,这是代码:

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 集合访问时,它们都是按行顺序排列的。

这似乎表明,如果我通过 Rows 集合访问它,无论我对范围做了什么疯狂的事情,行都会按顺序返回。我认为这意味着仅在范围内向后退一步的方法(如评论中所建议的)将会起作用。

最佳答案

这段代码应该可以解决问题。

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

编辑

它采用您提供的 Overall_Range,然后是 UpDown 的方向,然后将值分配给要在 中使用的变量>For 语句。

未使用任何选择。

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"并运行代码时会发生什么。数字升序表示从上到下循环。

top to bottom

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

bottom to top

关于vba - Excel VBA Range.Rows 迭代器处理行的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26634026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com