
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Visual Basic(VBA) マクロについて教えてください。 1 2023/06/06 00:57
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
excelのマクロで該当処理できな...
-
Excelマクロのエラーを解決した...
-
【VBA】特定の文字で改行(次の...
-
【ExcelVBA】全シートのセルの...
-
ユーザーフォームに入力したデ...
-
エクセルのシート名変更で重複...
-
実行時エラー1004「Select メソ...
-
VBAで同じシート名のコピー時は...
-
VBA 存在しないシートを選...
-
実行時エラー'1004': WorkSheet...
-
ブック名、シート名を他のモジ...
-
Worksheet_Changeの内容を標準...
-
XL:BeforeDoubleClickが動かない
-
Excel VBA 文字列のセルを反映...
-
エクセルVBA ListBoxの並び...
-
EXCEL(VBA)でシート保護がかか...
-
VBA ユーザーフォーム上のチェ...
-
Excelマクロで複数シートの特定...
-
【エクセルVBA】「Protect User...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
実行時エラー'1004': WorkSheet...
-
XL:BeforeDoubleClickが動かない
-
エクセルVBA Ifでシート名が合...
-
実行時エラー1004「Select メソ...
-
エクセルのシート名変更で重複...
-
【ExcelVBA】全シートのセルの...
-
VBA 存在しないシートを選...
-
ブック名、シート名を他のモジ...
-
Excel チェックボックスにチェ...
-
VBA 検索して一致したセル...
-
エクセルで通し番号を入れてチ...
-
シートが保護されている状態で...
-
ExcelのVBAのマクロで他のシー...
-
【VBA】特定の文字で改行(次の...
-
Worksheet_Changeの内容を標準...
-
Excel VBA で自然対数の関数Ln...
おすすめ情報