0

我正在用 VBA 编写一个程序,它首先从一系列单元格中编译一个 Range,然后循环遍历该范围以收集单元格中的数据。

问题是我需要该范围来维持添加单元格的顺序,以便在返回时可以按正确的顺序收集数据。如果数据位于相邻的列中,则范围会将其转换为行堆栈。

看看我的意思,如果你运行这个程序:

子 test_function()

将 My_Range 调暗为范围

将 My_Cell 调暗为变体

将 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

结束子

您可以看到该范围是由两个相邻的数据列(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

即使您一次添加一个单元格,它也会重现此行为 Set My_Range = ActiveSheet.Range("A1") Set My_Range = Union(My_Range, ActiveSheet.Range("A2")) Set My_Range = Union(My_Range, ActiveSheet .Range("A3")) 等...

有什么方法可以保留将单元格添加到范围的顺序吗?或者是拥有单独相邻范围的唯一方法?至少(如果我不能让它保持确切的顺序)有没有办法让它做列 FIRST 和 THEN 行?

-丹尼尔

4

1 回答 1

2

我建议建立一个范围的集合。然后,您可以遍历集合,这将保留添加范围的顺序。如果您需要对联合范围的引用,您可以稍后将它们联合起来。

例如:-

(未经测试的代码)

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
于 2009-12-06T17:08:57.663 回答