目次

5 to 0

今回は、数字が加算されてカウントアップするループと、数字が減算されてカウントダウンするループを処理してみたいと思います。

私の場合、「For a = 5 To 0 ... Next」の記述で「5 4 3 2 1 0」とループが進むものと思っていましたが、マクロを実行してみると、 1 回も処理が行われませんでした。

減算する場合の記述は、加算する場合と少し違うようなのでテストを行ってみたいと思います。

なぜか処理されませんでした。
なぜか処理されませんでした。

目次まで戻る

マクロの一例

以下のマクロを作成してみました。条件を変えながら 6 回のテストを行っています。

「For a = 5 To 0 Step -1」とすると a が 1 ずつ減っていくようです。「Step -2」とすると 2 ずつ減っていくようです。

Sub 一ずつ増えていくループと一ずつ減っていくループ()

    Dim a As Long
    
    '1 回目: 0 から 5 まで 1 ずつ増えていくループ。
    Debug.Print "1 回目"; vbNewLine;
    
        For a = 0 To 5
        
            Debug.Print a '結果: 0 1 2 3 4 5
        
        Next

    '2 回目: 0 から 5 まで 1 ずつ減っていくループ。
    Debug.Print "2 回目"; vbNewLine;
    
        For a = 0 To 5 Step -1
        
            Debug.Print a '結果:空白 '処理 0 回
        
        Next
    
    '3 回目: 5 から 0 まで 1 ずつ増えていくループ。
    Debug.Print "3 回目"; vbNewLine;
    
        For a = 5 To 0
        
            Debug.Print a '結果:空白 '処理 0 回
        
        Next

    '4 回目: 5 から 0 まで 1 ずつ減っていくループ。
    Debug.Print "4 回目"; vbNewLine;
    
        For a = 5 To 0 Step -1
        
            Debug.Print a '結果: 5 4 3 2 1 0
        
        Next

    '5 回目: 0 から 5 まで 2 ずつ増えていくループ。
    Debug.Print "5 回目"; vbNewLine;

        For a = 0 To 5 Step 2
        
            Debug.Print a '結果: 0 2 4
        
        Next

    '6 回目: 5 から 0 まで 2 ずつ減っていくループ。
    Debug.Print "6 回目"; vbNewLine;

        For a = 5 To 0 Step -2
        
            Debug.Print a '結果: 5 3 1
        
        Next

End Sub

目次まで戻る

実行結果

マクロを実行すると VBE(Visual Basic Editor)のイミディエイトウィンドウに以下のテキストが出力されました。 2 , 3 回目は処理が行われていませんね。

1 回目
0
1
2
3
4
5
2 回目
3 回目
4 回目
5
4
3
2
1
0
5 回目
0
2
4
6 回目
5
3
1

上記の結果を表にして見やすくしてみました。 5 , 6 回目は 5 , 0 で終わるのではなく、 For end の手前の数値まで出力されています。

テスト回 For start For end For step a a a a a a
1 回目 0 5 0 1 2 3 4 5
2 回目 0 5 -1
3 回目 5 0
4 回目 5 0 -1 5 4 3 2 1 0
5 回目 0 5 2 0 2 4
6 回目 5 0 -2 5 3 1

目次まで戻る

1 to 6

For start が 0 からではなく途中の 1 から始まるループもテストしてみました。 6 から始まり 1 で終わるループもテストしてみます。

Sub ForNext_1to6_6to1_のループ()

Dim a As Long

Debug.Print "1 回目"; vbNewLine;

For a = 1 To 6

Debug.Print a

Next

Debug.Print "2 回目"; vbNewLine;

For a = 6 To 1 Step -1

Debug.Print a

Next

Debug.Print "完了"

End Sub

マクロの実行結果は以下のようになりました。私のイメージ通りに出力されています。

1 
2
3
4
5
6
2 回目
6
5
4
3
2
1
完了

目次まで戻る

0.1 to 0.6

0.1 to 0.6 ,  0.6 to 0.1 のループもテストしてみましたが、 0.1 to 0.6 のループが 0.5 までしか出力されませんでした。

Sub ForNext_整数以外_小数点を含んだ数値()

Dim a As Double '整数以外も格納可能な Double 型

Debug.Print "1 回目"; vbNewLine;

For a = 0.1 To 0.6 Step 0.1

Debug.Print a

Next

Debug.Print "2回目"; vbNewLine;

