0

最初に一連のセルから Range をコンパイルし、後で範囲をループしてセル内のデータを収集するプログラムを VBA で作成しています。

問題は、セルを追加する順序を維持するために範囲が必要であるため、戻ったときに正しい順序でデータを収集できることです。データが隣接する列にある場合、範囲はそれを行のスタックに変換します。

このプログラムを実行すると、次のようになります。

サブ test_function()

Dim My_Range As Range

Dim My_Cell をバリアントとして

Dim i As Integer

私は= 0

Set My_Range = Union(ActiveSheet.Range("A1:A5"), ActiveSheet.Range("B1:B5"))

My_Range 内の My_Cell ごとに

i = i + 1

My_Cell.Value = i

次の My_Cell

サブ終了

範囲がデータの 2 つの隣接する列 (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) を使用して一度に 1 つのセルを追加しても、この動作を再現します。 .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 に答える