実行時エラーを回避するには

解決


ロディ  2005-06-16 23:17:07  No: 122695

Win2000、VB6(SP6)を使用しています。
コンパイルは通るのに、いざ操作をするとランダム(?)に
「実行時エラー  5」というメッセージがでて、exeが落ちてしまします。
どなたかアドバイスをいただけないでしょうか。

--エラー箇所--
Public Function チェック() As Boolean
  For ix = 1 To 8
    If Text1.text = "" then
     Text1(ix).SetFocus
    MsgBox "○○入力して下さい。", vbOKOnly + vbInformation, App.Title
    Text1(ix).Text = ""
    チェック = True
    Exit Function
  Next
  ・
  ・
  ・


ねろ  2005-06-16 23:43:52  No: 122696

それじゃーコンパイル通るわけないんだけどな。。。
テキストボックスが非表示になってるとその様なエラー出ますけどね。
If (Text1(ix).Text = "") And (Text1(ix).Visible = True) Then
こうしてみるとか。


ロディ  2005-06-17 00:14:27  No: 122697

ねろさん、早速お返事ありがとうございます。
やってみたのですが、やはりエラーおきてしまいました。

テキストボックスに制御をかけてはいないんですが・・・。
よろしければ、コンパイルの通らない理由を教えていただけませんか??


0123  2005-06-17 00:21:14  No: 122698

Text1がコントロール配列なら
>Text1.text = "" 
とは書けないし、コントロール配列じゃないなら
Text1(ix).SetFocus
とは書けない


ロディ  2005-06-17 00:25:44  No: 122699

0123さん、ありがとうございます。
コントロール配列なんです。
入力ミスです(質問してるのにごめんなさい!!)

ソース上では、きちんと配列で記述していました・・・。


あいうえおにぎり  2005-06-17 00:26:38  No: 122700

どっかテキストボックスのEnabledがFalseになってないですか?


かんぺん  2005-06-17 00:39:46  No: 122701

SetFocus出来ないTextにSetFocusしようとしてません?
他の処理で、TextのEnabledやVisibleをFalseにしたりしてません?


ロディ  2005-06-17 00:40:06  No: 122702

あいうえおにぎりさん、返信ありがとうございます。
テキストボックス確認してみました。
動作環境では同じ操作はできるんです。

exe実行時におきてしまうので、頭を悩ませています。


ねろ  2005-06-17 00:55:50  No: 122703

On Error GoTo err
Text1(ix).SetFocus
On Error GoTo 0
..
..

Exit Function
err:
    MsgBox ("TextBox" & ix & " にエラーが起きたよ")
等として、どのテキストボックスでエラーが起きるか調べてみて下さい。


あいうえおにぎり  2005-06-17 00:56:30  No: 122704

MsgBox "○○入力して下さい。", vbOKOnly + vbInformation, App.Title
Text1(ix).SetFocus
と順番を入れ替えてみてください


葉月α  2005-06-17 01:01:08  No: 122705

そもそもコンパイルは通っているんだよね
EXEができているんだから

・そのEXEを動かすマシンと、開発したマシンの差とか
・実行時エラー出た時になぜその部分だと見当がついたのかとか
・そもそもOn Errorトラップはいらないのかとか・・・

コントロール以前に考える問題もある気がするんですけど

あとixはきちんと変数宣言はしていますよね?

それとEnd Ifが見当たらないのは入力ミスですよね
(それがなけりゃEXEすらつくれねぇからな・・・)

あとバグとは関係ないが、一応Next ixを記述するとか


葉月α  2005-06-17 01:01:56  No: 122706

エラートラップの確認・・・
ねろさんとかぶった・・・藁


ひろ  2005-06-17 01:02:06  No: 122707

もしかしてこれに該当していませんか?
http://support.microsoft.com/default.aspx?scid=kb;ja;JP811469


葉月α  2005-06-17 01:05:36  No: 122708

可能性は無きにしも非ずだが
2000でも発生するのかなぁ?確認はしてないけど


ねろ  2005-06-17 01:26:52  No: 122709

>>葉月αさん
>・実行時エラー出た時になぜその部分だと見当がついたのかとか
すごくいい質問ですね。

