0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【VBA小ネタ】Forループの小さな話(小学生向け)

Last updated at Posted at 2022-08-21

はじめに

カウンタのある基本的なForループについて、迷っていたことがありました。ループを回り切ったカウンタの値がどうなるのか。わかってしまえばバカバカしいほど簡単です。

お前、ちゃんと10回ったんだろうな?

Forループを使ったロジックで、条件によってはループを途中で抜け出したいときがある。
例えば、カウンタが5になったら抜けたい場合は、If文で条件を判定して条件が合えば、Exit Forで脱出する。

VBA
Private Sub Hoge()
    For i = 0 To 9
        Debug.Print "ループ内 i=" & i
        If i = 5 Then Exit For
    Next
    Debug.Print "-- ループを抜けました --"
End Sub

この例では条件がi = 5と固定されているが、ループ内の処理によって条件が変化するとき、後続処理の中で、ループを途中で抜けたのか、抜けることなく最後まで回り切ったのか、簡単に判定する方法は無いだろうか?

Next を通過するとカウンタが加算される

以下のマクロで、Forループのカウンタがどう変化するか、ループを回り切った場合と途中で抜けた場合を見てみた。

VBA
Private Sub Hoge2()

    Debug.Print "--- Forループ実験 (Exit For無し) ---"
    
    Dim i As Integer
    For i = 0 To 9
        Debug.Print "ループ内 i=" & i
    Next
    
    Debug.Print "-- ループを抜けました --"
    Debug.Print "ループ外 i=" & i & vbCr
    
    
    Debug.Print "--- Forループ実験 (5でExit For) ---"
    
    For i = 0 To 9
        Debug.Print "ループ内 i=" & i
        If i = 5 Then Exit For
    Next
    
    Debug.Print "-- ループを抜けました --"
    Debug.Print "ループ外 i=" & i

End Sub

以下が結果である。

--- Forループ実験 (Exit For無し) ---
ループ内 i=0
ループ内 i=1
ループ内 i=2
ループ内 i=3
ループ内 i=4
ループ内 i=5
ループ内 i=6
ループ内 i=7
ループ内 i=8
ループ内 i=9
-- ループを抜けました --
ループ外 i=10

--- Forループ実験 (5でExit For) ---
ループ内 i=0
ループ内 i=1
ループ内 i=2
ループ内 i=3
ループ内 i=4
ループ内 i=5
-- ループを抜けました --
ループ外 i=5

最後までループを回り切る最初のFori9で終わると思ったら、10になっている。
Exit Forで途中で抜けた方のiは抜けた時点での5のままである。
どうやらNextを通過することでカウンタが加算されるようだ。

わかりやすいC#

これと同様のことをC#で書くとどうなるか。

C#
    Console.WriteLine("--- forループ実験 (ブレーク無し) ---");
    int i;
    for (i = 0; i <= 9; i++)
    {
        Console.WriteLine($"ループ内 i={i}");
    }
    Console.WriteLine("-- ループを抜けました --");
    Console.WriteLine($"ループ外 i={i}\n");
    
    Console.WriteLine("--- forループ実験 (5でブレーク) ---");
    for (i = 0; i <= 9; i++)
    {
        Console.WriteLine($"ループ内 i={i}");
        if (i == 5) { break; }
    }
    Console.WriteLine("-- ループを抜けました --");
    Console.WriteLine($"ループ外 i={i}");

結果は、上述のVBAと同様だが、i++があることで、この結果が当たり前に見える、、、

余談だが、i++i+=2にしてループを回り切ると、i11になる。
VBAなら、

VBA
For i = 0 To 9 Step 2

とすれば同様の結果となる。

おまけ

Pythonで、これはどうなるか。
Pythonのforループは独特だ。カウンタが無い。

Python
    print('--- forループ実験 ---')
    
    i=0
    for i in range(10):
        print(f'ループ内i={i}') 
    else:
        print('-- 最後までループを回り切りました --')
    print('-- ループを抜けました --')
    print(f'ループ外i={i}')
    print('') # なぜか¥nで改行できなかったので...
    
    for i in range(10):
        print(f'ループ内i={i}') 
        if i==5:
            break
    else:
        print('-- 最後までループを回り切りました --')
    print('-- ループを抜けました --')
    print(f'ループ外i={i}')

結果は、

--- forループ実験 ---
ループ内i=0
ループ内i=1
ループ内i=2
ループ内i=3
ループ内i=4
ループ内i=5
ループ内i=6
ループ内i=7
ループ内i=8
ループ内i=9
-- 最後までループを回り切りました --
-- ループを抜けました --
ループ外i=9

ループ内i=0
ループ内i=1
ループ内i=2
ループ内i=3
ループ内i=4
ループ内i=5
-- ループを抜けました --
ループ外i=5

forに続くelseは、最後までループが回り切った時だけ実行される(breakされた時は実行されない)。もうお分りだろうが、このPythonのforは、VBAで言うところのFor Eachである。

カウンタ無しでも、ちゃんと回り切ったことを確認する方法を用意してあるところが賢いね:thinking:

追記

カウンタをコレクションの如く勘違いしていた。自分がもしC言語系ネイティブだったら、こんな勘違いはしなかっただろう。カウンタは、指定したレンジから外れることでループを抜ける。コレクションは、レンジ内で処理をする:relaxed:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?