• ベストアンサー

エクセルVBAについて

エクセルVBAでプログラミングしたのですが、 どんなデータ型を使っても「オーバーフロー」 してしまいます。 重すぎるのでしょうか? 重すぎるとしたら、VBAの場合、許容範囲は どれくらいになるのでしょうか? お願いします。

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

  • ベストアンサー
回答No.7

>この作業を実行すると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の値を変えても問題が無いのかも・・? でも何となく邪道って言われそう・・・・・・・。 が、たぶん私ならそれで回避できるならやるかな。 けどまずはオーバーフローの原因解明が先ですね。

na714
質問者

お礼

丁寧な指導ありがとうございました。 いろいろ試してみて、やはりテキストボックス内の数値を最終的にクリアする行為をやめてみることにしました。(自分でも本意ではないのですが、妥協しちゃいました。) 現時点でエラーが起きない唯一の方法なようなので・・・。 まだ、学習しはじめた初心者なので今回の件でも大変勉強になりました。 また機会がありましたら、指導お願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

>コマンドボタンの処理は最終で、押されるとtextbox6、textbox16の値はクリアさせています。 クリアしちゃったらまずいっすよね。 えっと、2方向からごちゃごちゃ言うと混乱すると思うので、私は、抜けます。 pen pen pen氏がんばれ~

na714
質問者

お礼

ご指導ありがとうございました。 いろいろと勉強になりました。 また機会がありましたらお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
回答No.6

>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をそれぞれ独立して試してみて下さい。 何か変わりましたか?

na714
質問者

補足

丁寧な指導ありがとうございます。 >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)
回答No.5

>Ahlebelの値は最大で650くらいまでで、Aoneの値は1250くらいまでです。 その値では、オーバーフローは起こしません。 オーバーフローになった”とき”の値を教えてください。 オーバーフローであって Oで割り算したというエラーではないのですよね? >しかし、コマンドボタンで決定をすると、「オーバーフロー」となります。 コマンドボタンで決定の意味が良くわかりません。 オーバーフローは、 textbox6._change() で起こっているんですよね? コマンドボタンでの処理で textbox6の値を変更したりしていませんか?

na714
質問者

補足

再度の回答ありがとうございます。 >オーバーフローになった”とき”の値を教えてください。 Ahlebelの値が596 Aoneの値が1194 です。 >Oで割り算したというエラーではないのですよね? オーバーフローです。 >コマンドボタンで決定の意味が良くわかりません。 このプログラムは、今回の問題箇所とは別にイベントが数個あります。全体の内容は、各項目のテキストボックスに(約16項目)数値を入力し、全項目が入力し終わった時点でコマンドボタン(決定)を押すと指定されたワークシートの各セルへ自動的に入力できるといったプログラムです。 >textbox6._change() >で起こっているんですよね? >コマンドボタンでの処理で >textbox6の値を変更したりしていませんか? はい、textbox6._change()でおこってます。 コマンドボタンの処理は最終で、押されるとtextbox6、textbox16の値はクリアさせています。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>DtyA=Ahlebel/ Aone*100 >部分がデバックによりオーバーフローとなります。 オーバーフローになったときの AhlebelとAoneの値を教えて下さい。 式は 100*Ahlebel/ Aone になってたりはしませんよね

na714
質問者

補足

ご回答ありがとうございます。 Ahlebelの値は最大で650くらいまでで、Aoneの値は1250くらいまでです。 いずれも正の数(+)のみです。 >100*Ahlebel/ Aone >になってたりはしませんよね は間違いはないようです。 お願い致します。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

う~ん。できてしまいました。 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") はちゃんと全部半角ですか?

na714
質問者

補足

ご回答ありがとうございます。 挿入する値は、TextBox5.Textは最大でも650くらいで、TextBox6.Textは最大で1250くらいまでです。 TextBox16には計算の結果はきちんと表示されています。しかし、コマンドボタンで決定をすると、「オーバーフロー」となります。 このプログラムには、他にもいろんな項目があり、そこに入力した値を、ワークシートの指定したセルに入力していくという形です。 この部分だけではなく、他のイベントから影響を 受けるということはあるのでしょうか? 初歩的な質問ですが、各イベントは独立なのでしょうか? 申し訳ありませんが、再度お願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

エクセル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

na714
質問者

補足

ご回答ありがとうございます。 試したのは、整数型 (Integer)、長整数型 (Long)、単精度浮動小数点数型 (Single) 、倍精度浮動小数点数型 (Double)、です。 このどれをあてはめてみても「オーバーフロー」でした。 再度、検討お願い致します。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

どんな値を入れたんですか? 今のところ試したデータ型は何ですか? ループの中で増加する値だったりしますか? 参考URLにデータ型とその範囲が書いてあります。

参考URL:
http://www.gj.il24.net/~nakasima/prog/datatype.htm#VB
na714
質問者

補足

