Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7639 / 13645 ツリー ←次へ | 前へ→

【37829】別シートのPublic関数からのエラー取得 小川 06/5/19(金) 18:34 質問[未読]
【37831】Re:別シートのPublic関数からのエラー取得 ichinose 06/5/19(金) 19:28 発言[未読]
【37832】Re:別シートのPublic関数からのエラー取得 小川 06/5/19(金) 20:36 お礼[未読]
【37833】Re:別シートのPublic関数からのエラー取得 ichinose 06/5/19(金) 20:42 発言[未読]
【37834】Re:別シートのPublic関数からのエラー取得 小川 06/5/19(金) 20:57 お礼[未読]

【37829】別シートのPublic関数からのエラー取得
質問  小川  - 06/5/19(金) 18:34 -

引用なし
パスワード
   はじめて質問させていただきます。
検索サイト等でいろいろと調べてみたのですが、方法が分からなかった為、
質問させていただきます。
掲示板の基本方針にのっとった形で質問させていただきます。

1.「何がしたいのか」
 Excel(2000)において、シートから別のシートのPublic関数内のエラーをトラップし、
 Errオブジェクトからメッセージを取得したい。

2.「何をやったか」
 Sheet1で On Error Goto によるエラーとラップを記述し、Sheet2のPublic関数を呼び出します。
 呼び出し先の関数内で Err.Raise して、Sheet1でトラップしたエラーのメッセージを取得します。
 メッセージは Err.Description から取得していますが、設定値した文字列とは違う
 文字列(「アプリケーション定義またはオブジェクト定義のエラーです。」)になってしまいます。
 ソースは以下のとおりです。

----------------------------------------------------
<Sheet1>
Public Sub test()
On Error GoTo ERR_ROUTINE

  Call Sheet2.testSub

Exit Sub
ERR_ROUTINE:
  Debug.Print Err.Description
End Sub

 <Sheet2>
Public Sub testSub()
  Call Err.Raise(10003, , "test1")
End Sub

----------------------------------------------------

※補足
エラーメッセージを Err.Description ではなく、グローバル変数や関数の引数等を使って受け取ることで、
同様の目的を果たせるとは思いますが、既存のソースにあわせる意味で上記方法で実現したいと考えています。
上記現象がExcelVBAの仕様であれば諦めもつくのですが、そのようなドキュメントを発見できませんでした。

Sheet2のソースを標準モジュールやクラスモジュールのPublicメソッドとして定義した場合は、
同様にエラーをトラップしても、Err.Description から "test1" が取得できます。

以上 ご助言の程、宜しくお願いいたします。

【37831】Re:別シートのPublic関数からのエラー取得
発言  ichinose  - 06/5/19(金) 19:28 -

引用なし
パスワード
   ▼小川 さん:
こんばんは。

>掲示板の基本方針にのっとった形で質問させていただきます。
「このように質問して下さい」と質問の仕方の良い例として、
どこかに掲載したいですねえ!!


>1.「何がしたいのか」
> Excel(2000)において、シートから別のシートのPublic関数内のエラーをトラップし、
> Errオブジェクトからメッセージを取得したい。
>
>2.「何をやったか」
> Sheet1で On Error Goto によるエラーとラップを記述し、Sheet2のPublic関数を呼び出します。
> 呼び出し先の関数内で Err.Raise して、Sheet1でトラップしたエラーのメッセージを取得します。
> メッセージは Err.Description から取得していますが、設定値した文字列とは違う
> 文字列(「アプリケーション定義またはオブジェクト定義のエラーです。」)になってしまいます。
本当ですねえ!!
Excel/VBAでは、ワークシートオブジェクトを扱うとき
Sheet1.Cells(1,1)というように
直接オブジェクトを指定せずにWorksheetsコレクションを通して
指定する事を推奨しています(MS社のMsdnのどこかで見ました)。
(なにやら、いろいろと不具合があるみたいです)

よって、これも

> ソースは以下のとおりです。
>
>----------------------------------------------------
><Sheet1>
>Public Sub test()
>On Error GoTo ERR_ROUTINE
>
  Worksheets("Sheet2").testSub
'として、試してみて下さい
'因みに
'このtestsubがThisworkbookに置いたばあいも
'  thisworkbook.testsubでは、駄目でした
'  workbooks(thisworkbook.name).testsub 'はOKでした
>
>Exit Sub
>ERR_ROUTINE:
>  Debug.Print Err.Description
>End Sub
>
> <Sheet2>
>Public Sub testSub()
>  Call Err.Raise(10003, , "test1")
>End Sub
>
>----------------------------------------------------


試してみて下さい。
これは、目安箱に入れときたいね!!

【37832】Re:別シートのPublic関数からのエラー取得
お礼  小川  - 06/5/19(金) 20:36 -

引用なし
パスワード
   小川です。
ichinose さん、ご助言感謝致します。

ご助言頂いた通り、Worksheets コレクションからシートオブジェクト
を指定したところ、うまくいきました。

長いこと悩んでいたのに、質問投稿から1時間程で
問題解決のレスを頂けるとはびっくりです。

有難うございました。

【37833】Re:別シートのPublic関数からのエラー取得
発言  ichinose  - 06/5/19(金) 20:42 -

引用なし
パスワード
   >>----------------------------------------------------
>><Sheet1>
>>Public Sub test()
>>On Error GoTo ERR_ROUTINE
 dim sht as object
 set sht=sheet2
 sht.testSub
>'としもOKでした
>'因みに
'このtestsubをThisworkbookに置いたばあいも
' dim wbk as Object
' Set wbk=thisworkbook
'  wbk.testsub
'でOKです。

>>
>>Exit Sub
>>ERR_ROUTINE:
>>  Debug.Print Err.Description
>>End Sub
>>
>> <Sheet2>
>>Public Sub testSub()
>>  Call Err.Raise(10003, , "test1")
>>End Sub
>>
>>----------------------------------------------------
>
>


これも試してみて下さい。

【37834】Re:別シートのPublic関数からのエラー取得
お礼  小川  - 06/5/19(金) 20:57 -

引用なし
パスワード
   ▼ichinose さん:

ご指示頂いた方法でもうまくいきました。

別シートへの呼び出しが頻繁にある場合など
以下の方が簡潔で具合がよいですね。

丁寧なフォロー有難うございます。


>>>----------------------------------------------------
>>><Sheet1>
>>>Public Sub test()
>>>On Error GoTo ERR_ROUTINE
> dim sht as object
> set sht=sheet2
> sht.testSub
>>'としもOKでした
>>'因みに
>'このtestsubをThisworkbookに置いたばあいも
>' dim wbk as Object
>' Set wbk=thisworkbook
>'  wbk.testsub
>'でOKです。
>
>>>
>>>Exit Sub
>>>ERR_ROUTINE:
>>>  Debug.Print Err.Description
>>>End Sub
>>>
>>> <Sheet2>
>>>Public Sub testSub()
>>>  Call Err.Raise(10003, , "test1")
>>>End Sub
>>>
>>>----------------------------------------------------
>>
>>
>
>
>これも試してみて下さい。

7639 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free