Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7684 / 13644 ツリー ←次へ | 前へ→

【37449】Exit Forについて Koharu 06/5/7(日) 15:53 質問[未読]
【37450】Re:Exit Forについて かみちゃん 06/5/7(日) 16:03 発言[未読]
【37451】Re:Exit Forについて Kein 06/5/7(日) 16:47 発言[未読]
【37457】Re:Exit Forについて Koharu 06/5/8(月) 18:44 質問[未読]
【37459】Re:Exit Forについて ハチ 06/5/8(月) 19:01 発言[未読]
【37498】Re:Exit Forについて Koharu 06/5/9(火) 20:17 お礼[未読]
【37461】Re:Exit Forについて Kein 06/5/8(月) 19:13 回答[未読]
【37499】Re:Exit Forについて Koharu 06/5/9(火) 20:22 質問[未読]
【37506】Re:Exit Forについて ゆみ 06/5/9(火) 21:19 発言[未読]
【37517】Re:Exit Forについて Koharu 06/5/9(火) 22:07 お礼[未読]
【37523】Re:Exit Forについて ハチ 06/5/10(水) 8:31 発言[未読]
【37531】Re:Exit Forについて Koharu 06/5/10(水) 18:37 お礼[未読]

【37449】Exit Forについて
質問  Koharu  - 06/5/7(日) 15:53 -

引用なし
パスワード
   Exit For と Exit Sub の使い分けが今一つ理解できません。
具体的なご説明をいただけませんでしょうか。
For nextから抜け出るということは理解しているのですが...
抜け出た後の処理?について何か、決まりがあるのでしょうか。

【37450】Re:Exit Forについて
発言  かみちゃん  - 06/5/7(日) 16:03 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>Exit For と Exit Sub の使い分けが今一つ理解できません。
>具体的なご説明をいただけませんでしょうか。

以下の2つのマクロを参考にしてみてください。
Test1を実行すると、
"1"、"2"、"3"、"4"、"5"
と順番に表示されますが、
Test2を実行すると、
"1"、"2"、"4"
しか表示されません。
これは、2を超えるとFor〜NextループをExit Forで抜けるため、"3"が表示されません。
また、"4"を表示したあと、Exit Sub でマクロを抜けますので、"5"は表示されません。

Sub Test1()
 Dim i As Integer
 For i = 1 To 3
  MsgBox i
 Next
 MsgBox "4"
 MsgBox "5"
End Sub

Sub Test2()
 Dim i As Integer
 
 For i = 1 To 3
  If i > 2 Then Exit For
  MsgBox i
 Next
 MsgBox "4"
 Exit Sub
 MsgBox "5"
End Sub

>抜け出た後の処理?について何か、決まりがあるのでしょうか。

Exit For は、それ以上、For 〜 Next の繰り返し処理はしない
Exit Sub は、ここから下のマクロを実行しない
ということになるかと思います。

私の説明、我流ですので、違っていましたら、どなたかフォローをお願いします。

【37451】Re:Exit Forについて
発言  Kein  - 06/5/7(日) 16:47 -

引用なし
パスワード
   >私の説明、我流です
とても分かりやすいと思います。あ、私にとっては、ですが。
あと、補足しておきますと
Exit Sub は Subプロシージャを抜けるものなので
Functionプロシージャなら、当然 Exit Function となること。
めったに使いませんが、Property 〜 プロシージャなら Exit Property
があります。それから、ループの種類は For で始まるものだけでく、
Do 〜 Loop もありますから、その場合はもちろん Exit Do で抜けます。
ただし While 〜 Wend の構文は、最初にループを抜ける条件を指定しないと
エラーになりますから、Exit While なんてのはありません。

【37457】Re:Exit Forについて
質問  Koharu  - 06/5/8(月) 18:44 -

引用なし
パスワード
   ▼かみちゃん さん Kein さん:

大変勉強させていただきました。
丁寧なサンプルと説明でよく理解できました。

自分なりに、Exit Forを試みました。
For〜Nextから抜け出ることが出来ました。