早速のご回答ありがとうございます。 一応、プログラムの内容を追加します。 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」 部分がデバックによりオーバーフローとなります。 再回答お願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセル VBAにおける平均計算につきまして

    エクセルにおけるVBAの平均計算に対するプログラミングについて教えてください。 内容としては、 ある列に対して(ここではA列とします)数値が入力されており、 その入力されている範囲は毎回入力する度、入力範囲がまちまちになっているとします。 その「まちまちな入力範囲に対して」平均値をVBAにて求めたい場合、 Averageにて範囲指定を入力する際に、どのようにプログラミングすればよろしいのでしょうか? ※具体的にはA列の「数値が入力されているアクティブなセル」を指定したいのですか、どうすればよいでしょうか? 回答をお願い致します。

  • Excel VBAについて

    プログラミング初心者です。 Excelのデータを、VBAをつかって、テキストファイルにおとすよう指示されました。しかし、いまいちやり方がわかりません。 いろいろサイトを調べてみましたがよくわからなかったです。 どういうふうにコード入力していけばいいのでしょうか? ご存知のかた教えてください。 基本的な構文はわかりますのでサンプルを教えていただきたいです。 また、わかりやすい参照URLがあればそれでも結構です。

  • excelのvbaって?

    エクセルのvbaって何をするためにあるのですか? 昔あったプログラミング言語のbasicと何が違うのでしょう? どなたか簡単なコメントを下さい。 どうぞよろしくお願いいたします。

  • エクセルVBAで16の16乗を正確にさせるには?

    エクセルVBAにて16の16乗を取り扱いたいのですが.... データ型が、LongとCurrencyでは、オーバーフローしてしまいます。 そこで、SingleとDuobleですると   Singelでは、1.844674E+19   Doubleでは、1.84467440737096E+19 になります。 これを、正確に18446744073709551616とさせる方法を教示ください。 Dim Dec_data As Double Dec_data = 16 ^ 16 MsgBox Dec_data

  • エクセルVBA 一番端のセルの求め方について

    エクセル2003VBAを使ったプログラミングをしています。 シートにデータが入っていますが途中入っていないセルが多々ある状況です。 このような場合、 1.データの入っている一番したの行の行番号を取り出す方法 2.ある行で一番右側でデータの入っているセルの位置を取り出す方法 はありますでしょうか? データが続いている(空の行等がない)場合は Range("A1").CurrentRegion.rows.Count で出せることはわかっているのですが、違う表のようにデータがあちこちにあるという状況です。 何かいい方法がありましたら教えてください。 よろしくお願いいたします。

  • EXCELのVBAについて

    エクセルでVBAを使う場合に、変数や関数名に日本語を使うことが出来るみたいであまり知らなかったのですが、これは正式に使ってよい物なのでしょうか。わかる範囲で本などを調べてもこのことに触れてない(気が付かないだけかな?)ものですから、もし定義なりルールなりがあるようでしたら教えてください。

  • Excel VBAにてFFT

    Excel VBAにておよそ5万点のデータをFFTする方法についての質問をさせてください。 いつもはあるソフトを用いて実験データのFFTを行っているのですが、作業効率を改善したいと考えExcel VBAにてFFTをしたいと考えています。 私はC言語を少しですが学習したことがあるので、FFTWのようなFFT を実装したフリーソフトウェアが存在しているのを知っています。 時間節約のためExcel VBAにてFFTのコードを位置から書くのではなく、FFTWのアルゴリズムでExcel VBAで利用できるプログラムを使いたいと考えています。 この場合、自分でFFTWのコードを見ながらExcel VBA用にコードを書きかえるしか手はないのでしょうか。私はC言語もExcel VBAも未熟であるため、この作業を行うことができそうにありません、、、 Excel VBAで利用することのできるFFTのコードはあるのでしょうか。 なお、FFTするためのデータ点数は約5万点、多いと10万点ほどで、データ点数が2の累乗に限定しないものを使いたいと考えています。

  • エクセル(VBA)について

    現在契約社員でデータ入力をしています。 同じ会社に5年程勤めているのですが、 業務内容はシステムの人が作ったデータベースに、私がエクセル上で 入力し、その後はアクセスを使いそのデータを社員の人が管理するという内容です。 今更ですが、私は入力のみで全くエクセルを使えないので VBAやプログラミングについても勉強したいと思いました。 我流で勉強した方も多いようですが、簡単にマスター出来るものなのでしょうか? 専門学校等に通うべきなのでしょうか? ちなみに私は理系の頭ではなく文系です・・・。 本屋さんでもテキストを探したのですが、とても種類が多く どれがいいのか全く分からないので、お勧めの本等もありましたら教えてください。 よろしくお願いします。

  • Excel Vba でデータの範囲を知るには?

    Excelを使用していますが、マクロ(VBA)で、シートのデータの範囲を知るにはどうすればよいのでしょうか。  印刷プレビューを行うと、自動的にページ数が求めらていますが、これは、シートのデータの範囲(列及び行の最大値)を判別しているからできるのだと思います。  これを、VBAで行、及び列のMAX値を取得したいのですが、そのメソッド(プロパティ)を知りたいのです。  どなたかご教授ください。

  • Excel VBAでファイルの制御をしたい

    今、Excel VBAでファイル操作の制御スクリプトをくみたくて 悩んでおります。。 "test.xls"ファイルというエクセルの共有ファイルがあります。 そのファイルは日々様々なユーザーがデータを書き込みます。 この共有ファイルに対し、誰か一人がこのファイルを開いている際に 違う誰かがファイルを開こうとした場合に、警告メッセージを表示した後、強制的にファイルを閉じるというプログラムを組みたいのですが・・。 何せ、VBAでのプログラミングはまったくの初心者の為、 悪戦苦闘しております。 どなたか、良いアドバイスを頂けたら嬉しいです。 是非、宜しくお願い致します。