>>ひろさん  2000では発生してません、私の環境では。(^^
でも面倒だから、
Text1(ix).Visible = True
Text1(ix).Enabled = True
DoEvents
Text1(ix).SetFocus
全部やってみて、これでだめなら。。orz


ロディ  2005-06-17 01:56:22  No: 122710

みなさん、ありがとうございます。

ねろさん、葉月αさん
実行ファイルでのみエラーだったので、
Msgbox等でメッセージを確認しつつ、順を追いながら特定しました。

あいうえおにぎりさん
実は、その方法だとエラーは出なくなるんですが
他の不具合が出てしまうんです・・・。

ひろさん
そこのサイトが気になりました
が、自分の未熟さの方が・・・とも。

-------
葉月αさん
・開発マシン、実行マシンとも同じ現象が起きていて・・・。
・エラートラップにもつかまらない(書き方が悪いのかもしれません)
・ixはByteで宣言しています

ねろさん
やってみました。
だめでしたー。


葉月  2005-06-17 02:05:16  No: 122711

ixはByteより
LongやIntegerの方がいい気もする


通ってみた  2005-06-17 05:07:54  No: 122712

たぶんソースはまだ続くのだろうけど、その部分だけ抜き取って
Public Function  を  Private Sub  で試してみるとか

それでもしも問題ないと、PublicもしくはFunctionの宣言等に問題があるかも


ねろ  2005-06-17 06:22:22  No: 122713

もし If Text1.text = "" then
がIf Text1(ix).Text = ""  Then だとすると
なぜIfの中で  Text1(ix).Text = ""  とやってるのでしょうか。
質問で貼り付けたコードと実際のコードはかなり違っているのでは。
コードのエラーとは関係ない部分を少しずつ削って、宣言も入れた最小の
エラーの出るコードそのものを提示できませんか。


ひろ  2005-06-17 18:03:24  No: 122714

エラーの場所の特定のためにこういう事を試した方が良いかもしれません。
実行時エラー5はいろいろな発生要因が多岐にわたっていますから
(非表示オブジェクトへのSetFocusとか、文字列処理関数で負の文字数を指定したとか、いろいろありますから)

Public Function チェック() As Boolean
  On Error Goto ErrorHandler
  Dim stepCount As Integer
  For ix = 1 To 8
    stepCount = 1
    If Text1.text = "" then
     stepCount = 2
     Text1(ix).SetFocus
     stepCount = 3
     MsgBox "○○入力して下さい。", vbOKOnly + vbInformation, App.Title
    stepCount = 4
  Text1(ix).Text = ""
    stepCount = 5
    チェック = True
    Exit Function
  Next


ErrorHandler:
   Msgbox "ErrPos:" & cstr(stepCount) & vbCrLf & _
           "ErrDesc:" & Err.Description
   適当なエラー処理
   Exit Function


葉月α  2005-06-17 19:31:30  No: 122715

ひろさんのエラートラップのメッセージボックスに
ixも表示しておくとなおよろし
どのコントロール配列かも判断できるね♪


ロディ  2005-06-17 20:28:32  No: 122716

みなさん、ありがとうございます。
今朝からいろいろやってはいるのですが・・・。
まだ解決できません・・・。

昨日の葉月αさんの指摘により・・・。
コントロールのIndexはデフォルトはInt型なので
変数をIntに宣言し直してみました。

ねろさん、みなさんへ記述ミス等申し訳ありません。
Public Function KCheck() As Boolean
Dim flg     As Boolean          'フラグ
Dim ix      As Integer          'カウント
  
  gflg = False

   For ix = 1 To 8
     If gflg = False And ix = 8 Then
         ⇒ここで入力チェックを行う(長いので省略)・・・
           入力チェックエラー時の処理↓
             Text(1).SetFocus
             MsgBox "入力", vbOKOnly + vbInformation, App.Title
             KCheck = True
             Exit For
     End If

       If Text(ix).Text = "" Or Text(ix).Text = 0 Then
          Text(ix).SetFocus  ←ここ
          MsgBox "入力", vbOKOnly + vbInformation, App.Title
          Text(ix).Text = ""
          KCheck = True
          Exit Function
       End If  

       gflg = True
     End if
  Next

実はエラートラップは試していて・・・。
←通過後に終了してしまいます。


ロディ  2005-06-17 20:31:38  No: 122717

すみません、ソースの下から2行目のEnd ifは間違いです。


葉月α  2005-06-17 20:43:47  No: 122718

>実はエラートラップは試していて・・・。
>←通過後に終了してしまいます。

不思議なコメントが出てきましたね・・・
これはエラーハンドラを通過して終了しているということなのか?
だとしたら落ちてる所ここじゃないんじゃない?
エラートラップされていたらEXEは落ちないはずだし・・・

そもそも、ひろさんのエラー確認したらどのように表示されるのか教えてください
なんか本末転倒な質問に回答している気がしなくも無いので・・・

>If gflg = False And ix = 8 Then
まずこの条件がありえないと思いません?


特攻隊長まるるう  2005-06-17 20:45:13  No: 122719

…っつか更に…だけど、
>       If Text(ix).Text = "" Or Text(ix).Text = 0 Then
>          Text(ix).SetFocus  ←ここ
Text(ix).Text = 0 なんてしたら数値に変換できない文字列が
入ってた時点で型変換エラーが起こるね。

エラーを再現できる最小限のコードを、バグを十分に取って掲載して
下さい。関係ないかもしれないバグ満載じゃ原因追求なんてできません。
…結局、ソースコードが汚いってのが原因じゃないの?


通ってみた  2005-06-17 20:47:42  No: 122720

そのSetFocusを省いたらちゃんと動作する?


ロディ  2005-06-17 21:41:58  No: 122721

みなさん、ありがとうございます。

   >     If Text(ix).Text = "" Or Text(ix).Text = 0 Then
   >        Text(ix).SetFocus  ←ここ
   >        MsgBox "入力", vbOKOnly + vbInformation, App.Title
   >        Text(ix).Text = ""
   >        KCheck = True
   >        Exit Function
          
           gflg = True  →葉月さんへ、すみません。
   >    End If  
   
  Text(ix).textには数値のみしか入力できないようにチェックをしています。
  ソース見づらくてすみません・・・。  

  setFocusを省いたら動作しました。


ロディ  2005-06-17 21:50:23  No: 122722

あと、エラートラップについてなんですが・・・。
書き方が悪いせいかもしれません。

エラートラップを通ることができないんです。


いな  2005-06-17 22:58:25  No: 122723

>書き方が悪いせいかもしれません。

今はどんな風に書いてるの?


いな  2005-06-17 22:59:57  No: 122724

途中で送信してしまった。

え〜と、
エラーとラップはひろさんのサンプルにあるような書き方と違うの?


通ってみた  2005-06-18 00:04:51  No: 122725

じゃぁとりあえず

Text1(ix).Visible = True
Text1(ix).SetFocus

ってしてみたら?

Text()  ってエラー出ないの?
やったことないけど


葉月α  2005-06-18 01:10:06  No: 122726

>あと、エラートラップについてなんですが・・・。
>書き方が悪いせいかもしれません。

結局エラーはそこで発生してないということです
ロジック的な修正点も何箇所かぱっと見でありますし

この切り抜いてくれた部分だけ見ると
フラグ変数はいらないと思われる

もう一つ確認したいことは、変数の宣言の強制を行っているか
ソース1行目に
Option Explicitが記述されているかということ

同一マシンでVBのIDE上だと動いて、EXEにすると動かないというのは経験が無いので
ステップ実行当の時には実行されていないイベントなどがあるんじゃないでしょうか?

どうも提示してくれた部分が悪いのか?というと
バグは潜んではいそうですが・・・落ちてるのはやはり別の場所ではないでしょうか?

近隣の関数やイベントにもエラートラップをくっつけて
実行ファイルを作ってみる方がいいと思います

そもそもエラートラップの書き方の悪い?アプリは
私がユーザーならば使用を拒否したい所です!


ロディ  2005-06-18 01:11:08  No: 122727

何度もご迷惑かけます。
返事が遅くなってすみません。

エラートラップが2重になってしまうため、現在の書き方が悪いと・・・。
(記述内容はほぼ同じです)

いろいろ試してみたのですが、うまくいきませんでした。

現在のこのイベントを
ファンクションキーを割り当てて動作させています。

コマンドボタンクリック時は「実行時エラー」はおきないんです。


黒影  2005-06-18 03:30:17  No: 122728

Form_Load時にKCheckに飛んでいるなんて事はありませんか?


いな  2005-06-18 04:07:16  No: 122729

>黒影さん
  >かんぺん 2005/06/16(木) 15:39:46
  >SetFocus出来ないTextにSetFocusしようとしてません?
  >他の処理で、TextのEnabledやVisibleをFalseにしたりしてません?

で既に確認すみかと


黒影  2005-06-20 18:27:15  No: 122730

>いなさん

  >SetFocus出来ないTextにSetFocusしようとしてません?
  >他の処理で、TextのEnabledやVisibleをFalseにしたりしてません?

そうですね。失礼しました。m(__)m

気になるところは...
 >ロディ 2005/06/16(木) 16:56:22
 >実は、その方法だとエラーは出なくなるんですが
 >他の不具合が出てしまうんです・・・。

どんな不具合が出るのでしょう?


あんび  2005-06-20 21:56:42  No: 122731

レスが多くて全部読んでないので申し訳ありあません。
チェック()を呼び出すタイミングはどのタイミングですか?
FORM_LOAD時に通っていませんか?
確認してみてください。


ロディ  2005-06-30 00:26:33  No: 122732

返事が遅くなって申し訳ありません。

ファンクションキーイベントとボタンクリックイベントで
まったく同じソースを通過するのに、片方だけエラー。

なので、正常に動作している部分もあり、
修正するのも悩んでいました。

ファンクションキーイベント時のみフラグを追加し、
処理を制限するということで解決しました。


葉月α  2005-06-30 01:52:31  No: 122733

それってもしかして
フォーカスをボタンとかそういうところに当てて置いて
ファンクションキーで実行したら普通にうまく動いたりするロジックだったりして

単純にステップ実行だと表面化されないエラーな気も
(実はKEYPRESSだけじゃなくKEYDOWNやKEYUPその他のイベントが連動して動いているとか・・・)

まっフラグつけて解決ならめでたしめでたしなのかな


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加