VBA列自动合并?

时间:2009-12-06 16:31:11

标签: excel vba range row

我在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

1 个答案:

答案 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