• ベストアンサー

クラスモジュールからのErr.Raiseがうまくゆきません。

クラスモジュール内で On Error Resume Nextを書き、 エラー処理を行った後、Err.Raiseを実行して、呼び出し元にエラーを返していますが、 呼び出しもとの On Error Goto のとび先に飛びません。 呼び出し元で、Err.Numberを表示すると、値が取れますので、値は渡せているようです。 呼び出し元で何か実行時エラーを発生するとちゃんと On Error gotoのとび先に飛びますので、クラスモジュールで行った Err.Raiseが処理されないだけのようです。 どうすれば、呼び出しもとのとび先に飛ぶようになるでしょうか。お知恵をお貸しください。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>On Error Resume Nextを書き、 そりゃ飛びませんね。 Err.Raiseの前に On Error Goto 0を1行いれましょう。 また、VBのメニューの、ツール→オプション→全般のエラーとラップのところで、「エラー処理対象外のエラーで中断」にすると便利かも。

SiroutoPGM
質問者

お礼

ご回答ありがとうございます。 説明不足でしたが、このままではだめでした。 というのも、実際にエラーが発生している状態であるため、 On Error Goto 0 を書くとその時点で実行時エラーが発生し、エラー画面が表示されてしまい、呼出元のエラー処理は実行されません。 以下の方法で解決しました。 Err.Clear '一旦エラーをクリアする。 On Error Goto 0 'Resume Nextを解除する。 Err.Raise '呼出元にエラーを送る。 以上です。 Err.Clearを行うとNumber,Descriptionなどは全てクリアされるので、あらかじめ別の変数に対比しておく必要があります。

