• ベストアンサー

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まで実行されます。 一体どうしてでしょうか。 よろしくお願いします。

noname#208339
noname#208339

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

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.4

下記の様なプログラムを試してみました。 ------------------------------ 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」までループしますし・・・

noname#208339
質問者

お礼

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

その他の回答 (3)

noname#22222
noname#22222
回答No.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 は使えないようです。 多分、想定外ではないのでしょうか?

noname#208339
質問者

お礼

>つまり、For 文では Currency は使えないようです。 >多分、想定外ではないのでしょうか? そうみたいですね。 VBで財務ソフト作っていたら大変なことになってしまうとこでした。 ありがとうございました。

  • JAWS55
  • ベストアンサー率38% (176/452)
回答No.2

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

noname#208339
質問者

お礼

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

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

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

noname#208339
質問者

お礼

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

関連するQ&A

  • 値渡しについて

    UserForm1で以下のように求めた値「R」を UserForm2に渡すにはどのようにすればよいのでしょうか。 **************************************** <UserForm1(コード)> Public R As Integer ----------------------------------- Private Sub CommandButton1_Click()    Dim N As Integer        :    N = TextBox1.Text    R= N * 2 + 3        : End Sub **************************************** <UserForm2(コード)> Private Sub CommandButton1_Click()   Dim i As Integer       :   For i = 4 To R       :   Next i       : End Sub **************************************** どなたか教えて下さい。

  • Microsoft Visual Basic 6.0でテキスト1に表示させたい。

    Dim i As Integer Private Sub Command1_Click() For i = 100 To 1 Step -1 If i Mod 3 = 2 Then Debug.Print i End If Next i End Sub のプログラムがあるのですがプログラミング結果が イミディエイトの方に表示されるのですが このプログラムの結果をtext1に表示させたいのですが どのようなプログラムにすれば良いでしょうか? 詳しい方教えてください。

  • VB バリアント型の配列の例について

    長々と失礼します。私の使用している教科書に 「バリアント型の2次元配列」と「バリアントに2次元配列を代入」というのを組み合わると「行列i要素とする行列」たとえば 2 5 9 4 1 8 7 3 6 1 5 9 8 0 1 6を的確に表現できます。 と書いており、下のように書かれているのですが上のような配列を表示しません。どこが間違っているのでしょうか?そもそも上のように表示できるのか理解に苦しんでおります Option Base 1 Private Sub Command1_Click() Dim a(2,2) As Variant Dim c(2,2) As Integer For i = 1 To 2 For j = 1 To 2 For p = 1 To 2 For q = 1 To 2 c(p,q) = p + q + i * j Next q Next p a(i,j) Next j Next i For i = 1 To 2 For p = 1 To 2 For j = 1 To 2 For q = 1 To 2 Print a(i,j)(p,q), Next q Next j Print Next p Next i End Sub

  • 乱数で・・・

       ラベル10枚に1~10までを乱数を入れたいのです ただしダブらない どうすればいいのでしょうか?? 自分で考えたのですがバグがあります ※コマンドをクリック ※クローンは用意済み Private Sub Command1_Click() Dim a(0 To 9) For i = 0 To 9 a(i) = Int(Rnd * 10)+1  For b = 0 To 9   If a(i) = a(b) Then     If i <> b Then     a(i) = Int(Rnd * 10) + 1     End If   End If   Next b Next i For c = 0 To 9 Label1(c).Caption = a(c) Next c End Sub バグの原因はなんとなくわかるのですがどうすればいいのか分かりません 素人ですいません。

  • VB.NETとして書き換え

    コマンドボタンを押すたびに ココ という文字をテキストボックスに書く。 Private Sub Command1_Click() Dim i As Integer i = Int(Rnd * 4) For c = 0 To 4 Text1(c).Text = "" Next c Text1(i).Text = "ココ" End Sub VB6ではこんなふうになると思います。 .NETではどう書けばいいのでしょうか?

  • 割り込み処理

    Application.OnTimeで一定時間後に処理をさせたいのですが For文のループ処理を完了してからApplication.OnTimeが実行されてしまいます。 ループ処理中にApplication.OnTimeを優先して実行させることって出来るのでしょうか? Option Explicit Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click() Call M1 End Sub Private Sub M1() Dim i As Integer Application.OnTime Now() + TimeValue("00:00:03"), "Sheet1.M2" For i = 0 To 30 Range("A1") = i Sleep 1000 Next i End Sub Sub M2() MsgBox ("123") End Sub

  • タイムストッププログラム

    お世話になります。 コマンドボタン2をおしても タイムがとまらないんですが・・・ なぜでしょうか? Private Sub Command1_Click() Dim k As Integer Dim NOW As Long For k = 1 To 1000 Text1.Text = k NOW = Timer While Timer < NOW + 1 '1秒間待機する DoEvents Wend If Command2.Value = True Then Exit For Next k End Sub

  • コンボボックスで選択された値の取得

    使用しているオブジェクトは Combo1,Text1,Command1です。 General Declarations ----------------------------    Dim Sent()    Dim Count_no() ------------------------------------------------- Private Sub Command1_Click() --------------------    Dim i    Dim Hyouji    For i = 1 To 3     If Combo1.Text = Sent(i) Then     Text1.Text = Count_no(i)     *******************************     Else     Text1.Text = Combo1.Text     *******************************     End If    Next i End Sub ------------------------------------------------- Private Sub Form_Load() -------------------------    Dim Sentence As String    Dim i    ReDim Sent(1 To 3)    ReDim Count_no(1 To 3)    For i = 1 To 3      Sentence = "Sentence" & i      Sent(i) = Sentence      Count_no(i) = i      Combo1.AddItem (Sent(i))    Next i End Sub ------------------------------------------------- 以上のソースを書いています。 もし"Sentence2"が選択・Command1クリックされたらText1には"2"が表示され、 (ここまでは出来ました) "12345"と入力・クリックされたら"12345"と表示されるようにしたいのですが、 配列以外の文字を入力した場合の条件(ソースの***内)を加えた途端 Combo1.TextがText1に表示されてしまいます。 条件の書き方が悪いのでしょうか? ややこしい説明ですみませんが、わかる方、回答お願いします。

  • 実行中のマクロを中断したい

    過日、「マクロの中断」について質問し適切な回答をいただき無事解決したものです。 ところが、初心者の悲しさ、少し変わると全く応用がききません。 Range("A1:B10")を読み上げている途中で中断したいのです。前回ご教示いただいたところにより 「DoEvents」や「Me.Repaint」「Sleep」などをあちこち挿入してみましたがうまくいきません。理屈、理論を理解できていないので仕方ないのでしょうがよろしかったら又ご指導のほどお願いします。Excel2003です。 Dim c As Range Dim CancelFlg As Integer Private Sub CommandButton1_Click() Range("A1:B10").Select CancelFlg = 0 For Each c In Selection   ’ DoEvents Application.Speech.Speak c.Value  ’ DoEvents If CancelFlg = 1 Then Exit For  ’ DoEvents Next c Range("A1").Select End Sub Private Sub CommandButton2_Click() CancelFlg = 1 End Sub 前回のご教示いただいたもの Private Sub CommandButton1_Click() Dim i As Integer CancelFlg = 0 For i = 1 To 100 DoEvents ActiveCell.Value = 1 ActiveCell.Offset(1, 0).Activate Application.Wait (Now + TimeValue("0:0:01")) If CancelFlg = 1 Then Exit For Next i End Sub Private Sub CommandButton2_Click() CancelFlg = 1 End Sub

  • 配列を関数に渡す方法

    VB6.0のプログラムで質問があるのですが 下のプログラムのように配列num、num1を関数AAAに 渡したいと思うのですがどうすればいいのでしょうか? よろしくお願いいたします。 Option Explicit Private num(10) As Integer Private num1(10) As Integer Private Sub Write_Click()    AAA(num)    AAA(num1) End Sub Private Function AAA(???)    Dim i As Integer    For i = 1 To 10       ???(i) = i    Next i End Function