.. _text-vba: ================================================================ vi で書こう VBA (実践編) ================================================================ .. contents:: :local: ---------------------------------------------------------------- VBA への障壁 ---------------------------------------------------------------- 2012年初までずーっとVBA を避けていた大きな3つの理由が自分にはありました。 バージョン管理が難しい - ソースコードがバイナリ内部に存在し、異なる版の間での差分管理はほぼ不可能 - 外部からの参照引用も非常に難しい。 共有ライブラリ化が難しい - 複数ファイルで利用している同じ内容のモジュールの保守や同期が難しい。 エディタが選べない - 好きなエディタ(vi)でソースコード編集ができない。 これは VBA である限り仕方ないのだろうと思い、ならば、Perl の Win32:API から叩く方がいいよね、と思っていた時代が自分にもありました。 (といっても、IEの自動化実行くらいしかやってませんでしたが、) ---------------------------------------------------------------- 救世主 発見!! ---------------------------------------------------------------- あるとき(2012年2月中旬)、'vba モジュール 共有' で Google ってみると、 id:language_and_engineering さんの `Excel VBAのマクロを,複数のブックから利用する方法 (標準モジュールをブックの外部で管理して,共通ライブラリとして読み込み) `_ という記事が検索にひっかかってきました。 .. image:: ./images/20120831-vba.022.png :width: 640 .. note:: これには、久し振りに興奮しました:-) ---------------------------------------------------------------- 拡張してみました! ---------------------------------------------------------------- ということで、 :ref:`change` の履歴にある通り、id:language_and_engineering さんのコードを参考に独自拡張して :ref:`text-scripting-vba` というものを作り、使いはじめました。 追加した機能はざっとこんな感じです。 1. 手動リロード関数(reloadModule)を追加した。 2. Windows/Mac版どちらの Office でも動作するようにした。 3. ライブラリリストについて下記対応を追加した。 - ../ を使った相対指定(例: ../common/hoge.bas)への対応 - パス区切りなしの指定(例: hoge.bas)への対応 - 絶対指定への対応 - "drivename:" & chr(92) - chr(92) & chr(92) & "server" & chr(92) - /hoge - :hoge - パス区切り文字について、Windowns(chr(92))/Mac(:)/UNIX(/) のどれを使っても良いようにした。 - 改行コードが Cr(Mac) でも CrLf(Windows) でも良いようにした。 4. 定数 ENABLE_WORKBOOK_OPEN の値でファイルオープン時の挙動をON/OFFできるようにした。 5. このソース自体をexportする関数(exportThisWorkbook)を作成した。 6. このExcelファイル自体のUNITテスト用関数を追加してみた。(試験的) 7. 標準モジュールだけでなく、クラスモジュールにも対応するようにした。 ---------------------------------------------------------------- GitHub で公開しました!! ---------------------------------------------------------------- https://github.com/tcsh/text-scripting-vba ---------------------------------------------------------------- Quick Start !!! ---------------------------------------------------------------- - :ref:`text-scripting-vba-quickstart`