• ベストアンサー

テキストボックスに記述した数値を加算させたい

コントロール配列にしたテキストボックスに数値を入力し、その数値に金種(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 ***********************************************

noname#47454
noname#47454

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

  • ベストアンサー
  • laputart
  • ベストアンサー率34% (288/843)
回答No.3

この場合 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

その他の回答 (3)

  • clavia
  • ベストアンサー率50% (5/10)
回答No.4

これでいかがでしょうか? 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 関数で回避しています。

noname#47454
質問者

お礼

ありがとうございます。 ちなみに私は数値以外の入力を避けるため、Keypressで次のように制限をかけました。 *********************************** If str >= "0" And str <= "9" Then '数字の場合は何もしない ElseIf str = Chr(8) then '[BackSpace]がおされたときも何もしない Else KeyAscii = 0 '文字を無効にする ************************************

  • teiou68k
  • ベストアンサー率28% (202/721)
回答No.2

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

noname#47454
質問者

お礼

そうですね・・・ 課題ってほどでもないのですが。 問題は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

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

ただ単に、インテジャー、ロングの範囲を超えているということじゃないのでしょうか? もう一つ、大きな型で宣言してみたらいかがでしょうか?

noname#47454
質問者

お礼

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

関連するQ&A

  • テキストボックスの数値を3桁ごとに区切りたい。

    テキストボックスの数値を3桁ごとに区切りたい。 エクセルのユーザーフォームにテキストボックスを1~7まで並べています。 テキストボックス1~6の合計を7に入れるようにしています。 テキストボックスに記入するVBAは以下のように投入しています。 合計は上手く表示されるのですが、3桁ごとに「,」の区切りを入れたいと思っています。 どのように記述したらよいのか、教えていただけないでしょうか。 -------------------------------------- Private Sub TextBox1_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox2_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox3_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox4_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox5_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox6_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub -------------------------------------- #次の文字を書くテキストボックスの情報に加えてみましたが、 合計が狂ってうまくいきませんでした。 TextBox1.Text = Format(TextBox1.Value, "#,##0") TextBox7.Text = Format(TextBox7.Value, "#,##0")

  • VBA 空白テキストボックスカウント

    こんにちは、よろしくお願いします。 ユーザーフォーム上にテキストボックスが 1-31が4段あります。 1-31には数字が入っているところもあれば、空白の所もあります。 このなかの数字が入っているテキストボックスの数をカウント したいのですがうまくいきません。 自分なりにやってみたこと テキストボックスの空白を数えて Dim i As Integer For i = 1 To 31 If Controls("TextBox" & i).Value = "" Then s_su.Text = Exit Sub s_suはカウントされた数字を表示するテキストボックスです。 上の式の =の右側に何を書いたらいいかがわかりません。 純粋に空白のテキストボックスを数えることは可能でしょうか。 また上記のテキストボックスを1-31数字の合計を別のテキストボックスに 表示しようと思いますが、 val(TextBox1.Text) + val(TextBox2.Text)~これを31回書いてますが もっとスマートに書けるようなコードはありますか。

  • VBA 整数加算の方法

    初歩的なことだとは思いますがエクセルVBAで ラベル1にテキストボックス1~40までの 総数(整数)を加算する時はLabel1=Val(Textbox1)+val(Textbox2)+・・・ +Val(Textbox40)とゆうふうに並べるのではなく簡単に する方法を教えていただきたいのですが?

  • VB6 テキストボックスの数値をコンボボックスに反映させるには?

    TextBoxのChangeイベントを使って、 テキストボックスの数値をコンボボックスに反映させる (具体的には数値をコンボボックスのindex数にし、それぞれのindexに アニメ+str(i)としたいです。 しかし、後で書くソースは何故か、コンボボックスが アニメ1 アニメ0 アニメ1 アニメ2 アニメ3 … となってしまいます。 これを アニメ0 アニメ1 アニメ2 アニメ3 … としたいです。どうすればいいんでしょうか? Private Sub Text8_Change() Static p As Integer If Text8.Text = "" Then Exit Sub For i = 0 To p If p = 0 Then GoTo b If Form6.Combo1.NewIndex = -1 Then GoTo b Form6.Combo1.RemoveItem (i) Next i b: For i = 0 To Val(Text8.Text) Form6.Combo1.AddItem "アニメ" + str(i) Next i p = Val(Text8.Text) End Sub

  • 数値型のテキストボックスを文字型に変えたい

    環境:XP&ACCESS2003 数値型のコントロールソースを持つテキストボックスがあります。このテキストボックスに、例えば「8+7」と入力するために、文字型に変換したいのですが。 *このコントロールソースの更新後処理に Me!テキスト0 = Eval(テキスト0) と記述しています。 数値型なので、「数値型の為入力できません」旨のエラーが出てしまいます。

  • テキストボックスをクリックしてラベルを移動

    現在Excel2000を使用しています。 ユーザーフォームにリストボックスを貼り付け、その中に縦に150個ほどテキストボックスが貼り付けてあります。そのテキストボックスの一番上のひとつだけを囲むようにして、ラベルを設置してあります。(ラベルのCaptionは""、ボーダーカラーは赤色でテキストボックスが選択されてるように見せています。)  そこで、テキストボックスをクリックしたらそのテキストボックスの高さ(Top)に合わせてラベルが移動するようにしたいのですがどうしたらよろしいでしょうか?  よろしくお願いします。

  • VBAでコントロール配列を持つことは可能ですか?

    Excel2002、OSはXPです。 VBではコントロールに配列を持つことが出来ましたが、 VBAでコントロール配列を持つことは可能でしょうか? やりたいことはユーザーフォームにラベルを100個ぐらい貼り付けて、 テキストボックス入力した値がCell(i,1)と等しければ、 i番目のラベルのCaptionに文字を入力したい。という感じです。 もしVBのようにコントロール配列を持てれば、 If TextBox1.text=Cells(i,1) Then Label(i).Caption="~~" という風に出来るのですが、どうも配列の設定がVBのようにできません。 プロパティにINDEXが無いですし、オブジェクト名を同じにしたら エラーとなってしまいますし。。 もし出来ないのであれば、何か回避策のようなものはないでしょうか? 力技で100個IFを書けば出来ることは出来るのですが・・ If TextBox1.text=Cells(i,1) Then If i = 1 Then Label1.Caption="~~" ElseIf i=2 then Label2.Caption="~~" ・・・・

  • Excel VBA テキストボックス内の数値をソートさせるのには?

    VBA初心者です。自分なりに本やネットで調べたのですが、 答えが見つからなかったので質問させていただきます。 フォーム内にある1つのテキストボックスに5桁の数値を入力し、 ボタンを押すことで、入力した数値をソートさせ、シート(A1)に追加入力させたい。 テキストボックス→(数値入力)→ボタンを押す→(ソート)→シート[A1]に入力 テキストボックス→91375→ボタンを押す→13579→シート[A1]=13579 自分の考えでは、入力された5桁の数値を1桁ずつ配列に格納出来れば ソートが可能だと思うのですが、方法が分かりません。 またその場合、ソート後に1桁ずつ別々に格納した数値を ソートさせた5桁の数値にする場合はどのようにしたら良いのでしょうか? また、この考え方以外にも何か方法がありましたらご教授ください

  • 複数コントロールテキストの同一セルへの入力

    はじめまして。 エクセルVBAについて質問させて頂きます。 ユーザーフォームにラベル・テキストボックスそれぞれ1~6があって ラベルのキャプションとテキストボックスのテキストをセル同一セルに 入力したくて With UserForm1 Range("A1") = .Label1.Caption & .TextBox1.Text & .Label2.Caption & .TextBox2.Text _ & .Label3.Caption & .TextBox3.Text & .Label4.Caption & .TextBox4.Text _ & .Label5.Caption & .TextBox5.Text & .Label6.Caption & .TextBox6.Text End With と、このように記述したのでが、これをもっと簡潔に書く方法はございませんでしょうか? ご教授よろしくお願いします。

  • テキストボックスのname

    超初心者です。 VBスクリプトなんですが、すいません、質問させてください 。 テキストボックスに入力した値をFORM POSTで違うASPファイルに送りたいのですが テキストボックスのnameを配列にすることは可能でしょうか? 現在それで困っていまして、ここの力をお借りしたく存じます。 Dim A(i)  Dim B Response.Write "<INPUT type=""text"" name=""" & A(i) & """>" B = Request.Form(A(i)) のようにしてもBに値が入ってこず 「関数の入力として文字列が必要です」 というエラーがでてしまいます。 色々調べてみましたがいまいちわかりません。 どなたかご教授よろしくお願いします

専門家に質問してみよう