Excelのテンプレートをモジュールっぽく扱う方法

2013-03-07(Thu) Programming

excel テンプレートにマクロを入れて、それを読み込むと動作可能かを調べてみる。

具体的には

  • テンプレートを読み込む
  • 読み込むもとのVBA側で、テンプレからパブリックな関数やクラスを呼び出す
  • 呼び出したモジュールのものを表示したり使ってみたりする。

結果

どうやら行けました。シートモジュールを使ってゴニョゴニョするだけでした。
@aoshiman さん有難うございます!

https://twitter.com/hrs_sano645/status/308763109730959360

https://twitter.com/aoshiman/status/308768127733358593

https://twitter.com/hrs_sano645/status/308769044335583232

https://twitter.com/hrs_sano645/status/308776981573545984

やり方

ベース(t_base.xls)とテンプレート(t_templa.xlt)とします

テンプレートファイルを作ります

テンプレート内のシートは今回はひとつで。複数もコピーなど工夫すればいけると思います。
ひとまずt_tmpla.xlsを作ります。

テンプレを読み込みたいファイルでテンプレートファイルを読み込みコピーします

t_tmpla.xlsのシート内に以下のVBAコードを入れます。(シートのセルに書くのではなく、VBAのウィンドウを開いて以下略)

[vb]
Public Sub run()
Debug.Print "template run!!"
End Sub
[/vb]

書いたらテンプレートとして保存 => t_tmpla.xltを作っておきます。

ベースファイルに適当なモジュール内に以下を記述

テンプレをコピーした時はコピーしたシートがアクティブらしいので、そこからオブジェクトを取得して、シートオブジェクトのコードを実行したりします。

コードの実行前に開いたテンプレート(というかテンプレから開かれたファイル)を閉じておきます。

[vb]
Sub import_template()
Dim template As Object
Dim import_template As Object

' テンプレートを開く:パスは適当に変更(またはカレントパスを手に入れる方法など適当に取得)
Set template = Workbooks.Open(Filename:="C:\Users\hogehoge\Documents\t_tmpla1.xlt")

' 開いたテンプレートを継承したファイルからシートをコピー
template.Worksheets(1).Copy after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)

' ファイルを閉じる
Call template.Close

' コピーしたばかりのテンプレートはアクティブになるのでそこからオブジェクトを取得
Set import_template= ActiveSheet

' テンプレート内のプロシージャを実行
Call import_template.run

End Sub
[/vb]

テンプレート内のrunプロシージャが動きます。イミディエイトウィンドウ内に文字が出てきますね。この要領で定数を呼び出すこともできそうですね。

考えてみれば大したことは無いのですが、テンプレートをコピーした後にどうやって中の値を取得すればいいか悩んでしまったので。。。

欠点

テンプレートを開くときに一度ファイルが出来ます。が保存することをしないので欠点にはならないか。

なんでこれが必要なのか

テンプレートを呼び出してベースに入力した表データを流し込みたいのですが、台帳とかBOM (部品表)を扱うときに、どの部分にデータを流し込むとか、データを整形(フィルターとか、条件つけて値を置き換えるとか)したりすることがあります。

その時にテンプレートを使うので、テンプレートごとの定義はテンプレート内にかけるといいなと考えていたので調べてみてました。

MVC的、プラグイン的なことをやるにはどうすればいいかなと考えていました。ベース側からテンプレの値やプロシージャのリストを受け付けるプロシージャやメソッドなど用意して置けば、こういう使い方ができるかなと。