みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

[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をどのように使い分けていますか?

質問に不備不足等ございましたらご指摘ください。
ご面倒お掛けしますがよろしくお願いします。

投稿日時 - 2016-11-23 19:34:41

QNo.9259374

困ってます

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

私は、「For Next」は、終わりの値が何らかの方法で確定できるときです。

すなわち、上記の質問者の例だと、私は両方とも、「For Next」を使います。

しかし、終わりの値が分かる場合でも、次のように、繰り返すときに数値ではないもので繰り返す場合があります。

For Each f In x.Files
If InStr(f.Name, "ABC") > 0 Then
ああしなさい、こうしなさい。
End If
Next

これは、「x」というフォルダに存在するすべてファイルを調べるときに使うものですが、このとき、ファイルの数は「x.Files.Count」によって、取得できます。

単に、繰り返すだけなら「For f = 1 to x.Files.Count」でいいのですが、調べたファイルのファイル名を取得したいような場合は、「For Next」では、どうすることも出来ません。

「For Next」の(例の場合なら「f」)変数は、「数値」だからです。

f.Nameとやっても、ファイル名は取得できません。

これは「For Each Next」でしか、できないのです。

数値でいい場合は、「For Next」の方が圧倒的に便利です。

質問者の例でも、その変数の数値を使って「Cells()」が使えるからです。

単純な回数を指定する場合は、「For Next」、そうでなく、変数が特殊な意味がある場合は「For Each Next」という感じです。

投稿日時 - 2016-11-23 21:21:42

お礼

ありがとうございます。
参考になりました。

投稿日時 - 2016-11-27 15:53:03

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

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

回答(2)

ANo.2

私は基本的に、配列の場合For Nextを使い、コレクションの場合For Each Nextを使います。

セルに対して何かを行う場合も、セルを配列とみなして処理するならFor Next、コレクションとして扱うならFor Each Nextを使います。

投稿日時 - 2016-11-23 21:59:18

お礼

ありがとうございます。参考になりました。

投稿日時 - 2016-11-27 15:51:32

あなたにオススメの質問