しかし、下の例で同じでない場合のMsgBoxが上手く働きませんが
どのような処理をすると良いのでしょうか。 
For 〜Nextでない方法が必要なのでしょうか。

For i = 6 To Cells(65536, 1).End(xlUp).Row
 If Cells(i, 1) = Range("B6").Value Then
   MsgBox Range("B6").Value & "がありました"
   Exit For
 End If
Next i

この下のコードを働かしたいのですが・・・B6と同じでない場合に
   MsgBox Range("B6").Value & "はありません"

アドバイスをお願いします。
 

【37459】Re:Exit Forについて
発言  ハチ  - 06/5/8(月) 19:01 -

引用なし
パスワード
   いまのコードを活かしたいのなら・・

Sub Test()

For i = 6 To Cells(65536, 1).End(xlUp).Row
 If Cells(i, 1) = Range("B6").Value Then
   MsgBox Range("B6").Value & "がありました"
   Exit Sub
 End If
Next i

MsgBox Range("B6").Value & "はありません"

End Sub

あった場合は、Exit Subで終わらせてしまう方法でどうでしょう?

【37461】Re:Exit Forについて
回答  Kein  - 06/5/8(月) 19:13 -

引用なし
パスワード
   「同じ」は = で比較したとき True が返るわけですから、
「同じでない」は <> で比較したとき True になる場合です。
従ってループ構文の中のコードは

If Cells(i, 1).Value <> Range("B6").Value Then
  MsgBox Cells(i, 1).Value & " が違います"
  Exit For
End If

に、なります。しかし質問文からは、どうもそういうことを聞きたいのでなく、
「A列で B6 の値を検索して、あるかないかをメッセージしたい」という意味
のようですね。曖昧な表現をすると誤解を招くので、注意して欲しいです。
で、もしそのような内容ならば

Dim Ck As Variant

If Ck = Application.Match(Range("B6").Value, Range("A:A"), 0)
If IsError(Ck) Then
  MsgBox Range("B6").Value & " はありません"
End If

と、します。ここで「5行目以前に見つかっても、無かったことにする」なら

If IsError(Ck) Or Ck < 6 Then

などとしておけば良いでしょう。

【37498】Re:Exit Forについて
お礼  Koharu  - 06/5/9(火) 20:17 -

引用なし
パスワード
   ▼ハチ さん:
ありがとう御座いました。
やはりExit Subを使うことでしょうか。
Exit Forで出来ないか?っと思いましたが、無理なんでしょうね。
またよろしくお願いします。

【37499】Re:Exit Forについて
質問  Koharu  - 06/5/9(火) 20:22 -

引用なし
パスワード
   ▼Kein さん:

>しかし質問文からは、どうもそういうことを聞きたいのでなく、
>「A列で B6 の値を検索して、あるかないかをメッセージしたい」という意味
>のようですね。曖昧な表現をすると誤解を招くので、注意して欲しいです。
>で、もしそのような内容ならば

失礼しました。
また曖昧な質問になりますが・・・
新たに書いていただいたコードは新鮮に映るんですが・・・
何故か動作しません・・・何を質問すると良いか分かりませんが・・・
動かす方法を教えてください。
>
>Dim Ck As Variant
>
>If Ck = Application.Match(Range("B6").Value, Range("A:A"), 0)
>If IsError(Ck) Then
>  MsgBox Range("B6").Value & " はありません"
>End If
>
>と、します。ここで「5行目以前に見つかっても、無かったことにする」なら
>
>If IsError(Ck) Or Ck < 6 Then
>
>などとしておけば良いでしょう。

【37506】Re:Exit Forについて
発言  ゆみ  - 06/5/9(火) 21:19 -

引用なし
パスワード
   ▼Koharu さん:
