目次
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
完了
以上、閲覧ありがとうございました。