- ベストアンサー
VBAのFor Eachのセル読み込み順番について。
こんにちは。 VBAのFor Eachのexcelセル読み込み順番について お伺いします。 for each MjObj in range("A1:D10") ********** next とした場合にセルはA1を先頭に左から右列へ、 上から下行へと順次読み込まれますが、 この順番を変更することは出来るのでしょうか。 また、運用で誤って変更される可能は あるでしょうか。 以上、2点お伺い致します。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 私は、For Each ~ In を別の使い方を考えるのは、もう少し、勉強なさったほうがよいと思います。通常は、Cells(x,y) のx,y 値をそのまま行数・列数だけインクリメントするだけです。 Sub OrthodoxPrc() Dim rng As Range Dim x As Long '列 Dim y As Long '行 Dim a As Variant Set rng = Range("A1:D10") For y = 1 To rng.Columns.Count For x = 1 To rng.Rows.Count a = Cells(x, y).Value 'a = rng.Cells(x, y).Value ''こちらの方がベター Next Next End Sub ただし、かなりイレギュラーな使い方ですが、配列を使った以下のような方法があります。いくつかのテクニックは、全体の理解が上がってから使ったほうがよいと思います。 Sub TestArray() Dim rngValue As Variant '配列の確保 Dim v As Variant rngValue = Range("A1:D10").Value For Each v In rngValue '処理 Next End Sub >運用で誤って変更される可能はあるでしょうか。 ここでいう運用の意味がはっきりとは分りませんが、他の設定で影響されるかという意味だするなら、それは、ありません。そのようなオプションは存在しません。
その他の回答 (3)
- taocat
- ベストアンサー率61% (191/310)
こんばんは。 無理やり順番を変えるとしたらFor Eachをあとひとつ入れ子にして。 -------------------------------------------- Sub test() Dim Cnt As Long Dim Rng1 As Range Dim Rng2 As Range For Each Rng1 In Range("A1:D10").Columns For Each Rng2 In Rng1.Cells Cnt = Cnt + 1 Rng2.Value = Cnt Next Rng2 Next Rng1 End Sub ------------------------------------------- 上記は実行してみれば分かると思いますが 読み込む順番は、A1->A10->B1->B10->C1->C10・・・となりセルA1:D10にその順番が入ります。 また質問のような場合でその読み込み順が関係あるときは、For Eachはちょと使いにくいので、も少しVBAに慣れてから使った方がいいかもしれません。 以上です。
お礼
ご回答有難う御座います。 Range("A1:D10").Columnsは 面白いですね。
- imogasi
- ベストアンサー率27% (4737/17069)
For Each で処理されるのはセルのIndex値の順番と思います。 A1->B1->C1->・・・IV1 A2->b2->・・・ Sub test01() For i = 1 To 300 Cells(i) = i Next i End Sub これはエクセルの深いところの決め事だと思いますので、できないと思います。 やるならプログラムFor Eachにしないで Cells(i,J)を使えばどのようにでもできます。 Sub test02() x = Array(1, 3, 5) y = Array(3, 2, 4) For i = 0 To UBound(x) Cells(x(i), y(i)) = i Next i End Sub c1に0、B3に1、D5に2をこの順序でセットできます。Array の中を変えれば自由自在です。
お礼
ご回答有難う御座います。 Arrayの使い方は大変勉強になりました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
変更することはできないと思いますが、 for eachを使う場合、そういう順番に依存するような使い方をすべきではありません。 順番が重要になる場合は cells(x,y)みたいな感じで、x,yをforなどで(明示的に)制御してすべきだと思います。
お礼
ご回答有難う御座います。 参考にさせて頂きます。
お礼
有難う御座います。 配列Range("A1:D10").Valueは 意外な使い方があるものですね。