別ブックのシートモジュールのメソッドを呼ぶ(Excel)

別ブックのシートモジュールに書いたメソッドを呼ぶ

シート独自の処理など、シートモジュールに書いておくのは、「コードの整理」という観点からは非常に便利。

では、シートモジュールに書いた処理を、他のブック(プロジェクト)から呼び出すことはできるのだろうか。

他ブックのシートモジュールのメソッドを呼ぼうとしてみる

準備

同じフォルダ内に、二つのブックを作る。

f:id:akashi_keirin:20190223170053j:plain

こんな感じ。

いちおう、それぞれのプロジェクト エクスプローラーの状態をどうぞ。

f:id:akashi_keirin:20190223170057j:plain

f:id:akashi_keirin:20190223170102j:plain

オブジェクト名とシート名がごっちゃになるとややこしいので、シート名はご覧のように変えています。

次に、それぞれの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号.xlsmSheet1モジュールに搭載した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

コードの詳細はコメントをご覧くだされ。

こいつを実行しようとすると、

f:id:akashi_keirin:20190223170117j:plain

そもそもコンパイルが通らない。

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

変えたのは(*)のところだけ。

リスト3Worksheet型にしていた変数をObject型に変えた。

こいつを実行すると、

f:id:akashi_keirin:20190223170128j:plain

意図どおりの結果が得られた。

おわりに

実にめんどくさい。