- ベストアンサー
シートモジュールからのErr.Raiseについて
- Excel(Office 2007)でシートモジュールから発生したエラーの詳細を標準モジュールで取得する方法
- シートモジュール内のソースコードでErr.Raiseを使用し、発生したエラーの情報を指定した文字列で取得しようとしたが、取得できなかった
- 標準モジュールのソースコードでOn Errorステートメントを使用し、エラー処理を行い、エラー情報を表示する
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> Object型やVariant型経由だとうまくいく理由 わかった気がします。バインディングがナントカって話かも。 ・Object型ならクラス定義なしで遅延バインディング ・Sheet1型なら定義を使って事前バインディング たしか、関数名の差し替えもできたはず。定義が噛むことで呼び出しが変わり、エラー処理をもった関数にラッピングされる、ってコトじゃないかな。 そして、このMsgBox・・・UI絡みの配慮かと思ったけど、イベント契機だと出ない。旧仕様の名残ですかね。そう考えると、ちぐはぐな挙動にも納得いきます。 > Sheet1.XXの書き方ってあまりされませんか? 動的なシート生成/削除や、他Book操作もあるので、僕は基本Nameで統一してます。Nameは定数にすると処理と定義を分けやすいです。 ユーザ操作の話をすると、Sheet1もシート複製→元シート削除で再起不能。シートを複製して設定のバックアップを・・・とかされるとアウトなんです。目に見えるシート名で縛った方が安定するかな、っていうのが悩んだ末の結論でした。 僕はほとんどシートモジュール使わなんですが、使うならSheet1のがしっくり来ますよね。 使い分けたらいいと思いますよ。
その他の回答 (1)
- ap_2
- ベストアンサー率64% (70/109)
> Sheet1.Hoge Sheets(1).Hoge か Sheets("Name").Hoge で大丈夫。 Hogeを直接実行(F8)すると、見慣れたデバッグダイアログじゃなく、「メッセージボックス」でエラーが通知されます。シートはイベントなどユーザ操作と直接関わるため、エラー処理をしてくれるようです。 Sheet1.XXだとユーザ操作と同じ扱い、ってコトですかね。 テストコードでもない限り、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の書き方ってあまりされませんか?
お礼
レスが遅くなりすみません。 > 定義が噛むことで呼び出しが変わり、エラー処理をもった関数にラッピングされる、ってコトじゃないかな。 なるほど、確かにそんな感じのようですね。 シートモジュール内にマクロを実装する際は、呼び出し方を変えてみたり、そもそもエラーを外に出さないように実装するなど工夫してみます。 ご回答頂きありがとうございます。 非常に助かりました。