【问题标题】:VBA Columns Automatically Merge?VBA 列自动合并?
【发布时间】:2010-12-23 18:30:44
【问题描述】:

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

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

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

子 test_function()

将 My_Range 调暗为范围

将 My_Cell 调暗为变体

将 i 调暗为整数

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

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

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

-丹尼尔

【问题讨论】:

    标签: excel vba range row


    【解决方案1】:

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

    例如:-

    (未经测试的代码)

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-19
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      相关资源
      最近更新 更多