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

解決


ロディ  2005-06-16 14:17:07  No: 122695  IP: [192.*.*.*]

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 14:43:52  No: 122696  IP: [192.*.*.*]

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

編集 削除
ロディ  2005-06-16 15:14:27  No: 122697  IP: [192.*.*.*]

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

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

編集 削除
0123  2005-06-16 15:21:14  No: 122698  IP: [192.*.*.*]

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

編集 削除
ロディ  2005-06-16 15:25:44  No: 122699  IP: [192.*.*.*]

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

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

編集 削除
あいうえおにぎり  2005-06-16 15:26:38  No: 122700  IP: [192.*.*.*]

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

編集 削除
かんぺん  2005-06-16 15:39:46  No: 122701  IP: [192.*.*.*]

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

編集 削除
ロディ  2005-06-16 15:40:06  No: 122702  IP: [192.*.*.*]

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

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

編集 削除
ねろ  2005-06-16 15:55:50  No: 122703  IP: [192.*.*.*]

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

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

編集 削除
あいうえおにぎり  2005-06-16 15:56:30  No: 122704  IP: [192.*.*.*]

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

編集 削除
葉月α  2005-06-16 16:01:08  No: 122705  IP: [192.*.*.*]

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

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

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

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

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

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

編集 削除
葉月α  2005-06-16 16:01:56  No: 122706  IP: [192.*.*.*]

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

編集 削除
ひろ  2005-06-16 16:02:06  No: 122707  IP: [192.*.*.*]

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

編集 削除
葉月α  2005-06-16 16:05:36  No: 122708  IP: [192.*.*.*]

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

編集 削除
ねろ  2005-06-16 16:26:52  No: 122709  IP: [192.*.*.*]

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

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

編集 削除
ロディ  2005-06-16 16:56:22  No: 122710  IP: [192.*.*.*]

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

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

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

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

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

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

編集 削除
葉月  2005-06-16 17:05:16  No: 122711  IP: [192.*.*.*]

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

編集 削除
通ってみた  2005-06-16 20:07:54  No: 122712  IP: [192.*.*.*]

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

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

編集 削除
ねろ  2005-06-16 21:22:22  No: 122713  IP: [192.*.*.*]

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

編集 削除
ひろ  2005-06-17 09:03:24  No: 122714  IP: [192.*.*.*]

エラーの場所の特定のためにこういう事を試した方が良いかもしれません。
実行時エラー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 10:31:30  No: 122715  IP: [192.*.*.*]

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

編集 削除
ロディ  2005-06-17 11:28:32  No: 122716  IP: [192.*.*.*]

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

昨日の葉月αさんの指摘により・・・。
コントロールの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 11:31:38  No: 122717  IP: [192.*.*.*]

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

編集 削除
葉月α  2005-06-17 11:43:47  No: 122718  IP: [192.*.*.*]

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

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

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

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

編集 削除
特攻隊長まるるう  2005-06-17 11:45:13  No: 122719  IP: [192.*.*.*]

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

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

編集 削除
通ってみた  2005-06-17 11:47:42  No: 122720  IP: [192.*.*.*]

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

編集 削除
ロディ  2005-06-17 12:41:58  No: 122721  IP: [192.*.*.*]

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

   >     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 12:50:23  No: 122722  IP: [192.*.*.*]

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

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

編集 削除
いな  2005-06-17 13:58:25  No: 122723  IP: [192.*.*.*]

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

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

編集 削除
いな  2005-06-17 13:59:57  No: 122724  IP: [192.*.*.*]

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

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

編集 削除
通ってみた  2005-06-17 15:04:51  No: 122725  IP: [192.*.*.*]

じゃぁとりあえず

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

ってしてみたら?

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

編集 削除
葉月α  2005-06-17 16:10:06  No: 122726  IP: [192.*.*.*]

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

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

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

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

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

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

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

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

編集 削除
ロディ  2005-06-17 16:11:08  No: 122727  IP: [192.*.*.*]

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

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

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

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

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

編集 削除
黒影  2005-06-17 18:30:17  No: 122728  IP: [192.*.*.*]

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

編集 削除
いな  2005-06-17 19:07:16  No: 122729  IP: [192.*.*.*]

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

で既に確認すみかと

編集 削除
黒影  2005-06-20 09:27:15  No: 122730  IP: [192.*.*.*]

>いなさん

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

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

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

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

編集 削除
あんび  2005-06-20 12:56:42  No: 122731  IP: [192.*.*.*]

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

編集 削除
ロディ  2005-06-29 15:26:33  No: 122732  IP: [192.*.*.*]

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

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

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

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

編集 削除
葉月α  2005-06-29 16:52:31  No: 122733  IP: [192.*.*.*]

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

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

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

編集 削除