[リストへもどる]
一括表示

投稿時間:2004/04/28(Wed) 21:07
投稿者名:太陽K
Eメール:
URL :
タイトル:
Go to Error
はじめまして。太陽Kと申します。
今回エラーについてお聞きしたいのです。
-------------------------------------------------
Appcount = 2
Arrfile(1) = "X:\test.exe"
Arrfile(2) = "X:\test2.exe"
On error goto ErrorA
For i = 1 To AppCount - 1
  If Right(ArrFile(i), 3) = "exe" Then
        Ret = Shell(AppRunName, vbNormalNoFocus)
    Else
        Call RunExe(AppRunName)
    End If
    GoTo Unerror
ErrorA:
MsgBox "指定されたファイル" + vbNewLine + AppRunName + vbNewLine + "が開けませんでした。"
Unerror:
Next
-------------------------------------------------
以上をXドライブが存在しない環境で実行した際にtest.exeのエラーはMsgboxで表示されるのですが、
test2.exeのエラーはGo to分岐を無視して通常のエラー"ファイルが存在しません。"となってしまいます。
なぜでしょうか?もしやGoto条件は一度しか使えないのですか?
教えてください。

投稿時間:2004/04/28(Wed) 21:10
投稿者名:太陽K
Eメール:
URL :
タイトル:
訂正
>> For i = 1 To AppCount - 1
         が
For i = 1 To AppCount
          の
間違いでした。よろしくお願いします。

投稿時間:2004/04/28(Wed) 23:17
投稿者名:ねろ
Eメール:
URL :
タイトル:
Re: Go to Error
MSDNで"On Error ステートメント"をもう一度調べて下さい。
特に"Resume"に関して注意して読んで下さい。

投稿時間:2004/04/29(Thu) 14:16
投稿者名:太陽K
Eメール:
URL :
タイトル:
Re^2: Go to Error
『On Error Resume Next ステートメントは、別のプロシージャが呼び出されるとアクティブでなくなるので、そのルーチン内でインライン エラー処理を行う場合は、呼び出される各ルーチン内で On Error Resume Next ステートメントを実行する必要があります。(引用)』
とのことでしたので以下のように変更しましたがだめでした。
-----------------------------------------------------
(以上略)
For i = 1 To AppCount - 1
   On Error GoTo ErrorB
   AppRunName = Mid(ArrFile(i), 7)
(以下略)
-----------------------------------------------------
勘違いでしょうか?

投稿時間:2004/04/29(Thu) 15:19
投稿者名:Renard
Eメール:
URL :
タイトル:
Re^3: Go to Error
ポイントはここです。

「エラー処理ルーチンがアクティブになっている間 (エラーの発生と Resume、Exit Sub、Exit Function、
または Exit Property ステートメントの間) は、カレント プロシージャのエラー処理ルーチンは
エラーを処理できません。」

投稿時間:2004/04/29(Thu) 18:50
投稿者名:ねろ
Eメール:
URL :
タイトル:
Re^3: Go to Error
簡単に説明すると、エラーが発生しOn Error Goto ErrorHandler 等で
ErrorHandlerに処理が飛んだ時、同じサブルーチンなどで、連続してエラーを処理したい場合は
Resume ステートメントを使います。
特にResume Nextステートメントを使うとエラーが起きた次の行から処理が再開されます。
太陽Kさんのコードは
>MsgBox "指定されたファイル" + vbNewLine + AppRunName + vbNewLine + "が開けませんでした。"
の後にResume Next又はResume Unerrorとすれば期待どおりの動作をすると思います。
ただしOn Error GoTo ErrorA はともかくとして、GoTo UnerrorでGotoを使用する事はあまり
美しいプログラムとは言えません。
この様なプログラムの場合ほぼ定型と言える処理方法が有ります。
エラーの処理をExit Subの外側に書くところにポイントが有ります。

Private Sub Harehore()
  On Error GoTo ErrorHandler
  For n=1 to 1000
    Hogehoge(n)
  next
  Exit Sub        
  ErrorHandler:    
  MsgBox("エラーが起きたよ!")
  Resume Next
End Sub    
こんなことを頭に入れて、もう一度MSDNを、頑張って下さい。

投稿時間:2004/05/10(Mon) 22:39
投稿者名:太陽K
Eメール:
URL :
タイトル:
Re^4: Go to Error
途中間をあけてしまってすみませんでした。
MSDNを見ているうちにだいたい何故エラーがでるのかは理解できたのですが、
どうしたら解決できるのかがわからずに、頭から煙をだしたまま、合宿にいってしまいました。
エラー処理を外側に出す方法は、実は、上記の記述していない部分の真下に使っていたのですが、
「Resume NextってことはFor〜Next文の外側に出したら最後まで処理しないうちに抜けてしまうのか?」
などという見当違い・勘違いを起こしていました(BASIC言語時代にGosubから戻る命令があった気がしたので)。
さらにいうとMSDN読んだだけではResumeにOn Errorを閉じる働きがあったことにも気がつきませんでした。
やはり結構わかりづらいMSDN...
しかし、アドバイスのおかげでバッチリ解決できました。
どうもありがとうございました☆