>▼Kein さん:
>
>>しかし質問文からは、どうもそういうことを聞きたいのでなく、
>>「A列で B6 の値を検索して、あるかないかをメッセージしたい」という意味
>>のようですね。曖昧な表現をすると誤解を招くので、注意して欲しいです。
>>で、もしそのような内容ならば
>
>失礼しました。
>また曖昧な質問になりますが・・・
>新たに書いていただいたコードは新鮮に映るんですが・・・
>何故か動作しません・・・何を質問すると良いか分かりませんが・・・
>動かす方法を教えてください。
>>
>>Dim Ck As Variant
>>
>>If Ck = Application.Match(Range("B6").Value, Range("A:A"), 0)
>>If IsError(Ck) Then
>>  MsgBox Range("B6").Value & " はありません"
>>End If
>>
>>と、します。ここで「5行目以前に見つかっても、無かったことにする」なら
>>
>>If IsError(Ck) Or Ck < 6 Then
>>
>>などとしておけば良いでしょう。

Exit For と Exit Sub の違いが分からないというよりも、Ifの条件分岐が分からないとお見受けしました。
どの場合にFor〜Nextから抜けるべきか、どの場合にSubを終わらせるか。
それを考えてるんですよね。
自分で何が分からないかが分からない。という状況なんでしょうけど。

質問が発展していくことは構わないのですが、順番に疑問を解決もしくは理解したうえで次のステップに進まないと同じ疑問を持ち続けることになりますよ。

回答でなくて申し訳ありません。

【37517】Re:Exit Forについて
お礼  Koharu  - 06/5/9(火) 22:07 -

引用なし
パスワード
   ▼ゆみ さん:
>Exit For と Exit Sub の違いが分からないというよりも、Ifの条件分岐が分からないとお見受けしました。
>どの場合にFor〜Nextから抜けるべきか、どの場合にSubを終わらせるか。
>それを考えてるんですよね。
>自分で何が分からないかが分からない。という状況なんでしょうけど。
>
>質問が発展していくことは構わないのですが、順番に疑問を解決もしくは理解したうえで次のステップに進まないと同じ疑問を持ち続けることになりますよ。
>
>回答でなくて申し訳ありません。

アドバイスありがとう御座います。
皆様の解答やアドバイスで
お陰さまで、何とかExit For、Exit SubとExit Doの使い分けが分かってきました。
これからも勉強させていただきますので、よろしくご指導の程お願い申し上げます。
失礼します。

【37523】Re:Exit Forについて
発言  ハチ  - 06/5/10(水) 8:31 -

引用なし
パスワード
   >失礼しました。
>また曖昧な質問になりますが・・・
>新たに書いていただいたコードは新鮮に映るんですが・・・
>何故か動作しません・・・何を質問すると良いか分かりませんが・・・
>動かす方法を教えてください。
>>
>>Dim Ck As Variant
>>
>>If Ck = Application.Match(Range("B6").Value, Range("A:A"), 0)
>>If IsError(Ck) Then
>>  MsgBox Range("B6").Value & " はありません"
>>End If
>>
>>と、します。ここで「5行目以前に見つかっても、無かったことにする」なら
>>
>>If IsError(Ck) Or Ck < 6 Then
>>
>>などとしておけば良いでしょう。

A列にB6の値が無い場合に、Ckの値がErrorになりますので
Ck < 6 の時に数値型にならないので「型が一致しない」と
エラーになるってことでしょうか?
Matchでやると最初に見つかったものを取得してしまうので
5行目以前にはデータを入れないで、
IsErrorだけでチェックするのが無難だと思います。

>>If Ck = Application.Match(Range("B6").Value, Range("A:A"), 0)
の最初のIfは誤記かなぁ と。

【37531】Re:Exit Forについて
お礼  Koharu  - 06/5/10(水) 18:37 -

引用なし
パスワード
   ▼ハチ さん:

ありがとう御座います。
もう少し突っ込んで質問したかったのですが、素人が余りでしゃばるのは
いけないと思い、またご忠告もその通りだと思いましたので・・・またの機会に
聞けるかな?っと思っていました。

よく分かりました。
Ifが誤記かな・・・と書かれていましたのでその通りしましたら上手く処理できました。
その他のコメントもありがたく感謝しています。
何故かもやもやが解けて嬉しく思います。
本当にありがとう御座いました。

これからもよろしくお願いします。
失礼します。

7684 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free