【VBAリファレンス|実務向け】1より小さい間隔でFor…Nextのループをする|Excel VBA

スポンサーリンク

導入:なぜ小数のループで「無限ループ」や「誤差」が起きるのか

Excel VBAで繰り返し処理を行う際、For…Nextステートメントは非常に便利です。通常は「Step 1」のように整数を指定しますが、業務効率化の過程で「0.1ずつ増やしたい」「0.5ずつ刻みたい」といったニーズが出てくることがあります。

しかし、安易にコードを書くと「マクロが終わらない(無限ループ)」や「計算結果が微妙にズレる(浮動小数点数誤差)」という問題に直面します。今回は、これらの罠を回避し、正確に小数のループを制御する方法を解説します。

基礎知識:データ型の役割を理解する

VBAで変数を宣言する際、「Long」型は整数しか扱えません。もし「For i = 1 To 10 Step 0.1」で変数iをLong型にすると、0.1の増分は切り捨てられて「1」のままとなり、終了条件に到達せず無限ループに陥ります。

また、小数を扱える「Single」型や「Double」型(浮動小数点数型)を使用すると、コンピュータ内部の計算構造上、どうしても微細な誤差が発生してしまいます。例えば「2.899999…」のように、本来の数値とわずかな差が生まれるため、判定処理などでバグの原因となります。

実装:Currency型を活用した解決策

この問題を解決する最強のツールが「Currency型(通貨型)」です。Currency型は、内部的に10000倍した整数として計算を行うため、固定小数点数のような挙動をします。これにより、小数を扱う際にも誤差が発生せず、正確なループ処理が可能になります。

サンプルプログラム:Currency型を使用したループ処理

以下のコードは、0.1刻みで1から2まで正確にカウントアップする例です。そのままコピーして、VBE(Visual Basic Editor)に貼り付けて実行してください。

Sub LoopWithDecimal()
‘ Currency型で変数を宣言することで、小数の計算誤差を防ぎます
Dim i As Currency

‘ 1から2まで、0.1ずつ加算しながらループします
‘ Currency型を使用しているため、誤差なく正確に処理されます
For i = 1 To 2 Step 0.1
‘ イミディエイトウィンドウに結果を出力
Debug.Print “現在の値: ” & i
Next i

MsgBox “ループが正常に終了しました。”
End Sub

応用・注意点:現場で役立つアドバイス

1. データ型の特性を使い分ける
Currency型は非常に強力ですが、扱える数値の範囲には上限があります。非常に大きな数値や、極端に細かい小数を扱う場合は、別の手法(例えば、整数でループを回して最後に10で割るなど)を検討する必要があります。

2. 無限ループへの備え
もし誤って無限ループに入ってしまった場合は、キーボードの「Ctrl + Break」キーを押すことで、強制的にマクロを停止させることができます。開発中は必ずこの操作を覚えておきましょう。

3. 比較演算の注意
ループの条件判定で「If i = 2.1 Then…」のような比較を行う際、浮動小数点数型(Single/Double)を使用していると、誤差のせいで「イコール」と判定されないことが多々あります。小数の比較を行う際にも、このCurrency型は非常に有用です。

正確なデータ型選択は、バグの少ない堅牢なマクロ作成の第一歩です。ぜひ実務で活用してみてください。

タイトルとURLをコピーしました