こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAのFor Eachのセル読み込み順番について。

こんにちは。
VBAのFor Eachのexcelセル読み込み順番について
お伺いします。

for each MjObj in range("A1:D10")
**********
next

とした場合にセルはA1を先頭に左から右列へ、
上から下行へと順次読み込まれますが、
この順番を変更することは出来るのでしょうか。

また、運用で誤って変更される可能は
あるでしょうか。

以上、2点お伺い致します。
宜しくお願い致します。

投稿日時 - 2005-11-21 19:34:45

QNo.1793113

暇なときに回答ください

質問者が選んだベストアンサー

こんにちは。

私は、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


>運用で誤って変更される可能はあるでしょうか。

ここでいう運用の意味がはっきりとは分りませんが、他の設定で影響されるかという意味だするなら、それは、ありません。そのようなオプションは存在しません。

投稿日時 - 2005-11-22 15:34:04

お礼

有難う御座います。
配列Range("A1:D10").Valueは
意外な使い方があるものですね。

投稿日時 - 2005-11-22 17:23:37

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

こんばんは。

無理やり順番を変えるとしたら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に慣れてから使った方がいいかもしれません。
以上です。

投稿日時 - 2005-11-21 23:03:59

お礼

ご回答有難う御座います。
Range("A1:D10").Columnsは
面白いですね。

投稿日時 - 2005-11-22 17:14:20

ANo.2

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 の中を変えれば自由自在です。

投稿日時 - 2005-11-21 22:29:21

お礼

ご回答有難う御座います。
Arrayの使い方は大変勉強になりました。

投稿日時 - 2005-11-22 16:59:06

ANo.1

変更することはできないと思いますが、
for eachを使う場合、そういう順番に依存するような使い方をすべきではありません。
順番が重要になる場合は
cells(x,y)みたいな感じで、x,yをforなどで(明示的に)制御してすべきだと思います。

投稿日時 - 2005-11-21 19:48:54

お礼

ご回答有難う御座います。
参考にさせて頂きます。

投稿日時 - 2005-11-22 16:56:40

あなたにオススメの質問