- ベストアンサー
エクセルVBAについて
エクセルVBAでプログラミングしたのですが、 どんなデータ型を使っても「オーバーフロー」 してしまいます。 重すぎるのでしょうか? 重すぎるとしたら、VBAの場合、許容範囲は どれくらいになるのでしょうか? お願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>この作業を実行するとTextBox6に1文字(数字1桁)を入力するとプログラムの実行が中止になり、TextBox16の計算が実行されず、計算結果を確認できませんが・・・。 そうです。なので、「コマンドボタンを押す前に」と前置きしてみました。 まずは普通に実行。TextBox6に入力して、TextBox16に結果が表示されますよね? それまではいいんです。 いざコマンドボタンを押そうという直前に、ブレークポイントを入れて下さい。 それから、また実行してるフォームに戻ってコマンドボタンを押せばそこで止まります。 それで値を確認してください。ウォッチウィンドウに変数をドラッグするとか。変数の上にマウスを持ってくと見れるかもしれません。 次に、お願い事項Cの話。TextBox6_Changeに、 ~省略~ Aone = Val(TextBox6.Text) If Aone <= 0 Then Exit Sub '☆これを追加 DtyA = Ahlebel / Aone * 100 ~省略~ こんな感じで☆部分を一行追加して実行してください。 お願いしたA,Bの結果からするとコマンドボタン以外にもTextBox6を書き換えるイベントがあるようですね。 各お願いの目的は・・・ Aは、一連のクリア操作を一切やめているのでTextBox6を書き換える処理が無くなる。つまりTextBox6_Changeを実行しないので、オーバーフローは起きません。 BはTextBox6を操作してるイベントがコマンドボタンの他に無ければ、オーバーフローは起きないハズだったのです。 でも起きたので、どこかで書き換えていると思われます。その処理が問題というか、要因みたいですね。どこでどう書き換えてるのか調べて下さい。 イベントは、ユーザーがキーボードなどで入力する場合以外にもコードで TextBox6.Text = "" と書いた場合にもChangeイベントが発生します。 つまり、コマンドボタンのイベント中でTextBoxをクリアするという事は、TextBox6_Changeが実行されます。 当然そうするとAoneは0になり0割りが出ると思ったのです。 で、今回はTextBox6をクリアする時ではなく、それ以外のTextBoxをクリアする時にTextBox6を書き換えてるように思われますが、どうですか?その時の値がとんでもなく大きくなってるとか。 か、循環的にイベントがイベントを起こしてまたイベントが・・・ってぐるぐる回って何かがオーバーフロー? (何かってアバウトですね(^^;)) クリアは必要ですよね。とりあえずオーバーフローの原因次第ですけど、 例えばChangeイベントじゃなくてKeyPressイベントに変えれば、ユーザーがキーインした瞬間にしか発生しないからコードでTextBoxの値を変えても問題が無いのかも・・? でも何となく邪道って言われそう・・・・・・・。 が、たぶん私ならそれで回避できるならやるかな。 けどまずはオーバーフローの原因解明が先ですね。
その他の回答 (7)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>コマンドボタンの処理は最終で、押されるとtextbox6、textbox16の値はクリアさせています。 クリアしちゃったらまずいっすよね。 えっと、2方向からごちゃごちゃ言うと混乱すると思うので、私は、抜けます。 pen pen pen氏がんばれ~
お礼
ご指導ありがとうございました。 いろいろと勉強になりました。 また機会がありましたらお願い致します。
- pen_pen_pen
- ベストアンサー率65% (52/79)
>Ahlebelの値が596 >Aoneの値が1194 >です。 は、本当にオーバーフローした瞬間にTextBox6_Changeの中で調べた値ですか? コマンドを実行したときにテキストボックスに入力した値ではないですか? TextBox16に値は表示されてるとの事なので、TextBoxに入力した時点での値に問題があるわけでは無いハズです。 「オーバーフローしました」というメッセージが出る直前のAhlebelとAoneの値が知りたいです。 コマンドボタンを押す前に > DtyA = Ahlebel / Aone * 100 にブレークポイントを入れて、コマンドボタンを押下。 するとこの行で止まるのでAhlebel、Aoneの値を見て下さい。 確認後にF8を押したら「オーバーフローしました」が出ればそれが知りたい値です。また教えて下さい。 コマンドボタンでTextBox6とTextBox16をクリアすると、0割りなら起きますが、オーバーフローは起きませんでした。 試していただきたいのが、2つ。 A.コマンドボタンでのクリアをやめてみる。TextBox6以外も全部。 B.コマンドボタンでのクリアをやめてみる。TextBox6だけ。 C.TextBox6_Changeで、Aoneの値が0ならExit Sub。 Cは変数で割る時は当然入れるべき処理だと思います。 というか、クリアすればAoneは0なので、入れないとコマンドボタン押したら確実にエラーになりますよね。 AとBとCをそれぞれ独立して試してみて下さい。 何か変わりましたか?
補足
丁寧な指導ありがとうございます。 >DtyA = Ahlebel / Aone * 100 >にブレークポイントを入れて、コマンドボタンを押>下。 >するとこの行で止まるのでAhlebel、Aoneの値を見て>下さい。 >確認後にF8を押したら「オーバーフローしました」>が出ればそれが知りたい値です この作業を実行するとTextBox6に1文字(数字1桁)を入力するとプログラムの実行が中止になり、TextBox16の計算が実行されず、計算結果を確認できませんが・・・。すいませんが、この作業もう少し詳しく教えていただけないでしょうか? 申し遅れましたが、参考書片手の初心者作業なので専門的になるといまいちまだ実行できないんです。 >A.コマンドボタンでのクリアをやめてみる。TextBox6以外も全部。 >B.コマンドボタンでのクリアをやめてみる。TextBox6だけ。 >C.TextBox6_Changeで、Aoneの値が0ならExit Sub。 A→オーバーフロー、その他のエラーはおきませんでした。 B→オーバーフローがおきます。 C→すいません、詳しいコードをお教え願います。 Aを試したところ、エラーが発生せずプログラムが適切に実行できました。このクリアが関係しているのでしょうか? しかしこの作業は、次のデータの入力に備えて、どうしても入れたい作業なのですが、何かいい案はないでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>Ahlebelの値は最大で650くらいまでで、Aoneの値は1250くらいまでです。 その値では、オーバーフローは起こしません。 オーバーフローになった”とき”の値を教えてください。 オーバーフローであって Oで割り算したというエラーではないのですよね? >しかし、コマンドボタンで決定をすると、「オーバーフロー」となります。 コマンドボタンで決定の意味が良くわかりません。 オーバーフローは、 textbox6._change() で起こっているんですよね? コマンドボタンでの処理で textbox6の値を変更したりしていませんか?
補足
再度の回答ありがとうございます。 >オーバーフローになった”とき”の値を教えてください。 Ahlebelの値が596 Aoneの値が1194 です。 >Oで割り算したというエラーではないのですよね? オーバーフローです。 >コマンドボタンで決定の意味が良くわかりません。 このプログラムは、今回の問題箇所とは別にイベントが数個あります。全体の内容は、各項目のテキストボックスに(約16項目)数値を入力し、全項目が入力し終わった時点でコマンドボタン(決定)を押すと指定されたワークシートの各セルへ自動的に入力できるといったプログラムです。 >textbox6._change() >で起こっているんですよね? >コマンドボタンでの処理で >textbox6の値を変更したりしていませんか? はい、textbox6._change()でおこってます。 コマンドボタンの処理は最終で、押されるとtextbox6、textbox16の値はクリアさせています。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>DtyA=Ahlebel/ Aone*100 >部分がデバックによりオーバーフローとなります。 オーバーフローになったときの AhlebelとAoneの値を教えて下さい。 式は 100*Ahlebel/ Aone になってたりはしませんよね
補足
ご回答ありがとうございます。 Ahlebelの値は最大で650くらいまでで、Aoneの値は1250くらいまでです。 いずれも正の数(+)のみです。 >100*Ahlebel/ Aone >になってたりはしませんよね は間違いはないようです。 お願い致します。
- pen_pen_pen
- ベストアンサー率65% (52/79)
う~ん。できてしまいました。 UserFormにTextBox5とTextBox6とTextBox16の3つのテキストボックスを貼り付け、 TextBox5に数値が入った状態でTextBox6に数値を入力するとその度に TextBox5÷(TextBox6×100)の計算結果がTextBox16に小数点2桁で表示される。 というプログラムなんですよね? > DtyA = Ahlebel / Aone * 100 の前に、 TextBox5.Text、TextBox6.Text、Ahlebel、Aone の値を調べて下さい。 TextBox6の値が数値に変換できなくてAoneが0で0割りになったり、Ahlebelが異常に大きかったりしませんか? あと、一瞬私も間違えましたが TextBox16と書くべきところをTextBox6と書き間違えたりなんて事は無いですよねぇ?ここを書き間違えると大変ですよ。何しても0割りでした。 それから、 > TextBox6.Text = Format(DtyA, "##.00") はちゃんと全部半角ですか?
補足
ご回答ありがとうございます。 挿入する値は、TextBox5.Textは最大でも650くらいで、TextBox6.Textは最大で1250くらいまでです。 TextBox16には計算の結果はきちんと表示されています。しかし、コマンドボタンで決定をすると、「オーバーフロー」となります。 このプログラムには、他にもいろんな項目があり、そこに入力した値を、ワークシートの指定したセルに入力していくという形です。 この部分だけではなく、他のイベントから影響を 受けるということはあるのでしょうか? 初歩的な質問ですが、各イベントは独立なのでしょうか? 申し訳ありませんが、再度お願い致します。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
エクセルVBAで使える主な型の範囲(ヘルプから引用) バイト型 (Byte) 1 バイト 0 ~ 255 ブール型 (Boolean) 2 バイト 真 (True) または偽 (False) 整数型 (Integer) 2 バイト -32,768 ~ 32,767 長整数型 (Long) 4 バイト -2,147,483,648 ~ 2,147,483,647 単精度浮動小数点数型 (Single) 4 バイト -3.402823E38 ~ -1.401298E-45 (負の値)。 1.401298E-45 ~ 3.402823E38 (正の値)。 倍精度浮動小数点数型 (Double) 8 バイト -1.79769313486231E308 ~ -4.94065645841247E-324 (負の値)。 4.94065645841247E-324 ~ 1.79769313486232E308 (正の値)。 通貨型 (Currency) 8 バイト -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
補足
ご回答ありがとうございます。 試したのは、整数型 (Integer)、長整数型 (Long)、単精度浮動小数点数型 (Single) 、倍精度浮動小数点数型 (Double)、です。 このどれをあてはめてみても「オーバーフロー」でした。 再度、検討お願い致します。
- pen_pen_pen
- ベストアンサー率65% (52/79)
どんな値を入れたんですか? 今のところ試したデータ型は何ですか? ループの中で増加する値だったりしますか? 参考URLにデータ型とその範囲が書いてあります。
補足
早速のご回答ありがとうございます。 一応、プログラムの内容を追加します。 Private sub textbox6._change() Dim DtyA As Double Dim Ahlebel As Long Dim Aone As Long Ahlebel=Val(Textbox5.Text) Aone=Val(Textbox6.Text) DtyA=Ahlebel/ Aone*100 Textbox16.Text=DtyA Textbox16.Text= Format(DtyA,”##.00”) End sub の「DtyA=Ahlebel/ Aone*100」 部分がデバックによりオーバーフローとなります。 再回答お願い致します。
お礼
丁寧な指導ありがとうございました。 いろいろ試してみて、やはりテキストボックス内の数値を最終的にクリアする行為をやめてみることにしました。(自分でも本意ではないのですが、妥協しちゃいました。) 現時点でエラーが起きない唯一の方法なようなので・・・。 まだ、学習しはじめた初心者なので今回の件でも大変勉強になりました。 また機会がありましたら、指導お願い致します。