dポイントプレゼントキャンペーン実施中!

コントロール配列にしたテキストボックスに数値を入力し、その数値に金種(10000円、5000円、1000円・・・)を乗算します。
そこで得られた結果を足して、ラベルに表示させたいと思っています。
現在、テキストボックスに数値を入れると
・小さい数値ならば、うまく加算できる
・大きい数値ならば、オーバーフローする
・何も記述しない(空白)とエラーがデータ型が違うという、エラーがでる

といった状態です。何がおかしいのか頭を悩ませていますので、アドバイスをお願いします。
***********************************************
For i = 0 To 8
Maisuu(i) = Val(txtKinsyu(i).Text)
Next i

lngGoukei = Maisuu(0) * 10000 + Maisuu(1) * 5000 + Maisuu(2) * 1000 _
+ Maisuu(3) * 500 + Maisuu(4) * 100 + Maisuu(5) * 50 _
+ Maisuu(6) * 10 + Maisuu(7) * 5 + Maisuu(8) * 1

lblGoukei.Caption = lngGoukei
***********************************************

A 回答 (4件)

この場合 Dim文で変数をLong(16桁数値)に宣言します。


それとテキストボックスが空白かどうかの判断をします。
IF文を追加しました。しかしまだ問題があります。
テキストに数字以外が入力された時はエラーになりそうですが...ここまででテストしてみて下さい。

Dim Maisuu(8) ,IngGoukei as Long

For i = 0 To 8
'テキストボックスが空白でない場合
If Len(txtKinsyu(i).Text)>0 then
Maisuu(i) = Val(txtKinsyu(i).Text)
Else
Maisuu(i)=0
End If
Next i

lngGoukei = Maisuu(0) * 10000 + Maisuu(1) * 5000 + Maisuu(2) * 1000 _
+ Maisuu(3) * 500 + Maisuu(4) * 100 + Maisuu(5) * 50 _
+ Maisuu(6) * 10 + Maisuu(7) * 5 + Maisuu(8) * 1

lblGoukei.Caption = lngGoukei
    • good
    • 0

これでいかがでしょうか? No.3 の laputart さんとほとんど同じです。



Dim i as Long, Maisuu(8) as Currency

For i = 0 To 8
 If IsNumeric(txtKinsyu(i).Text) Then
  Maisuu(i) = CCur(txtKinsyu(i).Text)
 Else
  Maisuu(i) = 0
 End If
Next

lblGoukei.Caption = CStr(Maisuu(0) * 10000 + Maisuu(1) * 5000 + ... + Maisuu(8) * 1)

最後の部分は省略させていただきました。
chieri23 さんが書かれていたものと同じコードです。

・オーバーフローは、Currency 型で宣言することで、とりあえず回避しています。もっと大きな金額の場合は、工夫がいります。
・データ型が違うというのは、空欄は数字ではないので、Val 関数で数値変換できないためのエラーです。IsNumeric 関数で回避しています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ちなみに私は数値以外の入力を避けるため、Keypressで次のように制限をかけました。

***********************************
If str >= "0" And str <= "9" Then
'数字の場合は何もしない
ElseIf str = Chr(8) then
'[BackSpace]がおされたときも何もしない
Else
KeyAscii = 0
'文字を無効にする
************************************

お礼日時:2003/05/12 19:14

課題か何かですか?



lngGoukeiは変数名からLong型と判断しましたが、Maisuu(i)は何型の配列
なのでしょうか?どっちにしろ lngGoukeiを振り切る値(Helpにてご自分で
上限を調べて下さい)が入った場合はオーバーフローします。

ちなみに3つ目の問題は空白かどうかチェックすればいいのでは?
    • good
    • 0
この回答へのお礼

そうですね・・・
課題ってほどでもないのですが。
問題はlong型で解決しました。
空白の問題はゴチャゴチャソースを直している間に何事もないように解決してしまったのです。
解決後のソースを参考までに載せておきます。
でも、何で解決したんでしょう・・・
これじゃあ勉強にならないですよね。
***********************************
'入力処理
For i = 0 To 8
lngMaisuu(i) = Val(txtKinsyu(i).Text)
Next i

lngGoukei = lngMaisuu(0) * 10000 + lngMaisuu(1) * 5000 + lngMaisuu(2) * 1000 _
+ lngMaisuu(3) * 500 + lngMaisuu(4) * 100 + lngMaisuu(5) * 50 _
+ lngMaisuu(6) * 10 + lngMaisuu(7) * 5 + lngMaisuu(8) * 1

'後始末処理

lblGoukei.Caption = lngGoukei

お礼日時:2003/05/12 19:11

ただ単に、インテジャー、ロングの範囲を超えているということじゃないのでしょうか?


もう一つ、大きな型で宣言してみたらいかがでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます!!
オーバーフローの問題はmaisuuをlong型にすることで解決しました!!

お礼日時:2003/05/12 19:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています