インターフェース周りのち~んw現象
インターフェース周りのち~んw珍現象
前回
のやり方は、別プロジェクト間でインターフェースを共有しようとしたのがそもそも間違いだったのかも知れん、と思い直して、やり方を変えてみた。
コチラを参考に、インターフェースを含んだブックをアドインにして、参照設定で共有するやり方に改める。
準備1 アドインにする
インターフェースIChokiShowable
(インターフェース名らしく、先頭に「I
」を付けました。すんません。)を搭載したブックを作り、ChokiShowableAddin.xlam
という名前で保存しておく。
このように、「名前を付けて保存」の「ファイルの種類」欄で「Excelアドイン(*.xlam)」を選んだら、勝手に保存先のフォルダが指定されるので、ファイル名だけ指定したらヨロシ。
次に、テキトーにExcelブックを開いて、「ファイル」→「オプション」→「アドイン」の順にたどっていく。
すると、一番下に、「管理」というやつがあるので、
ドロップダウンリストを「Excel アドイン」にして[設定]ボタンをクリック。すると、
こんなやつが出てくるので、「Chokishowableaddin」を選んで[OK]をクリックする。
プロジェクト エクスプローラーは、
こんな状態。
準備2 参照設定する
次に、参照設定をする。
プロジェクト エクスプローラー上で、「VBAProject(ChokiShowableAddin.xlam)」のところをクリックして、プロパティ ウインドウの「オブジェクト名」のところを「ChokiShowable」にする。(別に何でもいいけど。)すると、プロジェクト エクスプローラーが、
こんなふうになる。
この状態にしておいて、VBEで「ツール」→「参照設定」へと進む。すると、
リストに「ChokiShowable」があるので、チェックして[OK]をクリック。
準備3 インターフェース実装ブックの準備
これまで同様、「ち~んw1号.xlsm」を使う。「ち~んw1号.xlsm」のThisWorkbook
モジュールに次のコードを書く。
リスト1 ち~んw1号.xlsmのThisWorkbookモジュール
Option Explicit Implements IChokiShowable Public Sub IChokiShowable_showChoki() Debug.Print "ち~んw1号は チョキを 出した!" End Sub
これだけ。
準備4 インターフェース型オブジェクトを返すメソッド
次に、IChokiShowable
型のオブジェクトを返すメソッドを作る。
アドインファイル「ChokiShowableAddin.xlam」の標準モジュールに次のコードを書く。
リスト2 ChokiShowableAddin.xlamの標準モジュール
Option Explicit Public Function getChokiShowableObject( _ ByVal targetBook As Workbook) As IChokiShowable Dim ret As IChokiShowable Set ret = targetBook Set getChokiShowableObject = ret End Function
Workbook
型オブジェクトを受け取って、IChokiShowable
型にして返す、というメソッド。
これで、準備はおしまい。
あとは、これまで同様「ち~んw2号.xlsm」から呼び出すことを試みる。
ち~んw2号.xlsmから呼び出す
次のコードで呼び出しを試みる。
リスト3 ち~んw2号.xlsmの標準モジュール
Public Sub testThisWorkbookInterface() Dim anotherBook As Workbook Set anotherBook = _ Workbooks.Open(ThisWorkbook.Path & "\ち~んw1号.xlsm") Dim kaniBase As IChokiShowable Set kaniBase = getChokiShowableObject(anotherBook) '……(1)' Call kaniBase.showChoki Set kaniBase = Nothing '……(2)' Call anotherBook.Close(SaveChanges:=False) '……(3)' Set anotherBook = Nothing End Sub
変えたのは(1)のところ。
アドインのgetChokiShowableObject
を用いて、変数kaniBase
にWorkbook
オブジェクトをIChokiShowable
型オブジェクトとしてぶち込んでいる。
実行結果
リスト3を実行すると、
ぐえっ! エラー!
[デバッグ]をクリックすると、
ぬな?! またお前か!
しかしながら、ここで特に何もせずにコードの実行を継続すると、
無事に意図どおりの結果が得られた。
よかったなあ、カニベースくん!!!!!!!! ぼくはもう胸がいっぱいだよ。
おわりに
しっかし、なんで一旦エラーが出るのかわからんわい。
ちなみに、リスト3の(2)、
Set kaniBase = Nothing
を実行せずに、(3)の
Call anotherBook.Close(SaveChanges:=False)
を実行すると、Excelが派手にバグりますw
興味のある方はどうぞ。
追記
もしかして、「ち~んw1号.xlsm」を開いてanotherBook
にぶち込んだ段階では、ThisWorkbook
モジュールの
Implements IChokiShowable
(正確にはThisWorkbook
モジュールのコード自体)が読み込まれていないのではないか、と思い、リスト3を次のようにしてみた。
リスト3改 ち~んw2号.xlsmの標準モジュール
Public Sub testThisWorkbookInterface() Dim anotherBook As Workbook Set anotherBook = _ Workbooks.Open(ThisWorkbook.Path & "\ち~んw1号.xlsm") Call anotherBook.callHelloWorld '……(*)' Dim kaniBase As IChokiShowable Set kaniBase = getChokiShowableObject(anotherBook) '……(4)' Call kaniBase.showChoki Set kaniBase = Nothing Call anotherBook.Close(SaveChanges:=False) Set anotherBook = Nothing End Sub
(*)のところに1行追加。インターフェースとは関係のない「ち~んw1号.xlsm」のThisWorkbook
モジュールのメソッドを呼び出してみる。これで、確実に(4)の
Set kaniBase = getChokiShowableObject(anotherBook)
実行前に「ち~んw1号.xlsm」のThisWorkbook
モジュールを読み込んでくれるはずだ。
実行してみると、
今度はエラーが出ずに一発で完走した。
うーーーん……。何だかなーーー。