シートモジュールにインターフェイスを実装するのはやめた方がいい
シートモジュールへのインターフェイスの実装はやめた方がいいかも知れない
以前、
で、シートモジュールにもインターフェイスを実装することができる、ということを示した。
んで、そのときに使ったブックを今日久しぶりに開いてみたら、ち~んw珍現象が起こったので報告する。
ちなみに、今回ご紹介するブックでは、
このように、Sheet6
モジュールと、
Sheet7
モジュールに、「IA1ValueShowable
」というアホみたいなインターフェイスを実装している。
「IA1ValueShowable
」インターフェイスについては、コチラをどうぞ。
シートオブジェクトにアクセスできない
まず、コードウインドウで、
Sheet6.
と打ち込んでみる。当然、
このようにクイックヒントが出る。
とりあえず、安直にActivate
メソッドを選択する。
結果、次のようなプロシージャが出来上がった。
リスト1 標準モジュール
Public Sub testSheetModule() Sheet6.Activate End Sub
Sheet6
をアクティブにするだけのコード。
こいつを実行してみる。
ファッ!?
「予期せぬエラーが発生しました:(32809)。」だと!?
わけわからん……。
次に、プロシージャの中身を書き換える。
リスト2 標準モジュール
Public Sub testSheetModule() Sheet6.Range("A1").Value = "ち~んw" End Sub
Sheet6
のA1セルに「ち~んw」と書き込むためのコード。
こいつを実行してみる。
ファッ!?
今度は「実行時エラー '32809':/アプリケーション定義またはオブジェクト定義のエラーです。」と来やがった。
エラー番号はさっきと一緒だが、エラーメッセージは、オブジェクトが取得できていないときのものっぽい。
[デバッグ]ボタンをクリックしてみると、
「Sheet6.Range("A1").Value = "ち~んw"
」のところで止まっている(っていうか、ここしか止まるところないけどw)。
どういうことやねん。
今度は、プロシージャの中身を次のようにしてみる。
リスト3 標準モジュール
Public Sub testSheetModule() ThisWorkbook.Worksheets("Sheet6").Range("A1").Value = "ち~んw" End Sub
オブジェクト名で指定するのではなく、Worksheets
コレクションからアクセスしようと試みてみる。
こいつを実行してみる。
なんと、これもダメ。
やはり、このコードが実行できていない。
これは、Sheet7
でも同じ結果になった。
インターフェイスを実装したシートオブジェクトにはVBAからアクセスできなくなってしまうのだろうか?
別の方法でアクセスを試みる
次のコードで試してみた。
リスト4 標準モジュール
Public Sub testSheetModule() Dim Sh As Worksheet For Each Sh In ThisWorkbook.Worksheets Debug.Print Sh.Range("A1").Value Next End Sub
要するに、Worksheets
コレクションをFor Each
で回してみる、ということ。
こいつを実行してみる。
すると、エラーが出ずに完走。
イミディエイトに
正しい結果が出力されている。……っつっても、これを見ても正しいかどうかなんて分からないだろうけれどw
おわりに
どうも、シートモジュールにインターフェイスを実装するのはやめといた方がいいみたい。
そもそも、シートモジュールにインターフェイスを実装したところであまりメリットはないだろうし……。
インターフェイスの実装を取りやめたらどうなるのか、という点については、まだ実験していない。またヒマができたらやってみます。
追記
ヒマなので、さっそく実験してみました。