関連するQ&A

  • シートモジュールからのErr.Raiseについて

    Excel(Office 2007)で以下のようにシートモジュールで 発生したエラーの詳細を標準モジュール側で取得しようとしたところ SourceとDescriptionで指定した文字列が取得できませんでした。 どうすれば指定した元の文字列を取得することができるでしょうか。 どなたかお知恵をお貸しください。 【シートモジュール(Sheet1)内のソースコード】 Public Sub Hoge()     Err.Raise Number:=1000, Source:="Fugo", Description:="Fuga" End Sub 【標準モジュール内のソースコード】 Public Sub Piyo()     On Error Goto Error1     Sheet1.Hoge     Exit Sub Error1:     MsgBox "Num=" & Err.Number & ", Src=" & Err.Source & ", Dsc=" & Err.Description End Sub 【MsgBoxの表示結果】 Num=1000, Src=VBAProject, Dsc=アプリケーション定義またはオブジェクト定義のエラーです。  

  • on error 処理に関して

    on error goto での処理ルーチン内で、 さらに on error goto を出すことは可能でしょうか。 それとも、一度on errorを設定すると、エラーが発生した後では変更は不可なのでしょうか。 やりたいことは、 1回目と、2回目、3回目以降でやることとを変えたいのです。 例えば、メッセージを変えるとか。 この場合、 エラー処理の中で、何回目かを聞くことで、メッセージを変えることは出来ると思うのですが、 それはやらず、 他にも色々やることが多いので、別処理として飛びたいのです。 以下のようなイメージです。 err1: on error goto err2 resume next err2: on error goto err3 resume next err3: resume next 宜しくお願いします。

  • Onってなんでしょうか?

    私は現在、VB6を使用してプログラム開発を行っています。 「On Error」ステートメントに関して質問させていただきます。 私の管理下のソースに、   (1)「On Error Goto [行ラベル]」   (2)「On Err Goto [行ラベル]」 の2種類のステップがあり、 (2)に関しての動作が不明で困っています。 (要は「On [Object] Goto [行ラベル]」と記述した場合に、  どのように解釈されるのか分らないのですが・・・  (1)、(2)共にコンパイルは通りますが(2)の場合はエラーハンドリングはできません。) <質問> (1)「On Err Goto [行ラベル]」 と記述した場合、  どのような条件でGotoが実行されるのでしょうか?  (Errはエラーオブジェクトです) (2)「On」は   ・「On Error Goto [行ラベル]」   ・「On Error Resume Next」   ・「On Error Goto 0」  以外に使用する方法があるのでしょうか?

  • ACCESS:97→2002のモジュールの変換エラーについて

    ACCESS97で作成したファイルをACCESS2002に変換したいのですが、 変換中にコンパイルエラー発生しましたとメッセージが表示されてしまいました。 ファイル自体は変換できておりエラーテーブルを見るとモジュールが変換エラーを起こしていました。そのモジュールを実行させるとやはりエラーが出て止まってしまいます。 ~モジュールの内容は~ テーブルを削除するために削除クエリーの実行(これはうまく動いてます。) フォームに入力されたパスのCSVファイルをインポートする。定義名:CSVインポート定義"インポート先:"CSVテーブル" (これがうまく動かないようです。実行させると「このファイルをインポートできません」とメッセージがでます。) 以下のものになります。 Option Compare Database Option Explicit '------------------------------------------------------------ ' CSVインポート ' '------------------------------------------------------------ Function CSVインポート() On Error GoTo CSVインポート_Err Dim parm1 As String parm1 = Forms!報告書作成!インポートパス & " " ' 入力データ削除query DoCmd.OpenQuery "全て削除クエリー", acNormal, acEdit ' インポート実施 DoCmd.TransferText acImportDelim, "CSVインポート定義", "CSVテーブル", parm1, False, "" CSVインポート_Exit: Exit Function CSVインポート_Err: MsgBox Error$ Resume CSVインポート_Exit End Function もし不足な点がありましたら補足させていただきます。 よろしくお願いします。

  • ループの中で何度もエラー処理をしたい場合

    サンプルコードを掲載します。 実際はセルの文字を取得するのでこのコードとは違いますが、形は同じです。 Sub test() Dim i As Long On Error GoTo Err1 For i = 0 To 5 i = "a" Err1: Debug.Print i "は、エラーになりました" Next End Sub このようなコードの場合、 i=0の時に、1回目のエラーになって 「0は、エラーになりました」が返りますが、 その後、i=1になった時に i = "a"を実行すると On Error GoTo Err1が無視され、エラーになってしまいます。 ループの中でエラーが何度発生してもエラー処理をする方法はありますか? On Error Resume Next以外の方法で教えてください。

  • GoToRecordで実行時エラー '2105'

    教えてください。Access2000です。 Private Sub 次へ_Click() On Error GoTo Err_次へ_Click On Error Resume Next DoCmd.GoToRecord , , acNext Exit_次へ_Click: Exit Sub Err_次へ_Click: MsgBox ERR.Description Resume Exit_次へ_Click End Sub って書いたのですが、最後のレコードまで行った後 「次へ」をクリックすると実行時エラーになってしまいます。 移動できませんとかメッセージで逃げたいのですがどうすればいいのでしょうか? お願いします。

  • フォーム内のテキストボックスの値を参照するには?

    モジュールからフォーム上のテキストボックスに入力された値を参照する方法で質問です。 内容としては、テキストボックスに入力された日付(yyyymmdd)をファイル名にもつCSVファイルをインポートするといったものです。 フォーム名:Form1 テキストボックス名:TBox1 インポート元:C:\yyyymmdd.csv インポート先:インポートテーブル モジュール記述先:標準モジュール Function Import() On Error GoTo Import_Err Dim FilePath As String FilePath = "C:\" & Format(Form1. TBox1. Value, "yyyymmdd") & ".csv" DoCmd.TransferText acImportDelim, "インポート定義", "インポートテーブル", FilePath Import_Exit: Exit Function Import_Err: Resume Import_Exit End Function 以上の様なモジュールを組んでみましたがインポート出来ませんでした。 エラーは出ませんでしたが何も起こらないといった状態です。 モジュールの部分についてはなんとなくわかるのですが、フォーム側の設定?がよくわかりません。 あと何をどのようにすればテキストボックス内の値を参照可能になりますでしょうか? 何卒よろしくお願いいたします。

  • 入力した値が不正というよりイベントが違いそうなので教えてください!

    入力した値が不正というよりイベントが違いそうなので教えてください! 今までの質問等で社員管理システムの社員マスタサブフォームのコードに 以下を入力することはできました。 Private Sub 開始日_AfterUpdate() On Error GoTo エラー処理 '値を削除した場合は何もしない If IsNull(開始日) Then GoTo 終了処理 '『開始日』の前日の日付を『終了日』に設定 '(割り算扱いされるのを避けるため「#」で括る) Me!終了日.Value = "#" & DateAdd("d", -1, 開始日) & "#" 終了処理: Exit Sub エラー処理: MsgBox Err.Number & ":" & Err.Description, , Me.Name & "開始日" Resume 終了処理 End Sub Private Sub 終了日_AfterUpdate() On Error GoTo エラー処理 '値を削除した場合は何もしない If IsNull(終了日) Then GoTo 終了処理 '『終了日』の翌日の日付を『開始日』に設定 '(割り算扱いされるのを避けるため「#」で括る) Me!開始日.Value = "#" & DateAdd("d", 1, 終了日) & "#" 終了処理: Exit Sub エラー処理: MsgBox Err.Number & ":" & Err.Description, , Me.Name & "終了日" Resume 終了処理 End Sub これで終了日に日付を入力すると 2113:このフィールドに入力した値が不正です。 となるのを直したいです。 開始日と終了日は共に データ型 日付/時刻型 書式 yyyy/mm/dd です。 このイベントを作成する前はエラーにならなかったので 入力した値が不正というよりイベントが違いそうなので教えてください!

  • クラスモジュールの処理

    VB6.0で開発しています。 以下のようにクラスモジュールを作ったのですが フォームでコマンドボタンを押したら 処理されるようにしたいのですが どうすればいいかわかりません。 教えてください。 Class CExcel Public App Public WshShell Public ErrDescription Private WorkBook Public CurBook Private Sub Class_Initialize() Call InitSetting() End Sub Private Sub Class_Terminate() Call Quit() End Sub Public Default Function InitSetting() if IsEmpty( App ) then Set App = CreateObject("Excel.Application") end if if IsEmpty( WshShell ) then Set WshShell = CreateObject("WScript.Shell") end if App.DisplayAlerts = False Set CurBook = Nothing end function Public Function Quit() If not IsEmpty( App ) Then For Each Workbook In App.Workbooks WorkBook.Saved = True Next App.Quit Set App = Nothing App = Empty Set CurBook = Nothing End If End Function Public Property Let Visible( bFlg ) App.Visible = bFlg End Property Public Property Get Visible Visible = App.Visible End Property Public Function Open( strPath ) on error resume next Set Open = App.Workbooks.Open(strPath) if Err.Number <> 0 then Set Open = Nothing ErrDescription = Err.Description Exit Function end if on error goto 0 Set CurBook = Open ' アクティブなウィンドウを最大化 App.ActiveWindow.WindowState = xlMaximized End Function Public Function Create( strPath ) Dim nBooks App.Workbooks.Add nBooks = App.Workbooks.Count Set Create = App.Workbooks( nBooks ) Set CurBook = Create CurBook.Activate App.ActiveWindow.WindowState = xlMaximized if strPath <> "" then on error resume next CurBook.SaveAs( strPath ) if Err.Number <> 0 then MsgBox( Err.Description ) Exit Function end if on error goto 0 end if End Function Public Function Close( MyBook ) if IsObject( MyBook ) then MyBook.Saved = True MyBook.Close Set MyBook = Nothing MyBook = Empty else if CurBook is Nothing then else CurBook.Saved = True CurBook.Close Set CurBook = Nothing end if end if End Function Function Save( MyBook ) if IsObject( MyBook ) then MyBook.Save else CurBook.Save end if End Function Function SaveAs( MyBook, strPath ) if IsObject( MyBook ) then MyBook.SaveAs strPath else CurBook.SaveAs strPath end if End Function Function Load( strPath ) if not IsEmpty( App ) then MsgBox( "Excel をロードする前に、Quitを実行して下さい   " ) Exit Function end if Call WshShell.Run( _ "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " & _ strPath _ ) End Function End Class

  • エラー処理の中で起こるエラーを無視したい

    On Error Goto ラベル ラベル内でエラー処理をしています。 エラー処理内でエラーが起こってしまう場合は無視して続けたいのですが、 ラベルの中に、 On Error Resume Next と書いてもダメでした。 On Error Goto 0にしてもダメでした。 どのようにすれば可能ですか?

専門家に質問してみよう