For a = 0.6 To 0.1 Step -0.1

Debug.Print a

Next

Debug.Print "完了"

End Sub

マクロの実行結果は以下のようになりました。なぜか 0.5 まででループが終了しています。

1 回目
0.1
0.2
0.3
0.4
0.5
2回目
0.6
0.5
0.4
0.3
0.2
0.1
完了

目次まで戻る

0.6 to 0

上記のマクロが上手くいかなかったので、 0 スタート、 0 終わりで再テストを行ってみましたが、以下のマクロを実行すると、 2 回目のループの最後に「2.77555756156289E-17」と指数が出力されました。

「-0.6 To 0 Step 0.1」とマイナスの値からスタートに変更してみましたが、最後に「-2.77555756156289E-17」と出力されました。

Sub ForNext_0スタート_0エンド_整数以外_小数点を含んだ数値()

Dim a As Double

Debug.Print "1回目"; vbNewLine;

For a = 0 To 0.6 Step 0.1

Debug.Print a

Next

Debug.Print "2回目"; vbNewLine;

For a = 0.6 To 0 Step -0.1

Debug.Print a

Next

Debug.Print "完了"

End Sub

上記のマクロの実行結果は以下のようになりました。

1回目
0
0.1
0.2
0.3
0.4
0.5
2回目
0.6
0.5
0.4
0.3
0.2
0.1
2.77555756156289E-17
完了

目次まで戻る

Step 0

Step を 0 にした場合のテストも行ってみました。マクロを実行してみると無限ループが発生してしまいました。 「Ctrl + Break」キーを押してマクロを停止しました。

Sub step0で無限ループになるマクロ()

Dim a As Long

For a = 0 To 5 Step 0 '0 にしてみました

Debug.Print a

Next

End Sub

上記マクロの実行結果です。

0 
0
0
0
0

目次まで戻る

テスト環境

  • Windows 10(64 ビット)
  • Microsoft Office Excel 2003

目次まで戻る

あとがき

「0.1 To 0.6 Step 0.1」が 0.5 で止まる原因、「0.6 To 0 Step -0.1」で「2.77555756156289E-17」が出力される原因はわからないままですが、私の知識では分からないので、整数でのループを行っていこうと思います。

整数でループして 10 で割ってもみたので良ければご覧ください。

Sub ForNext_1to6_6to1_10で割る()
Dim a As Long
Debug.Print "1 回目"; vbNewLine;
For a = 1 To 6
Debug.Print a / 10
Next
Debug.Print "2 回目"; vbNewLine;
For a = 6 To 1 Step -1
Debug.Print a / 10
Next
Debug.Print "完了"
End Sub

上記マクロの実行結果です。

1 回目
0.1
0.2
0.3
0.4
0.5
0.6
2 回目
0.6
0.5
0.4
0.3
0.2
0.1
完了

大きい数字でも割ってみました。

Sub もっと大きい数字で割る()
Debug.Print "開始"

Debug.Print 0 * 0.1
Debug.Print 1 * 0.1
Debug.Print 2 * 0.1
Debug.Print 100 * 0.001
Debug.Print 1000000000 * 0.0000000001
Debug.Print 10000000000# * 0.00000000001 '0 が 10 個以上で自動的に # が付く
Debug.Print 100000000000000# * 0.000000000000001 '0 が 14 個までは # が付く
Debug.Print 1E+15 * 1E-16 '0 が 15 以上で指数表示になる
Debug.Print 1E+308 * 1E-309 '1E+308 を 1E+309 に変更すると「オーバーフローしました」のエラー発生
'1E-309 を 1E-310 に変更すると 9.99999999999997E-311 に自動的に変更される

Debug.Print "" '一行開ける用

'Debug.Print 0 / 0 '「オーバーフローしました」のエラー発生
Debug.Print 0 / 10
Debug.Print 1 / 10
Debug.Print 2 / 10
Debug.Print 100 / 1000
Debug.Print 1E+15 / 1E+16
Debug.Print 1E+307 / 1E+308
Debug.Print 1 / 1E+308

Debug.Print "完了"
End Sub

結果は以下のようになりました。

開始
0
0.1
0.2
0.1
0.1
0.1
0.1
0.1
0.1

0
0.1
0.2
0.1
0.1
0.1
1E-308
完了

以上、閲覧ありがとうございました。

目次まで戻る

同じカテゴリの投稿(Excel VBA)

前後の投稿