ThisWorkbookモジュールにインターフェースを実装することはできるのか

ThisWorkbookモジュールにインターフェースを実装することはできるのか

前回

akashi-keirin.hatenablog.com

ブックのThisWorkbookモジュールにメソッドを搭載したら、まるでブックのメソッドであるかのように呼び出すことができることを示した。

では、ThisWorkbookモジュールにインターフェースをImplementsしたら、各ブックに共通メソッドの搭載を強制させることができるのだろうか。

ちょっとやってみた。

インターフェース作り

クラスモジュールを挿入。

ChokiShowableというアホなオブジェクト名のインターフェースを作成。

で、次のようなコードを書いておく。

リスト1 クラスモジュール
Option Explicit

Public Sub showChoki()
End Sub

showChokiというメソッドを書いておく。

このインターフェースを実装したオブジェクトには、必ずshowChokiメソッドが搭載されていることになる。

ちょうど、マンガ『キン肉マン』に出てきた超人「カニベース」の着ぐるみのようなものだと思ってもらえばよい。カニベースの着ぐるみを着ると、チョキが出せるようになるのだ!

このChokiShowableインターフェースを、「ち~んw1号.xlsm」、「ち~んw2号.xlsm」それぞれに装着しておく。

プロジェクト エクスプローラーはこんな状態。

f:id:akashi_keirin:20190224102107j:plain

インターフェースの実装

今度は、「ち~んw1号.xlsm」のThisWorkbookモジュールにChokiShowableインターフェースを実装する。

スト2 ち~んw1号.xlsmのThisWorkbookモジュール
Option Explicit

Implements ChokiShowable

Public Sub ChokiShowable_showChoki()
  Debug.Print "ち~んw1号は チョキを 出した!"
End Sub

Public Sub callHelloWorld()
  Call Sheet1.helloWorld
End Sub

このように、showChokiメソッドを搭載。

これでおしまい。ちょっと独特の書き方ですな。

インターフェースメソッドを呼び出す

このshowChokiメソッドを呼び出すコードを「ち~んw2号.xlsm」の標準モジュールに書く。

リスト3 ち~んw1号.xlsmの標準モジュール
Public Sub testThisWorkbookInterface()
  Dim anotherBook As Workbook
  Set anotherBook = _
        Workbooks.Open(ThisWorkbook.Path & "\ち~んw1号.xlsm")
  Dim kaniBase As ChokiShowable  '……(1)'
  Set kaniBase = anotherBook
  Call kaniBase.showChoki  '……(2)'
  Call anotherBook.Close(SaveChanges:=False)
  Set anotherBook = Nothing
End Sub

「ち~んw1号.xlsm」を開いて変数にぶち込むところまでは前回と同じ。

今回は、こうして得たWorkbookオブジェクトを(1)の

Dim kaniBase As ChokiShowable

インターフェースChokiShowable型の変数にぶち込み直す。

これで、Workbookオブジェクトはカニベースの着ぐるみを着たも同然なので、チョキが出せるはず!

現に、(2)の

Call kaniBase.showChoki

を入力する際には、

f:id:akashi_keirin:20190224102112j:plain

このようにIntellisenseが効く!

胸熱!!!!!!!!

実行してみる

リスト3を実行すると……、

f:id:akashi_keirin:20190224102115j:plain

f:id:akashi_keirin:20190224102120j:plain

あえなくエラーwww

f:id:akashi_keirin:20190224102125j:plain

おわりに

さて、どうしたものか……。

追記

中途半端に解決しました。

akashi-keirin.hatenablog.com

参考

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com