• ベストアンサー

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

こんにちは。 VBAのFor Eachのexcelセル読み込み順番について お伺いします。 for each MjObj in range("A1:D10") ********** next とした場合にセルはA1を先頭に左から右列へ、 上から下行へと順次読み込まれますが、 この順番を変更することは出来るのでしょうか。 また、運用で誤って変更される可能は あるでしょうか。 以上、2点お伺い致します。 宜しくお願い致します。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 >運用で誤って変更される可能はあるでしょうか。 ここでいう運用の意味がはっきりとは分りませんが、他の設定で影響されるかという意味だするなら、それは、ありません。そのようなオプションは存在しません。

i_september
質問者

お礼

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

その他の回答 (3)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.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に慣れてから使った方がいいかもしれません。 以上です。

i_september
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.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 の中を変えれば自由自在です。

i_september
質問者

お礼

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

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

i_september
質問者

お礼

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

関連するQ&A

  • VBA For Eachでセル内の文字列を一個ずつ取り出すには

    エクセル2000です。 たとえばA1セル内の文字列を一個ずつ取り出す場合、 Sub test01() For i = 1 To Len(Range("A1").Value) Cells(i, "B").Value = Range("A1").Characters(i, 1).Text Next End Sub このように最初から最後の文字まで何番目で指定することはわかるのですが、これをFor Each で回すにはどうしたらよいでしょうか? (⌒o⌒)? お教えください。 Sub test02() For Each ch In Range("A1").Characters i = i + 1 Cells(i, "B").Value = ch Next End Sub ではエラーになります。

  • セルに対してFor Each~In~Nextを使う

    セルに対してFor Each~In~Nextを使う事は出来ない? シートやブックに対してループする時は Sub aaa() Dim w As Worksheet For Each w In Worksheets MsgBox w.Name Next End Sub 等を使いますが、 A1に「あ」 A2に「い」 A3に「う」 が入っている場合、 Sub bbb() Dim i As Long For i = 1 To Range("a65536").End(xlUp).Row MsgBox Cells(i, 1) Next End Sub で、全ての値を取得できますが、 For~to~nextではなく セルに対してFor Each~In~Nextを使う方法があれば教えてください。 上記のように Dim w As Worksheetは宣言できますが Dim c As Workcellとはできませんでした。 なぜわざわざFor~to~nextでできる事をFor Each~In~Nextでやりたいかと言うと、 シートやブックはFor~to~nextでできるのに、セルはFor~to~nextができない理由を知りたいからです。 ご回答よろしくお願いします。

  • Excel VBA のFor Each ・・・ Next について

    配列に数字(特段数字でなくても)入れたいのですが、以下のように書きました。 Sub test() Dim x As Variant Dim m(1 To 10) As Integer For Each x In m x.Value = 100 Next Stop End Sub Stopでとめてmを確認するとすべて0です。どうしてなのでしょうか。 配列ではなく Sub test() Dim x As Variant For Each x In range("a1:a10") x.Value = 100 Next End Sub とするとA1:A10には100が入ります。 この差がいまいちわからなくて、 もちろんFor ・・・ Nextで簡単に入れられるのは承知しています。 補足ですが また最初はx.valueの.valueをつけていなかったのでセルにも反映されませんでしたが.valueをつけると入りました。

  • VBA For Eachの使い方

    For Each x In Range("A1:G1") このようなコードにおいて、A1からG1の全てに対して処理を行うのではなく、A1とC1とE1とG1に対して処理を行い、B1とD1とF1は飛ばして処理をしないようにするにはどうすれば良いですか?

  • [VBA] For文の使い分けについての疑問

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) ・疑問点 For each nextもFor nextも、最下行まで処理をしたいときに使用することが多いのですが、 単列の場合はFor each next、複数列の場合はFor nextというような使い方をしています。 例:For each next Sub test()  Dim ws As Worksheet  Dim r As Range  Dim endRow As Long  Set ws = ThisWorkbook.Sheets(1)  endRow = ws.Cells(Rows.Count, 1).End(xlUp).Row  For Each r In ws.Range("A1:A" & endRow)   If r.Value Mod 2 = 0 Then r.Font.Bold = True  Next r End Sub 例:For next Sub test2()  Dim ws As Worksheet  Dim i As Long  Dim endRow As Long  Set ws = ThisWorkbook.Sheets(1)  endRow = ws.Cells(Rows.Count, 1).End(xlUp).Row  For i = 1 To endRow   If ws.Cells(i, 1).Value Mod 2 = 0 Then ws.Cells(i, 1).Font.Bold = True   If ws.Cells(i, 2).Value Mod 3 = 0 Then ws.Cells(i, 2).Font.Bold = True  Next i End Sub 単純に、複数列での処理をする場合にはFor each next文を2つ書かないといけないと思い(込み)、 上記のような運用にしていますが、そもそもこの考え方は合っていますでしょうか? 単列の処理であってももちろんFor next文で問題なく使用できますし、 複数列の処理の場合もFor each next文で処理することはできます(冗長ですが)が、 VBA的に正しいというか、合理的な考えであるのかどうかが疑問です。 みなさんはFor each nextとFor nextをどのように使い分けていますか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • EXCEL VBAでセルの値が数値のときに2を掛ける方法について

    すいませんEXCEL VBAで教えていただきたいことがあります。 A1:H3000に数値及び文字列が入っている。 この範囲で値が数値のときは当該セルの値に*2の処理を行う (文字列の場合はそのまま) Dim i as Variant For Each i in Range("A1:H3000") IF ~ Next i というような流れでしょうか。 IFの後がテキスト本を見てもよくわかりませんでした。 よろしくお願いします。

  • For Eachを使った並び替えについて

    XPのVBAで、シフトを組もうとしています。 登録者の中から5名を1組とし、班長を固定して4通り。 それを毎月、4組作成したいのです。 繰返しが多いので、簡単な方法がありそうなのですができません。 どうぞよろしくお願いいたします。 Sub 名簿() Dim a As Range ‘名簿シートの1行目に=RAND()関数を入れる。2行目に名簿を作成する。 ‘組合せシートの$AI$1, $AI$3, $AC$1, $AC$3の4つのセルに”組1”という名前を定義 ‘名簿シートのB2セルの人を班長として固定。組合せシートの”組1”(4箇所)に貼り付ける Sheets("名簿").Select Range("B2").Select Selection.Copy Sheets("組合せ").Select For Each a In Range("組1") a.Select ActiveSheet.Paste Next a ‘名簿シートのC2セルから2行の最後までのデータをランダムに並べ替え、C2からF2をコピー、貼付け For Each a In Range("組1") a.Select Selection.Offset(0, -4).Select Sheets("名簿").Select Range("C1:I2").Select Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("C2:F2").Copy Sheets("組合せ").Select ActiveSheet.Paste Next a ‘名簿シートの全てのデータをランダムに並び替え。 Sheets("名簿").Select Range("B1:I2").Select Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal End Sub 以上の作業を”組2”、”組3”、”組4”においても繰り返したいのです。 できれば、組の中で同じ組合せがないほうが嬉しいのですが。 できれば班長も同じ組が出来ないほうがよいのですが。 ややこしいお話で申し訳ありませんが、よろしくおお願いいたします。

  • エクセルVBAで罫線を引きたいのですが

    コマンドボタンを押すと、対応するVBAが実行される ところまでできたのですが 10行目のA1~G10まで、アンダーラインを引きたいのです 下記はそれらしいVBAをコピーして実行したものです これでは、各セルに二重線で縁取りされました それを、アンダーラインを引きたいのですが、教えてください For Each myRange In Worksheets(1).Range("A10:g10") '←(1) myRange.Borders.LineStyle = xlDouble Next myRange できれば、For Each、なんか使わないでできると ありがたいのですが よろしくお願いします

  • Excel VBA For Each~Next構文についての質問

    こんにちは。 VBA初心者のものですが教えてください。 ※Excel2003です 「Sheet2のC29:U29のセルについて 1より小さければ小数第2位まで表示 1以上であれば小数第1位まで表示」 の構文を作りたいのですが、 「実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません」 のエラーが出てしまい、実行できません。 作成した構文は以下の通りですが、どのように訂正すればよいか、 ご教示いただけますでしょうか。 よろしくお願いいたします。 Sub ケタ() ' Dim rngCell As Range For Each rngCell In Worksheets("Sheet2").Range("C29:U29") If rngCell.Value < 1 Then rngCell.Selection.NumberFormatLocal = "0.00" Else rngCell.Selection.NumberFormatLocal = "0.0" End If Next rngCell End Sub

  • エクセルVBAで For Each をまとめる方法

    ワークシート上にフォームで作成したチェックボックス、グループボックス、オプションボタンだけをまとめて削除するVBAです。 以下のように、種類ごとに分けて記述することは出来るのですが、3種類まとめて書く方法がわかりません。 CheckBoxes,GroupBoxes,OptionButtons と並べてもだめのようです。 ご教示ください。 Sub delete_test() With ActiveSheet For Each cb In .CheckBoxes cb.Delete Next For Each gb In .GroupBoxes gb.Delete Next For Each ob In .OptionButtons ob.Delete Next End With End Sub

専門家に質問してみよう