別ブックのシートモジュールのメソッドを呼ぶ(Excel)
別ブックのシートモジュールに書いたメソッドを呼ぶ
シート独自の処理など、シートモジュールに書いておくのは、「コードの整理」という観点からは非常に便利。
では、シートモジュールに書いた処理を、他のブック(プロジェクト)から呼び出すことはできるのだろうか。
他ブックのシートモジュールのメソッドを呼ぼうとしてみる
準備
同じフォルダ内に、二つのブックを作る。
こんな感じ。
いちおう、それぞれのプロジェクト エクスプローラーの状態をどうぞ。
オブジェクト名とシート名がごっちゃになるとややこしいので、シート名はご覧のように変えています。
次に、それぞれのSheet1
モジュールに次のようにコードを書く。
リスト1 Sheet1モジュール
'ち~んw1号.xlsmのSheet1モジュールです。' Public Sub helloWorld() Debug.Print "Hello, World from 1号!" End Sub
リスト2 Sheet1モジュール
'ち~んw2号.xlsmのSheet1モジュールです。' Public Sub helloWorld() Debug.Print "Hello, World from 2号!" End Sub
超シンプルなメソッドをそれぞれのブックのSheet1
モジュールに搭載。
ち~んw2号から呼び出しを試みる
まず、ち~んw2号.xlsm
の標準モジュールから、ち~んw1号.xlsm
のSheet1
モジュールに搭載したhelloWorld
メソッドを呼び出すことを試みる。
リスト3 ち~んw2号.xlsmの標準モジュール
Public Sub testCallSheetObjectProcedure() Dim anotherBook As Workbook ' ち~んw1号.xlsmを開いて変数にぶち込む' Set anotherBook = _ Workbooks.Open(ThisWorkbook.Path & "\ち~んw1号.xlsm") ' 「ち~んw1」シートを変数にぶち込む' Dim targetSheet As Worksheet Set targetSheet = anotherBook.Worksheets("ち~んw1") ' helloWorldメソッドを呼ぶ' Call targetSheet.helloWorld ' ち~んw1号.xlsmを閉じる' Call anotherBook.Close(SaveChanges:=False) ' オブジェクト変数の解放' Set anotherBook = Nothing Set targetSheet = Nothing End Sub
コードの詳細はコメントをご覧くだされ。
こいつを実行しようとすると、
そもそもコンパイルが通らない。
Object型変数を使う
コードを修正する。
リスト4 ち~んw2号.xlsmの標準モジュール
Public Sub testCallSheetObjectProcedure() Dim anotherBook As Workbook ' ち~んw1号.xlsmを開いて変数にぶち込む' Set anotherBook = _ Workbooks.Open(ThisWorkbook.Path & "\ち~んw1号.xlsm") ' 「ち~んw1」シートを変数にぶち込む' Dim targetSheet As Object '……(*)' Set targetSheet = anotherBook.Worksheets("ち~んw1") ' helloWorldメソッドを呼ぶ' Call targetSheet.helloWorld ' ち~んw1号.xlsmを閉じる' Call anotherBook.Close(SaveChanges:=False) ' オブジェクト変数の解放' Set anotherBook = Nothing Set targetSheet = Nothing End Sub
変えたのは(*)のところだけ。
リスト3でWorksheet
型にしていた変数をObject
型に変えた。
こいつを実行すると、
意図どおりの結果が得られた。
おわりに
実にめんどくさい。