VBA水平读取联合范围

我正在尝试将这些值合并到一组单元格中。 我创build了一个范围如下:

Dim rng As Range Set rng = Application.Union(Range("A1:A3"), Range("C1:E2")) For Each Address In rng Debug.Print Address.Address Next 

我想按水平顺序读取单元格:A1,C1,D1,E1,A2,C2 …等。但是,他们正在读取A1,A2,A3,C1,C2等..

我怎样才能水平读取它们? 谢谢

你必须处理用Union方法创build的Range对象中的Range.Areas 。

 Sub laterally() Dim r As Long, c As Long, a As Long Dim mnRW As Long, mxRW As Long, mnCL As Long, mxCL As Long Dim rng As Range With Worksheets("Sheet1") '<~~ ALWAYS set the worksheet! Set rng = Union(.Range("A1:A3"), .Range("C1:E2")) Debug.Print rng.Address(0, 0) mnRW = Rows.Count: mxRW = 0 mnCL = Columns.Count: mxCL = 0 With rng For a = 1 To .Areas.Count With .Areas(a) mnRW = Application.Min(mnRW, .Rows(1).Row) mxRW = Application.Max(mxRW, .Rows(.Rows.Count).Row) mnCL = Application.Min(mnCL, .Columns(1).Column) mxCL = Application.Max(mxCL, .Columns(.Columns.Count).Column) End With Next a For r = mnRW To mxRW For c = mnCL To mxCL If Not Intersect(.Cells, .Parent.Cells(r, c)) Is Nothing Then _ Debug.Print .Parent.Cells(r, c).Address(0, 0) Next c Next r End With End With End Sub 

在收集了联合范围的范围之后,每个可能的单元被循环遍历,并使用Intersect方法来确定它是否属于联合。

范围的联合不关心单元添加的顺序 – 无论是按行还是按列。 所以你的原始循环统一范围是好的。

如果您关心读取数据的顺序,只需按行或逐列阅读,然后使用内部循环和外部循环。 因此,例如,在构build范围之后,请执行以下操作:

 Dim Col as Variant, Rw as Variant For Each Col in rng.Columns For each Rw in Col.Rows Debug.Print Rw.Address Next Rw Next Col 

只是认为这可能是克里斯的解决scheme有趣的补充? (我稍微改变了范围,突出了一些优点)

 Dim Rng As Range, Col As Variant, Rw As Variant Set Rng = Application.Union(Range("A3:A5"), Range("C2:E4")) For Each Rw In ActiveSheet.UsedRange.Rows For Each Col In Rw.Columns If Not Intersect(Col, Rng) Is Nothing Then Debug.Print Intersect(Col, Rng).Address Next Col Next Rw