のぼゆエンジニアリング

ゼロから機械設計を勉強してみたりするブログ

VBA向けテンプレートエンジン「MiniTemplator」の使い方例。簡単にエクセルからCAD用のスクリプトが生成できて感動した!



スポンサーリンク

VBA向けテンプレートエンジン「MiniTemplator」の使い方実例

VBA向けのテンプレエンジン「MiniTemplator」を紹介します。
テンプレートにエクセルから情報を流し込んで、ファイルを生成することができます。

このおかげで、プログラミングが最小限に抑えられます。
手軽に品質の良い結果が得られ、かなり助かりました。

「MiniTemplator」の紹介

公式サイト

公式サイトはこちら。

MiniTemplator - A compact template engine for HTML files

各種言語にむけて配布されています。
私は、VBA向け (Visual Basic (VB/VBA) Version) を選びました。

テンプレートエンジンとは

「MiniTemplator」はテンプレートエンジンの一種です。

そしてテンプレートエンジンとは、「テンプレート(ひな型)となるデータに情報を流し込んで、ファイルを生成するためのライブラリー(コンポーネント)」です。

例えば、こんな感じ。

テンプレートエンジン「MiniTemplator」のイメージ

何が便利なのか?

独立したソフトではないので、プログラミングがゼロになるわけではありません。
何をさせたいかは、自分で書く必要があります。

ただ、都度必要になる下記のような処理は、「MiniTemplator」から機能を呼べばよいだけ。
ごく少ない記述で済みます。

・テンプレを読み込む
・定義どおりに置換する
・出力する・・・など

これを一から作るのは、考えただけでぞっとします。

シンプルで明快なルール

「MiniTemplator」はシンプルでコンパクトだけど、十分に使えます。

テンプレートの文法も簡単なので、覚える手間がほとんどかかりません。



こんなことが出来た

AutoCAD LTや互換CAD(DraftsightやBricsなど)で使うための、「スクリプトファイル」を生成しました。

「スクリプトファイル」とは、図面への処理内容を記述したファイル。大量の図面に処理を適用するために使います。

例えば、dwg形式のファイルが100枚あるとします。
それらを、「バージョンを指定してDXFに変換したい」としましょう。

その場合、100枚分の処理を1つのファイルに記述せねばなりません。

ただし、下記のような条件があります。

  • ファイル名の末尾がA3なら、バージョンは2000へ変換する。
  • ファイル名の末尾がA4なら、バージョンは2013へ変換する。

こういう条件を加味したスクリプトファイルを作成しました。

最終的に、こんなアウトプットファイルが出来ました。

一言でいうと、
図面一枚あたり数行のスクリプトを、図面枚数分繰り返して、一つのファイルを作った(一部可変させながら)」。

繰り返しの中で一部可変させたのは、ファイルパスとバージョン。難なく成功。

便利さに驚きました。

スクリプトファイルの出力イメージ


なお、LTではないAutoCADならば、複数ファイルに適用できる専用ツールがあります。
その場合は、一枚分のみの処理を書いたスクリプトファイルを作ればokなので、この記事の方法は必要ありません。

過去記事参照



動作のようす

★Windows10 64bit、エクセル2016、BricsCADとAutoCAD LTで動作確認しました。

変換対象の図面が入ったフォルダに、下記のファイルを置きます。

  • ひな型となるテンプレートファイル
  • VBAを仕込んだエクセルファイル


ひな型となるテンプレートファイルはこんな感じ

テンプレートは、図面一枚あたりの処理内容を書いておくだけ。
これをVBAから出す指示で、図面の枚数分繰り返したファイルを生成します。

色付きの部分(fileやver)は、私が任意に設定した変数です。
$と{}で囲むのは文法として決まっているので、従っています。

テンプレートエンジン「MiniTemplator」のテンプレ例


VBAを仕込んだエクセルファイルはこんな感じ

実行」をポチっとクリックすると、

一瞬で生成完了です。


生成されたスクリプトファイル

ちゃんと100枚分が、条件通りに生成されています。

一枚あたりの18行ほどのコードを、100枚分繰り返して1つのファイルに記述しています。

(更に、ファイル名がA3なら変換バージョンを2000に。A4は2013、という条件でしたね)

生成したcad向けスクリプトファイルの例

さあ、では次からは詳細な使い方を解説していきます。
その前に、使うツールを準備して下さい。

使うツールの準備

MiniTemplator

これがないと始まりません。

MiniTemplator - A compact template engine for HTML files

各種言語にむけて配布されています。
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」のテンプレ例



注意
ちなみに、AutoCAD LTとBricsCADなど互換CADでは同じスクリプトが動かない可能性があります。
いきなりスクリプトを生成する前に、一枚だけのテストスクリプトを書いて必ず正常動作を確認してください。


例えば、下記を見て下さい。
どちらも、今回の課題「dwgファイルを、バージョン指定して変換する」スクリプトです。

AutoCAD LTの場合

Autocad LTの場合は、変換後のファイル名はエンターで自動的に決めてくれます。

※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。

BricsCAD V17の場合

