HOME > 即効テクニック > Excel VBA > その他関連のテクニック > 1より小さい間隔でFor...Nextのループをする

1より小さい間隔でFor...Nextのループをする|Excel VBA

その他関連のテクニック

1より小さい間隔でFor...Nextのループをする

(Excel 97/2000/2002/2003/2007/2010/2013)

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ずつ増加する

では「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型がいつでも万能というわけではありません。
それぞれのデータ型には、格納可能な値の範囲が決められているので、ヘルプを参照して目的にあったデータ型を使うようにしましょう。
いずれにしても、小数を扱うときは細心の注意が必要ですね。