我在VBA编写一个程序,首先从一系列单元格中编译一个Range,然后循环遍历该范围以收集单元格中的数据。
问题是我需要范围来维持我添加单元格的顺序,以便我可以在返回时以正确的顺序收集数据。如果数据位于相邻的列中,则范围将其转换为行堆栈。
要明白我的意思,如果你运行这个程序:
Sub test_function()
Dim My_Range As Range
Dim My_Cell As Variant
Dim i As Integer
i = 0
设置My_Range = Union(ActiveSheet.Range(“A1:A5”),ActiveSheet.Range(“B1:B5”))
My_Range中的每个My_Cell
i = i + 1
My_Cell.Value = i
下一个My_Cell
End Sub
您可以看到范围是由两个相邻的数据列(A1:A5和B1:B5)编译而成,而不是此EXPECTED输出:
1 6
2 7
3 8
4 9
5 10
你得到了
1 2
3 4
5 6
7 8
9 10
即使您一次添加一个单元格,它也会重现此行为 设置My_Range = ActiveSheet.Range(“A1”) 设置My_Range = Union(My_Range,ActiveSheet.Range(“A2”)) 设置My_Range = Union(My_Range,ActiveSheet.Range(“A3”)) 等...
有没有办法保留我将单元格添加到范围的顺序?或者是具有单独相邻范围的唯一方法?至少(如果我不能保持确切的顺序)有没有办法让它做第一列和那些行?
-Daniel
答案 0 :(得分:2)
我建议建立一系列范围。然后,您可以遍历集合,这将保留添加范围的顺序。如果需要引用联合范围,可以随后将它们联合起来。
E.g: -
(未经测试的代码)
Dim ranges As New Collection
ranges.Add(ranges.Count, ActiveSheet.Range("A1"))
ranges.Add(ranges.Count, ActiveSheet.Range("C6"))
// etc.
// then you can loop through the ranges in the order in which they were added
Dim rg As Range
For Each rg in ranges
// do something with the range
Next rg
// you can also get a reference to the union if you want
Dim unionRange as Range
Set unionRange = ranges(0)
Dim rg2 As Range
For Each rg2 in ranges
Set unionRange = Application.Union(unionRange, rg2)
Next rg2
// do something with the union