
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=アプリケーション定義またはオブジェクト定義のエラーです。
No.2ベストアンサー
- 回答日時:
> Object型やVariant型経由だとうまくいく理由
わかった気がします。バインディングがナントカって話かも。
・Object型ならクラス定義なしで遅延バインディング
・Sheet1型なら定義を使って事前バインディング
たしか、関数名の差し替えもできたはず。定義が噛むことで呼び出しが変わり、エラー処理をもった関数にラッピングされる、ってコトじゃないかな。
そして、このMsgBox・・・UI絡みの配慮かと思ったけど、イベント契機だと出ない。旧仕様の名残ですかね。そう考えると、ちぐはぐな挙動にも納得いきます。
> Sheet1.XXの書き方ってあまりされませんか?
動的なシート生成/削除や、他Book操作もあるので、僕は基本Nameで統一してます。Nameは定数にすると処理と定義を分けやすいです。
ユーザ操作の話をすると、Sheet1もシート複製→元シート削除で再起不能。シートを複製して設定のバックアップを・・・とかされるとアウトなんです。目に見えるシート名で縛った方が安定するかな、っていうのが悩んだ末の結論でした。
僕はほとんどシートモジュール使わなんですが、使うならSheet1のがしっくり来ますよね。
使い分けたらいいと思いますよ。
レスが遅くなりすみません。
> 定義が噛むことで呼び出しが変わり、エラー処理をもった関数にラッピングされる、ってコトじゃないかな。
なるほど、確かにそんな感じのようですね。
シートモジュール内にマクロを実装する際は、呼び出し方を変えてみたり、そもそもエラーを外に出さないように実装するなど工夫してみます。
ご回答頂きありがとうございます。
非常に助かりました。
No.1
- 回答日時:
> Sheet1.Hoge
Sheets(1).Hoge か Sheets("Name").Hoge で大丈夫。
Hogeを直接実行(F8)すると、見慣れたデバッグダイアログじゃなく、「メッセージボックス」でエラーが通知されます。シートはイベントなどユーザ操作と直接関わるため、エラー処理をしてくれるようです。
Sheet1.XXだとユーザ操作と同じ扱い、ってコトですかね。
テストコードでもない限り、Sheet1.XX なんて書くコトはないでしょうから、問題はないと思いますが。混乱しますよね。
この回答への補足
Sheets(1).HogeやSheets("Name").Hogeの書き方でうまくいくのは、
どうやらObject型を経由してプロシージャを呼び出していることにあるようですね。
(Sheetsの既定のプロパティの戻り値はObject型)
なので以下の書き方でもうまくいきました。
Dim obj As Object '←Variant型でもうまくいきました。
Set obj = Sheet1
obj.Hoge
なお、Object型やVariant型経由だとうまくいく理由については
思いつかなかったのですが御心当たりはございますでしょうか?
※エラートラップを「クラス モジュールで中断」に設定すると
いつものデバッグダイアログが出てその時点では、
Descriptionで設定した文字列も元のままでした。
シートモジュールでは最終的にエラーをトラップしないと
例の「メッセージボックス」で通知するよう仕込まれており、
そこが何やら悪さをしているように思うのですが、
それ以上のことがちょっとわかんなかったです。
ちなみに、自分としてはSheets(1)やSheets("Name")の書き方では
シートの場所や名前を変更しただけでソースコードまで変更しなければならず、
意図せずユーザに変更されてしまいバグる恐れもあるので、
Sheet1.XXなどのオブジェクト名による書き方のほうがいいと思うのですが、
Sheet1.XXの書き方ってあまりされませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー1004「Select メソ...
-
同じ作業を複数のシートに実行...
-
特定の文字を含むシートだけマ...
-
シートが保護されている状態で...
-
Access エクセルシート名変更
-
【Excel VBA】Worksheets().Act...
-
IFステートの中にWithステート...
-
Excelマクロのエラーを解決した...
-
ユーザーフォームに入力したデ...
-
実行時エラー'1004': WorkSheet...
-
Excel チェックボックスにチェ...
-
XL:BeforeDoubleClickが動かない
-
【エクセル】オプションボタン...
-
マクロを使って、シート印刷完...
-
VBA 検索して一致したセル...
-
エクセルのマクロで条件一致の...
-
Excelにて、シート間で、データ...
-
excelのマクロで該当処理できな...
-
別のシートから値を取得するとき
-
VBAで同じシート名のコピー時は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
特定の文字を含むシートだけマ...
-
実行時エラー'1004': WorkSheet...
-
ユーザーフォームに入力したデ...
-
【ExcelVBA】全シートのセルの...
-
エクセルVBA Ifでシート名が合...
-
実行時エラー1004「Select メソ...
-
VBA 存在しないシートを選...
-
エクセルで通し番号を入れてチ...
-
VBA 検索して一致したセル...
-
XL:BeforeDoubleClickが動かない
-
VBA 指定した回数分、別シート...
-
VBAマクロでシートコピーした新...
-
シートが保護されている状態で...
-
ブック名、シート名を他のモジ...
-
【VBA】全ての複数シートから指...
-
別のシートから値を取得するとき
-
ExcelのVBAのマクロで他のシー...
-
Excel チェックボックスにチェ...
おすすめ情報