Excel VBA質問箱 IV

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

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


3735 / 13646 ツリー ←次へ | 前へ→

【60458】Exit Forについて kiki 09/2/23(月) 13:35 質問[未読]
【60460】Re:Exit Forについて kanabun 09/2/23(月) 13:44 発言[未読]
【60463】Re:Exit Forについて ぴかる 09/2/23(月) 13:56 発言[未読]
【60466】Re:Exit Forについて kiki 09/2/23(月) 14:23 お礼[未読]
【60468】Re:Exit Forについて kiki 09/2/23(月) 14:34 お礼[未読]
【60464】Re:Exit Forについて kanabun 09/2/23(月) 14:15 発言[未読]

【60458】Exit Forについて
質問  kiki  - 09/2/23(月) 13:35 -

引用なし
パスワード
   お世話になります。

ネット等で、Exit Forを調べたのですが
いまいち 理解できませんでした。

下記のコードだとExit Forが あっても 無くても動きます。
Exit Forは、必要でしょうか?

Exit Forを解り易く 教えて下さい。
宜しくお願いします。

Dim R As Long
  For Row = 4 To 112 Step 36
    If Intersect(Target, Range(Cells(R, "A"), Cells(R + 13, "A"))) Is Nothing Then Exit Sub
      UserFoam1.ComboBox1.DropDown
   Exit For
  Next
End Sub

【60460】Re:Exit Forについて
発言  kanabun  - 09/2/23(月) 13:44 -

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

回答ではありませんが、

>下記のコードだとExit Forが あっても 無くても動きます。

いや、そのままでは実行時エラーになると思いますよ。
変数R に値が代入されていない。

モジュールの先頭に
Option Explicit
を宣言して、コンパイルしてみてください。

>UserFoam1

もおかしいですね?

【60463】Re:Exit Forについて
発言  ぴかる  - 09/2/23(月) 13:56 -

引用なし
パスワード
   kikiさん、こんにちは。

以下のマクロで説明しますと、Exit Forが無いと11以降もFor Nextが働きます。
有りにすると処理が終われば、For Nextから抜け出します。つまり無駄な時間
を無くすという事です。多分、こういう事だと思います。

  For I = 1 To 1000
    If I = 10 Then
      '処理
      Exit For
    End If
  Next

【60464】Re:Exit Forについて
発言  kanabun  - 09/2/23(月) 14:15 -

引用なし
パスワード
   提示のコードを実行時エラーにならないように直すと
こういうことかと思いますが、

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim R As Long
 For R = 4 To 112 Step 36
  If Intersect(Target, Cells(R, "A").Resize(14)) _
     Is Nothing Then Exit Sub
  UserForm1.ComboBox1.DropDown
  Exit For
 Next
End Sub

↑これだと、Target が第1回目のLoopで指定された範囲、すなわち
 [A4:A27]にない限り、 Exit Sub してしまってますよね?

>  For R = 4 To 112 Step 36
でLoopしている目的は、
 Target がそこで指定された「複数の」セル範囲の「どれかの」
 範囲内にあったら、
   UserForm1のComboBox1をドロップダウンしてやる
ことにあったのではないですか?

もしそうなら、Targetと その複数セル範囲を順に調べていって
 Targetが調べるセル範囲とIntersectしていたら、
   UserForm1のComboBox1をドロップダウンして
   以後のLoopを中止する(Loopを抜ける = Exit For)
するといった書き方にしないとまずいです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim R As Long
  For R = 4 To 112 Step 36
   If Not Intersect(Target, Cells(R, "A").Resize(14)) Is Nothing Then
     UserForm1.ComboBox1.DropDown
     Exit For
   End If
  Next
End Sub

【60466】Re:Exit Forについて
お礼  kiki  - 09/2/23(月) 14:23 -

引用なし
パスワード
   kanabunさん

以下のように直しました。

ぴかるさん
 
>Exit Forが無いと11以降もFor Nextが働きます。
>有りにすると処理が終われば、For Nextから抜け出します。つまり無駄な時間
>を無くすという事です。
 
解りやすい説明で、理解できました。

kanabunさん ぴかるさん

有り難うございました。

Option Explicit

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

Dim R As Long
  For R = 4 To 112 Step 36

    If Not Intersect(Target, Range(Cells(R, "A"), Cells(R + 13, "A"))) Is Nothing Then
        UserFoam1.ComboBox1.DropDown
     Exit For
    End If
  Next
End Sub

【60468】Re:Exit Forについて
お礼  kiki  - 09/2/23(月) 14:34 -

引用なし
パスワード
   kanabunさん 入れ違いになったようです。

>もしそうなら、Targetと その複数セル範囲を順に調べていって
>Targetが調べるセル範囲とIntersectしていたら、
>UserForm1のComboBox1をドロップダウンして
>以後のLoopを中止する(Loopを抜ける = Exit For)
>するといった書き方にしないとまずいです

>Resize(14)) Is Nothing Then

勉強になりました。

本当に有り難うございました。

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