VBA向けのテンプレエンジン「MiniTemplator」を紹介します。
テンプレートにエクセルから情報を流し込んで、ファイルを生成することができます。
このおかげで、プログラミングが最小限に抑えられます。
手軽に品質の良い結果が得られ、かなり助かりました。
「MiniTemplator」の紹介
公式サイト
公式サイトはこちら。
各種言語にむけて配布されています。
私は、VBA向け (Visual Basic (VB/VBA) Version) を選びました。
テンプレートエンジンとは
「MiniTemplator」はテンプレートエンジンの一種です。
そしてテンプレートエンジンとは、「テンプレート(ひな型)となるデータに情報を流し込んで、ファイルを生成するためのライブラリー(コンポーネント)」です。
例えば、こんな感じ。
何が便利なのか?
独立したソフトではないので、プログラミングがゼロになるわけではありません。
何をさせたいかは、自分で書く必要があります。
ただ、都度必要になる下記のような処理は、「MiniTemplator」から機能を呼べばよいだけ。
ごく少ない記述で済みます。
・テンプレを読み込む
・定義どおりに置換する
・出力する・・・など
これを一から作るのは、考えただけでぞっとします。
シンプルで明快なルール
「MiniTemplator」はシンプルでコンパクトだけど、十分に使えます。
テンプレートの文法も簡単なので、覚える手間がほとんどかかりません。
こんなことが出来た
AutoCAD LTや互換CAD(DraftsightやBricsなど)で使うための、「スクリプトファイル」を生成しました。
「スクリプトファイル」とは、図面への処理内容を記述したファイル。大量の図面に処理を適用するために使います。
例えば、dwg形式のファイルが100枚あるとします。
それらを、「バージョンを指定してDXFに変換したい」としましょう。
その場合、100枚分の処理を1つのファイルに記述せねばなりません。
ただし、下記のような条件があります。
- ファイル名の末尾がA3なら、バージョンは2000へ変換する。
- ファイル名の末尾がA4なら、バージョンは2013へ変換する。
こういう条件を加味したスクリプトファイルを、手早く生成できるのです。
最終的に、こんなアウトプットファイルが出来ました。
図面一枚あたり数行のスクリプトを、図面枚数分繰り返して、一つのファイルにすべて記述した(一部可変させながら)
繰り返しの中で一部可変させたのは、ファイルパスとバージョン。難なく成功。
1000行以上のコードが一瞬で生成されるわけです。便利さに驚きました。
動作のようす
★Windows10 64bit、エクセル2016、BricsCADとAutoCAD LTで動作確認しました。
変換対象の図面が入ったフォルダに、下記のファイルを置きます。
- ひな型となるテンプレートファイル
- VBAを仕込んだエクセルファイル
ひな型となるテンプレートファイルはこんな感じ
テンプレートは、図面一枚あたりの処理内容を書いておくだけ。
これをVBAから出す指示で、図面の枚数分繰り返したファイルを生成します。
色付きの部分(${file}や${ver})は、私が任意に設定した変数です。
$と{}で囲むのは文法として決まっているので、従っています。
VBAを仕込んだエクセルファイルはこんな感じ
B列は、上記のひな形の${file}に流し込むためのリストです。
「実行」をポチっとクリックすると、
一瞬で生成完了です。
生成されたスクリプトファイル
ちゃんと100枚分が、条件通りに生成されています。
一枚あたりの18行ほどのコードを、100枚分繰り返して1つのファイルに記述しています。
(更に、ファイル名がA3なら変換バージョンを2000に。A4は2013、という条件でしたね)
さあ、では次からは詳細な使い方を解説していきます。
その前に、使うツールを準備して下さい。
使うツールの準備
MiniTemplator
これがないと始まりません。
各種言語にむけて配布されています。
VBA向け (Visual Basic (VB/VBA) Version) を選んで下さい。
ダウンロードしたら、ZIPファイルを解凍しておいて下さい。
エクセル
VBAを使うので、「開発タブ」を有効にしてください。
そして、「開発」→「Visual Basic」をクリック。
Visual Basicが立ち上がったら、「ファイル」→「ファイルのインポート」をクリック。
先ほどダウンロードしたMiniTemplatorの「MiniTemplator.cls」をインポートして下さい。
ちなみに、コードは「挿入」→「標準モジュール」で追加されるエリアに書き込んでいきます。
テキストエディタ
エンコードによりエラーが出る可能性もあるので、必須といえると思います。
無料で高機能のMeryがおすすめです。
作り方の詳細
ファイルの置き場所
これから説明するファイルは、同じフォルダの中に置く想定です。
最後に実行して作られるファイルも、同じ場所に生成されます。
テンプレートファイルを作る
繰り返すベースとなる、テンプレート(ひな形)を作ります。
ファイルの文法はシンプルです。
拡張子はtxtのテキストファイルとして、保存しておけばOKです。
ファイル名は、「cad-script-template.txt」としておきます。
- 可変部分のカタマリを、beginblockとendblockで囲みます。
- 変数(条件によって可変させたい部分)を、${hogehoge}で表現します。
hogehogeは、自分で好きに決めて下さい。
- 全機能の詳細は、公式サイトのドキュメントに記載されています。
MiniTemplator Class API Documentation
また、AutoCAD LTとBricsCADなど互換CADでは同じスクリプトが動かない可能性があります。
例えば、下記を見て下さい。
どちらも、今回の課題「dwgファイルを、バージョン指定して変換する」スクリプトです。
AutoCAD LTの場合
Autocad LTの場合は、変換後のファイル名はエンターで自動的に決めてくれます。
※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。
BricsCAD V17の場合
しかしBricsCADは、変換後の名前はきっちりと具体的に指示してやらねばなりません。
こういうCADごとの細かい違いにご注意ください。
※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。
VBAを仕込んだエクセルファイルを作る
今回の課題では、下記のような流れで処理します。
- エクセルファイルにファイル名のリストを貼付
- VBAから順次リストを読み出し、テンプレの変数へ流し込む
1. エクセルファイルにファイル名のリストを貼付
まず、エクセルで、変換対象のファイルリストを作ります。
これを、後から作るVBAのプログラムで読み取っていきます。
実行ボタンの作り方は、後述します。
ファイルリストの作り方
ここで、「ファイルリストってどうやって作るの??もしかして手打ち?」と心配になった方。
大丈夫です、自動でできます。
まず、変換対象のdwgファイルを、一つのフォルダにまとめて入れておきます。
次に、下記のバッチファイルのコード5行をテキストエディタでコピペして、「file.bat」とでも名付けて同フォルダに置きます。
※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。
そして、そのbatファイルをダブルクリックして実行します。
すると、「file-list.txt」というファイルが出来ています。
それを開いて、エクセルにコピペすればOKです。
なおbatファイルを見て頂くとわかりますが、わざと拡張子無しのリストを生成する仕様です。
2. VBAから順次リストを読み出し、テンプレの変数へ流し込む
こんな感じのコードで処理しました。
このコードは、エクセルの「開発」タブ→Visual Basicをクリック。
そして、「挿入」→「標準モジュール」をクリックしてできたエリアに書き込んでください。
※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。
1.で作ったエクセルリストがありますよね。そのセルB2から順にファイルリストを読み取って、テンプレートの変数に流し込んでいます。
そして、読み取ったファイル名の条件により、変換バージョンを分岐させています。
なお、テンプレートの読み込みや書き出し、ブロックへの追加はエンジンの規則に従った定型文です。
- 全機能の詳細は、公式サイトのドキュメントに記載されています。
MiniTemplator Class API Documentation
VBAでのコードの流れは、下記サイトを参考にさせて頂きました。
実行ボタンの作り方
「開発」→「挿入」から、フォームコントロールのボタンの絵をクリック。
適当にボタンを配置して下さい。
そうすると、ダイアログが出てきます。
実行させたいプロージャ名を選択してください。
この記事のサンプルコードではmainの中にコードを書きました。
ですので、mainを選択します。
そして、作った実行ボタンをクリックすれば、プログラムが実行されファイルが生成されます。
生成したスクリプトファイルの使い方
スクリプトファイルは、必ず動作前にテストファイルで正常動作を確認してください。
思わぬミス(ファイルの消失)などが発生する可能性があります。
一言でいうと、
「CADを立ち上げて、スクリプトファイルをドラッグアンドドロップするだけ」
です。
または、CADのメニューからスクリプトファイルを実行しても構いません。
例えば、「output-cad-script.scr」というファイルを生成したとしましょう。
まず、CADを立ち上げます。
とりあえず新規作成で空の図面をひらいておきます。
そしてそこへ、先の「output-cad-script.scr」をドラッグあんどドロップします。
すると、処理が実行されます。
VBAでやるメリット
テンプレートエンジンはいろんな言語向けに、様々に存在します。
そのなかで、VBAがおすすめな理由を書いてみました。
親しみやすい
いくらテンプレートエンジンが便利でも、それを操る言語を覚えるハードルが高いと億劫になってしまいます。
しかしエクセルなら、日常的に使っている方は多いはず。
私もCADのカスタマイズやエクセルの自動化でVBAを日常的に触っていて、得意ではなくとも抵抗がありませんでした。
「使ってないからわからない」という方もいるかもしれません。
しかしVBAなら今の時点でわからなくても、エクセルが使えるならすぐに馴染めます。
資料や書籍も豊富です。
私は、この本で勉強しました。
分厚く取っつきにくく感じるかもしれませんが、順を追って丁寧に書かれています。
文中の説明用の細かいサンプルコードも、地味に役立ちますよ。
UIも手軽に作れる
VBAなので、エクセルとの連携は容易です。
そして、そのエクセルのワークシートで最低限のUIを手軽に作れるのが良いです。
パラメータの入力欄など、テンプレートに流し込む情報をエクセル上で表現できます。
実行ボタンやメッセージウインドウの表示なども、手軽に使えますよね。
人に渡しやすい
エクセルは大抵のPCにインストールされています。
ですので、一般的なPC環境であればほぼ誰でも実行が可能です。
pythonにも、jinja2という割と手軽に使えるテンプレートエンジンがあって時々使っています。
しかし一人で使う分には良いですが、python環境がないと実行できないのがネックです。
さいごに
AutoCAD LTではLISPが使えない為、大量の図面処理はとても大変で、昔から良い方法がないものかと悩んでいました。
当初はコマンドプロンプトでFORループを回していました。この方法だと都度AutoCAD LTが立ち上がってしまい難儀していたんです。
そんな中、記事を見られた方から「スクリプトファイルに枚数分の処理を記述すれば良いよ!」という情報を頂きました。
そして、今度問題になるのが「スクリプトファイルをどう作るか」です。
今回出会った「MiniTemplator」を知る前は、自作VBAで生成していました。
単純な繰り返しならこれで賄えていましたが、しかし!
繰り返すスクリプトを変化させたいなど、条件が増えるとお手上げになります。
テンプレートエンジンの作者様に感謝しています。