こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Currency (通貨型)に関して教えてください

Currency (通貨型)に関して教えてください。(VB5です)

Private Sub Command1_Click()
Dim a As Currency
a = 222222
For i = 1 To a
Next i
End Sub
上のコードではFor文が一度も実行されずに終わってしまいます。

Private Sub Command1_Click()
Dim a As Currency
a = 22222
For i = 1 To a
Next i
End Sub
これだとちゃんとiが22222まで実行されます。
一体どうしてでしょうか。

よろしくお願いします。

投稿日時 - 2006-12-19 06:37:20

QNo.2611683

暇なときに回答ください

質問者が選んだベストアンサー

下記の様なプログラムを試してみました。
------------------------------
Private Sub Command1_Click()
Dim a As Currency
Dim i As Variant, j As Long

For j = 1 To 222222
a = j
For i = 1 To a Step 1
Next i
If i = 1 Then
Debug.Print j, i
Stop
End If
Next j

End Sub
------------------------------
214749で、ループが回らなくなりますね。
で、「214749」とは・・・
Currency型って、整数値を1万分の1にして小数値ぽく見せるデータ型ですよね。
つまり、「214749」は内部的には「2147490000」と言う整数値で格納されているんだと思います。
で、「2147490000」って・・・
Long型の最大値である、「2147483647」をちょうど越えた値です。
#つまり、符号ビットが切り替わる箇所。

No1さんが言われているように符号処理を間違えてしまっているっぽいですね。

実際
---------------------------------------------
Private Sub Command1_Click()
Dim a As Currency
a = 222222
For i = 1 To a Step -1
Next i
End Sub
-------------------------------------------
とすると、「-1」までループしますし・・・

投稿日時 - 2006-12-19 11:47:59

お礼

VBのバグだったんですね。
原理までつきとめていただいてありがとうごさいます。
Currency型って使わない方がいいみたいですね。
ありがとうございました。

投稿日時 - 2006-12-20 22:27:38

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

ウーン!
この現象はVB6.0でも確認されますね。

Private Sub Command1_Click()
Dim a As Currency
Dim i As Variant

a = 222222
For i = 1 To a
Next i
Debug.Print i
End Sub

[イミディエイト]
1

Private Sub Command1_Click()
Dim a As Currency
Dim i As Currency

a = 222222
For i = 1 To a
Next i
Debug.Print i
End Sub
[イミディエイト]
1

Private Sub Command1_Click()
Dim a As Currency
Dim i As Long

a = 222222
For i = 1 To a
Next i
Debug.Print i
End Sub

[イミディエイト]
222223

つまり、For 文では Currency は使えないようです。
多分、想定外ではないのでしょうか?

投稿日時 - 2006-12-19 09:27:20

お礼

>つまり、For 文では Currency は使えないようです。
>多分、想定外ではないのでしょうか?

そうみたいですね。
VBで財務ソフト作っていたら大変なことになってしまうとこでした。
ありがとうございました。

投稿日時 - 2006-12-20 22:17:39

ANo.2

VB5は忘れてしまっているかも知れませんが、たしかint型は16bit?
a=222222 では、オーバーフローして内部では マイナスの数値になっているのかも知れません。
i を Long int にしても実行されませんか?

投稿日時 - 2006-12-19 09:17:38

お礼

iをLongにしたらうまくいきました。
どうやらVBのバグみたいです。
ありがとうございました。

投稿日時 - 2006-12-20 22:13:36

ANo.1

変数 i の型はなんでしょうか

投稿日時 - 2006-12-19 09:08:31

お礼

iは宣言してませんでした。
どうやらVBのバグみたいです。
ありがとうございました。

投稿日時 - 2006-12-20 22:10:58

あなたにオススメの質問