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
・
・
・
それじゃーコンパイル通るわけないんだけどな。。。
テキストボックスが非表示になってるとその様なエラー出ますけどね。
If (Text1(ix).Text = "") And (Text1(ix).Visible = True) Then
こうしてみるとか。
ねろさん、早速お返事ありがとうございます。
やってみたのですが、やはりエラーおきてしまいました。
テキストボックスに制御をかけてはいないんですが・・・。
よろしければ、コンパイルの通らない理由を教えていただけませんか??
Text1がコントロール配列なら
>Text1.text = ""
とは書けないし、コントロール配列じゃないなら
Text1(ix).SetFocus
とは書けない
0123さん、ありがとうございます。
コントロール配列なんです。
入力ミスです(質問してるのにごめんなさい!!)
ソース上では、きちんと配列で記述していました・・・。
どっかテキストボックスのEnabledがFalseになってないですか?
SetFocus出来ないTextにSetFocusしようとしてません?
他の処理で、TextのEnabledやVisibleをFalseにしたりしてません?
あいうえおにぎりさん、返信ありがとうございます。
テキストボックス確認してみました。
動作環境では同じ操作はできるんです。
exe実行時におきてしまうので、頭を悩ませています。
On Error GoTo err
Text1(ix).SetFocus
On Error GoTo 0
..
..
Exit Function
err:
MsgBox ("TextBox" & ix & " にエラーが起きたよ")
等として、どのテキストボックスでエラーが起きるか調べてみて下さい。
MsgBox "○○入力して下さい。", vbOKOnly + vbInformation, App.Title
Text1(ix).SetFocus
と順番を入れ替えてみてください
そもそもコンパイルは通っているんだよね
EXEができているんだから
・そのEXEを動かすマシンと、開発したマシンの差とか
・実行時エラー出た時になぜその部分だと見当がついたのかとか
・そもそもOn Errorトラップはいらないのかとか・・・
コントロール以前に考える問題もある気がするんですけど
あとixはきちんと変数宣言はしていますよね?
それとEnd Ifが見当たらないのは入力ミスですよね
(それがなけりゃEXEすらつくれねぇからな・・・)
あとバグとは関係ないが、一応Next ixを記述するとか
エラートラップの確認・・・
ねろさんとかぶった・・・藁
もしかしてこれに該当していませんか?
http://support.microsoft.com/default.aspx?scid=kb;ja;JP811469
可能性は無きにしも非ずだが
2000でも発生するのかなぁ?確認はしてないけど
>>葉月αさん
>・実行時エラー出た時になぜその部分だと見当がついたのかとか
すごくいい質問ですね。
>>ひろさん 2000では発生してません、私の環境では。(^^
でも面倒だから、
Text1(ix).Visible = True
Text1(ix).Enabled = True
DoEvents
Text1(ix).SetFocus
全部やってみて、これでだめなら。。orz
みなさん、ありがとうございます。
ねろさん、葉月αさん
実行ファイルでのみエラーだったので、
Msgbox等でメッセージを確認しつつ、順を追いながら特定しました。
あいうえおにぎりさん
実は、その方法だとエラーは出なくなるんですが
他の不具合が出てしまうんです・・・。
ひろさん
そこのサイトが気になりました
が、自分の未熟さの方が・・・とも。
-------
葉月αさん
・開発マシン、実行マシンとも同じ現象が起きていて・・・。
・エラートラップにもつかまらない(書き方が悪いのかもしれません)
・ixはByteで宣言しています
ねろさん
やってみました。
だめでしたー。
ixはByteより
LongやIntegerの方がいい気もする
たぶんソースはまだ続くのだろうけど、その部分だけ抜き取って
Public Function を Private Sub で試してみるとか
それでもしも問題ないと、PublicもしくはFunctionの宣言等に問題があるかも
もし If Text1.text = "" then
がIf Text1(ix).Text = "" Then だとすると
なぜIfの中で Text1(ix).Text = "" とやってるのでしょうか。
質問で貼り付けたコードと実際のコードはかなり違っているのでは。
コードのエラーとは関係ない部分を少しずつ削って、宣言も入れた最小の
エラーの出るコードそのものを提示できませんか。
エラーの場所の特定のためにこういう事を試した方が良いかもしれません。
実行時エラー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
ひろさんのエラートラップのメッセージボックスに
ixも表示しておくとなおよろし
どのコントロール配列かも判断できるね♪
みなさん、ありがとうございます。
今朝からいろいろやってはいるのですが・・・。
まだ解決できません・・・。
昨日の葉月αさんの指摘により・・・。
コントロールの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
実はエラートラップは試していて・・・。
←通過後に終了してしまいます。
すみません、ソースの下から2行目のEnd ifは間違いです。
>実はエラートラップは試していて・・・。
>←通過後に終了してしまいます。
不思議なコメントが出てきましたね・・・
これはエラーハンドラを通過して終了しているということなのか?
だとしたら落ちてる所ここじゃないんじゃない?
エラートラップされていたらEXEは落ちないはずだし・・・
そもそも、ひろさんのエラー確認したらどのように表示されるのか教えてください
なんか本末転倒な質問に回答している気がしなくも無いので・・・
>If gflg = False And ix = 8 Then
まずこの条件がありえないと思いません?
…っつか更に…だけど、
> If Text(ix).Text = "" Or Text(ix).Text = 0 Then
> Text(ix).SetFocus ←ここ
Text(ix).Text = 0 なんてしたら数値に変換できない文字列が
入ってた時点で型変換エラーが起こるね。
エラーを再現できる最小限のコードを、バグを十分に取って掲載して
下さい。関係ないかもしれないバグ満載じゃ原因追求なんてできません。
…結局、ソースコードが汚いってのが原因じゃないの?
そのSetFocusを省いたらちゃんと動作する?
みなさん、ありがとうございます。
> 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を省いたら動作しました。
あと、エラートラップについてなんですが・・・。
書き方が悪いせいかもしれません。
エラートラップを通ることができないんです。
>書き方が悪いせいかもしれません。
今はどんな風に書いてるの?
途中で送信してしまった。
え〜と、
エラーとラップはひろさんのサンプルにあるような書き方と違うの?
じゃぁとりあえず
Text1(ix).Visible = True
Text1(ix).SetFocus
ってしてみたら?
Text() ってエラー出ないの?
やったことないけど
>あと、エラートラップについてなんですが・・・。
>書き方が悪いせいかもしれません。
結局エラーはそこで発生してないということです
ロジック的な修正点も何箇所かぱっと見でありますし
この切り抜いてくれた部分だけ見ると
フラグ変数はいらないと思われる
もう一つ確認したいことは、変数の宣言の強制を行っているか
ソース1行目に
Option Explicitが記述されているかということ
同一マシンでVBのIDE上だと動いて、EXEにすると動かないというのは経験が無いので
ステップ実行当の時には実行されていないイベントなどがあるんじゃないでしょうか?
どうも提示してくれた部分が悪いのか?というと
バグは潜んではいそうですが・・・落ちてるのはやはり別の場所ではないでしょうか?
近隣の関数やイベントにもエラートラップをくっつけて
実行ファイルを作ってみる方がいいと思います
そもそもエラートラップの書き方の悪い?アプリは
私がユーザーならば使用を拒否したい所です!
何度もご迷惑かけます。
返事が遅くなってすみません。
エラートラップが2重になってしまうため、現在の書き方が悪いと・・・。
(記述内容はほぼ同じです)
いろいろ試してみたのですが、うまくいきませんでした。
現在のこのイベントを
ファンクションキーを割り当てて動作させています。
コマンドボタンクリック時は「実行時エラー」はおきないんです。
Form_Load時にKCheckに飛んでいるなんて事はありませんか?
>黒影さん
>かんぺん 2005/06/16(木) 15:39:46
>SetFocus出来ないTextにSetFocusしようとしてません?
>他の処理で、TextのEnabledやVisibleをFalseにしたりしてません?
で既に確認すみかと
>いなさん
>SetFocus出来ないTextにSetFocusしようとしてません?
>他の処理で、TextのEnabledやVisibleをFalseにしたりしてません?
そうですね。失礼しました。m(__)m
気になるところは...
>ロディ 2005/06/16(木) 16:56:22
>実は、その方法だとエラーは出なくなるんですが
>他の不具合が出てしまうんです・・・。
どんな不具合が出るのでしょう?
レスが多くて全部読んでないので申し訳ありあません。
チェック()を呼び出すタイミングはどのタイミングですか?
FORM_LOAD時に通っていませんか?
確認してみてください。
返事が遅くなって申し訳ありません。
ファンクションキーイベントとボタンクリックイベントで
まったく同じソースを通過するのに、片方だけエラー。
なので、正常に動作している部分もあり、
修正するのも悩んでいました。
ファンクションキーイベント時のみフラグを追加し、
処理を制限するということで解決しました。
それってもしかして
フォーカスをボタンとかそういうところに当てて置いて
ファンクションキーで実行したら普通にうまく動いたりするロジックだったりして
単純にステップ実行だと表面化されないエラーな気も
(実はKEYPRESSだけじゃなくKEYDOWNやKEYUPその他のイベントが連動して動いているとか・・・)
まっフラグつけて解決ならめでたしめでたしなのかな
ツイート | ![]() |