しかしBricsCADは、変換後の名前はきっちりと具体的に指示してやらねばなりません。
こういうCADごとの細かい違いにご注意ください。

※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。


VBAを仕込んだエクセルファイルを作る

今回の課題では、下記のような流れで処理します。

  1. エクセルファイルにファイル名のリストを貼付
  2. VBAから順次リストを読み出し、テンプレの変数へ流し込む

1.  エクセルファイルにファイル名のリストを貼付

まず、エクセルで、変換対象のファイルリストを作ります。
これを、後から作るVBAのプログラムで読み取っていきます。

実行ボタンの作り方は、後述します。

ファイルリストの作り方

ここで、「ファイルリストってどうやって作るの??もしかして手打ち?」と心配になった方。
大丈夫です、自動でできます。

まず、変換対象のdwgファイルを、一つのフォルダにまとめて入れておきます。

次に、下記のバッチファイルのコード5行をテキストエディタでコピペして、「file.bat」とでも名付けて同フォルダに置きます。

※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。

そして、そのbatファイルをダブルクリックして実行します。

すると、「file-list.txt」というファイルが出来ています。
それを開いて、エクセルにコピペすればOKです。

なおbatファイルを見て頂くとわかりますが、わざと拡張子無しのリストを生成する仕様です。

2.  VBAから順次リストを読み出し、テンプレの変数へ流し込む

こんな感じのコードで処理しました。

このコードは、エクセルの「開発」タブ→Visual Basicをクリック。
そして、「挿入」→「標準モジュール」をクリックしてできたエリアに書き込んでください。

※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。

1.で作ったエクセルリストがありますね。

そのセルB2から順にファイルリストを読み取って、テンプレートの変数に流し込んでいます。

そして、読み取ったファイル名の条件により、変換バージョンを分岐させています。

なお、テンプレートの読み込みや書き出し、ブロックへの追加はエンジンの規則に従った定型文です。


VBAでのコードの流れは、下記サイトを参考にさせて頂きました。


実行ボタンの作り方

「開発」→「挿入」から、フォームコントロールのボタンの絵をクリック。
適当にボタンを配置して下さい。

そうすると、ダイアログが出てきます。
実行させたいプロージャ名を選択してください。
この記事のサンプルコードではmainの中にコードを書きました。
ですので、mainを選択します。

VBAボタンの作り方

そして、作った実行ボタンをクリックすれば、プログラムが実行されファイルが生成されます。



生成したスクリプトファイルの使い方

注意
スクリプトファイルは、必ず動作前にテストファイルで正常動作を確認してください。
思わぬミス(ファイルの消失)などが発生する可能性があります。

一言でいうと、
CADを立ち上げて、スクリプトファイルをドラッグアンドドロップするだけ」 です。

または、CADのメニューからスクリプトファイルを実行しても構いません。 CADスクリプトファイルの実行方法 例えば、「output-cad-script.scr」というファイルを生成したとしましょう。

まず、CADを立ち上げます。
とりあえず新規作成で空の図面をひらいておきます。

そしてそこへ、先の「output-cad-script.scr」をドラッグあんどドロップします。

すると、処理が実行されます。

VBAでやるメリット

テンプレートエンジンはいろんな言語向けに、様々に存在します。
そのなかで、VBAがおすすめな理由を書いてみました。

親しみやすい

いくらテンプレートエンジンが便利でも、それを操る言語を覚えるハードルが高いと億劫になってしまいます。

しかしエクセルなら、日常的に使っている方は多いはず。
私もCADのカスタマイズやエクセルの自動化でVBAを日常的に触っていて、得意ではなくとも抵抗がありませんでした。

「使ってないからわからない」という方もいるかもしれません。
しかしVBAなら今の時点でわからなくても、エクセルが使えるならすぐに馴染めます。
資料や書籍も豊富です。

私は、この本で勉強しました。
分厚く取っつきにくく感じるかもしれませんが、順を追って丁寧に書かれています。
文中の説明用の細かいサンプルコードも、地味に役立ちますよ。

UIも手軽に作れる

VBAなので、エクセルとの連携は容易です。

そして、そのエクセルのワークシートで最低限のUIを手軽に作れるのが良いです。

パラメータの入力欄など、テンプレートに流し込む情報をエクセル上で表現できます。 実行ボタンやメッセージウインドウの表示なども、手軽に使えますよね。

人に渡しやすい

エクセルは大抵のPCにインストールされています。

ですので、一般的なPC環境であればほぼ誰でも実行が可能です。

pythonにも、jinja2という割と手軽に使えるテンプレートエンジンがあって時々使っています。
しかし一人で使う分には良いですが、python環境がないと実行できないのがネックです。

さいごに

ちなみに、今回出会った「MiniTemplator」を知る前、自作VBAで生成していました。
単純な繰り返しならこれで賄えていましたが、しかし!
繰り返すスクリプトを変化させたいなど、条件が増えるとお手上げになります。

テンプレートエンジンの作者様に感謝しています。

関連記事

© 2019 のぼゆエンジニアリング
About記事一覧お問合せ