1より小さい間隔でFor...Nextのループをする|Excel VBA |
For...Nextステートメントは、回数を指定して繰り返す命令です。
Sub Sample1()
Dim i As Long
For i = 1 To 10 '---(1)
Debug.Print i
Next i
End Sub
「For i = 1 To 10」の部分には、カウンタ変数iの増分値を表す「Step 1」が省略されていて、1ずつ増えます。
2ずつ増加させるには(1)のコードを次のようにします。
For i = 1 To 10 Step 2
Stepキーワードに負の値を指定すると、カウンタ変数を減少させることもできます。
For i = 10 To 1 Step -2
では「0.1ずつ増加」させるには、どうしたらいいでしょう。
同じような要領で、Sample2のようにすると失敗します。Sample2を実行するとマクロが終わらないのでご注意ください。
Sub Sample2()
Dim i As Long
For i = 1 To 10 Step 0.1
Debug.Print i
Next i
End Sub
問題は、カウンタ変数iの型です。
「Long」は長整数型を表します。整数を扱うデータ型なので、小数部分は格納できません。
For...Nextの初期値である 1 に増分値の 0.1 を加えると、2回目の繰り返しで変数iは 1.1 になるハズですが、Long型の変数iには整数しか格納されないので、iの値は 1 になってしまいます。
その 1 に、また 0.1 を加えて…という繰り返しで、変数iはいつまでも 1 のまま、というわけです。
ならば、変数iを「小数部分を格納できる型」で宣言しましょう。
小数を扱うデータ型には、単精度浮動小数点数型(Single)があります。
Sub Sample3()
Dim i As Single
For i = 1 To 10 Step 0.1
Debug.Print i
Next i
End Sub
しかし、Sample3を実行してみると、イミディエイトウィンドウには
1
1.1
1.2
1.3
と出力され、そのうち
2.7
2.799999
2.899999
2.999999
と誤差が生じてきます。
倍精度浮動小数点数型(Double)も同じです。
こんなときは、通貨型(Currency)を使うと良いでしょう。
次のマクロは期待した通り、0.1 きざみの値が表示されます。
Sub Sample4()
Dim i As Currency
For i = 1 To 10 Step 0.1
Debug.Print i
Next i
End Sub
Currency型は、「通貨型」の名のとおり、一般にお金の計算などに使用するデータ型です。
15桁の整数部分と4桁の小数部分を持ち、内部的には値を10000倍した整数で表しているため、今回のような計算に適しています。
ただし、Currency型がいつでも万能というわけではありません。
それぞれのデータ型には、格納可能な値の範囲が決められているので、ヘルプを参照して目的にあったデータ型を使うようにしましょう。
いずれにしても、小数を扱うときは細心の注意が必要ですね。