シートモジュールにインターフェイスを実装するのはやめた方がいい

シートモジュールへのインターフェイスの実装はやめた方がいいかも知れない

以前、

akashi-keirin.hatenablog.com

で、シートモジュールにもインターフェイスを実装することができる、ということを示した。

んで、そのときに使ったブックを今日久しぶりに開いてみたら、ち~んw珍現象が起こったので報告する。

ちなみに、今回ご紹介するブックでは、

f:id:akashi_keirin:20181013190911j:plain

このように、Sheet6モジュールと、

f:id:akashi_keirin:20181013190930j:plain

Sheet7モジュールに、「IA1ValueShowable」というアホみたいなインターフェイスを実装している。

IA1ValueShowableインターフェイスについては、コチラをどうぞ。

シートオブジェクトにアクセスできない

まず、コードウインドウで、

Sheet6.

と打ち込んでみる。当然、

f:id:akashi_keirin:20181013190939j:plain

このようにクイックヒントが出る。

とりあえず、安直にActivateメソッドを選択する。

結果、次のようなプロシージャが出来上がった。

リスト1 標準モジュール
Public Sub testSheetModule()
  Sheet6.Activate
End Sub

Sheet6をアクティブにするだけのコード。

こいつを実行してみる。

f:id:akashi_keirin:20181013191028j:plain

ファッ!?

「予期せぬエラーが発生しました:(32809)。」だと!?

わけわからん……。

次に、プロシージャの中身を書き換える。

スト2 標準モジュール
Public Sub testSheetModule()
  Sheet6.Range("A1").Value = "ち~んw"
End Sub

Sheet6のA1セルに「ち~んw」と書き込むためのコード。

こいつを実行してみる。

f:id:akashi_keirin:20181013191040j:plain

ファッ!?

今度は「実行時エラー '32809':/アプリケーション定義またはオブジェクト定義のエラーです。」と来やがった。

エラー番号はさっきと一緒だが、エラーメッセージは、オブジェクトが取得できていないときのものっぽい。

[デバッグ]ボタンをクリックしてみると、

f:id:akashi_keirin:20181013191049j:plain

Sheet6.Range("A1").Value = "ち~んw"」のところで止まっている(っていうか、ここしか止まるところないけどw)。

どういうことやねん。

今度は、プロシージャの中身を次のようにしてみる。

リスト3 標準モジュール
Public Sub testSheetModule()
  ThisWorkbook.Worksheets("Sheet6").Range("A1").Value = "ち~んw"
End Sub

オブジェクト名で指定するのではなく、Worksheetsコレクションからアクセスしようと試みてみる。

こいつを実行してみる。

f:id:akashi_keirin:20181013191100j:plain

なんと、これもダメ。

f:id:akashi_keirin:20181013191112j:plain

やはり、このコードが実行できていない。

これは、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で回してみる、ということ。

こいつを実行してみる。

すると、エラーが出ずに完走。

イミディエイトに

f:id:akashi_keirin:20181013191218j:plain

正しい結果が出力されている。……っつっても、これを見ても正しいかどうかなんて分からないだろうけれどw

おわりに

どうも、シートモジュールにインターフェイスを実装するのはやめといた方がいいみたい。

そもそも、シートモジュールにインターフェイスを実装したところであまりメリットはないだろうし……。

インターフェイスの実装を取りやめたらどうなるのか、という点については、まだ実験していない。またヒマができたらやってみます。

追記

ヒマなので、さっそく実験してみました。

akashi-keirin.hatenablog.com