Excel VBAなどの開発環境は、たいていVisual Basic Editorです。

しかし、なんでもEmacs上でやらないと病気になってしまう、 もやしな人間たちにとってはEmacsでVBAが書きたいところ。

というわけで、無謀にもEmacsでVBAの開発がでいないものか、調べてみました。

visual-basic-mode.el

visual-basic-mode.elというものを見つけました。

emacswikiからダウンロードして、ロードパスの通った場所に配置します。init.elにも以下を記述。

(autoload 'visual-basic-mode "visual-basic-mode" "Visual Basic mode." t)
 (setq auto-mode-alist (append '(("\\.\$latex frm\\|bas\\|cls\$$" .
                                 visual-basic-mode)) auto-mode-alist))

VBAのファイルがハイライト表示される。

text-scripting-vba

Excel VBAのコードのインポート・アウトポートを簡単にできる。そうすると、

  • ViやEmacsでコードがかける
  • バージョン管理ができる
  • TDDでコーディングができる

と、いろいろなメリットがある。

本サイトは、以下。

使い方

xlsm拡張子のExcelデータを新規作成。test.xlsm

開発タブからVBE起動(Alt+F11でも)。 開発タブはデフォルトで隠されているので、表示されていなければオプションから表示させる。

ツールバーのファイル -> インポートを選択。 以下から落としてきたThisWorkbook.clsをインポート。

ちなみに、文字コードがUTF-8なので、Shift-Jisに変換したほうがよい。変換方法は以下。

nkf -s ThisWorkbook.cls > ThisWorkbook_sjis.cls

ExportThisNotebokとReloadModuleのマクロが追加される。

標準Moduleに追加されるので、その内容をThisWorkBookに切り取り・貼り付けをする。

コードを書く

サンプルとしてコンナコードを書く。./src/hello.bas

Sub Hello()
  MsgBox ("Hello VBA")
End Sub

libdef.txtを作成。ここに読みこむソースのパスを相対パスで記述。

./src/hello.bas

マクロ(F5 or Alt+F8)のReloadModuleを実行すると、 先ほど作成したhello.basが取り込まれる。

こんなふうにすれば、Emacsで編集して取り込んでテストということが可能。

VB Lite Unit

VBAで TDDを実施するためのツールとして、VB Lite Unitがある。

詳しくは過去記事参照。

vbasense.el

vbasenseなるものは、オムニ補間ができるとのこと。Special Thanks.

el-getからインストールします。init.elにも以下を追加。

(require 'vbasense)

;; キーバインド
(setq vbasense-popup-help-key "C-:")
(setq vbasense-jump-to-definition-key "C->")

;; 必要に応じて適宜カスタマイズして下さい。以下のS式を評価することで項目についての情報が得られます。
;; (customize-group "vbasense")

;; 推奨設定を行う
(vbasense-config-default)

M-x vbasense-load-libraryを実行したときに、 [VBASense] Not yet regist TLBINF32.DLLというエラーがでることがある。

ただし、自分の環境ではどうも動かし方がわかりませんでした。 TLBINF32.DLLの登録方法がわからずに導入は挫折、残念。

windows7 64bitだと、ダメなのかな?

C:\Windows\SysWOW64>regsvr32.exe TLBINF32.DLL

vbasense-tli-filesに自分の環境のパスを変更しても、うまくパスをみつけてくれない。 chkTLI.vbsをNop応答にして、だましで少しつかってみる。

Excelenium

この記事とはまったく関係ないけれども、このツールがとてもおもしろそうなので、memo。

ExcelとSeleniumを組合せたもので、Excelのテスト仕様書からSeleniumを実行できる。しかも、OSSとか。