VBA開発環境をモダンにする - RubberduckとVBEThemeColorEditorの紹介

# VBAのIDEは古のVBE...

なんだかんだでVBAを触る機会が結構あるが、IDEはVBE。

* 少なくともバージョン管理はほしい
* できる限りモダンな開発環境に近づけたい
* 見た目なんとかしたい

ということで色々調べていたら、2つのアドイン・ツールを使うことでかなりそれっぽい感じにできることが分かった。ちなみに環境は windows10(64bit) + office2016(32bit) で確認。

# 紹介するアドイン・ツール

### [RubberDuck](http://rubberduckvba.com/)

VBEを現代のIDEっぽくしてくれるヤバいアドイン。1年前くらいに一度試してみるも、動作がかなり不安定でその時は使うのをあきらめた。
最近バージョン2.2がリリースされていたのでもう一度入れてみたところ、すんなりインストールできて動作もかなり安定している！ということで導入決定。
[2018/06/10時点の安定版](https://github.com/rubberduck-vba/Rubberduck/releases/tag/Rubberduck-v2.2.0.3086)

### [VBEThemeColorEditor](https://github.com/gallaux/VBEThemeColorEditor)

VBAのエディタの色設定はデフォルトでは16色からしか選べない、残念・・・と思っていたら、このツールを利用することでその16色を自由にカスタマイズできるらしい。導入決定。

# 変更履歴の見えるバージョン管理を行う (Rubberduckで実現)

なんといってもまずはバージョン管理。エクセルマクロはそのままではバイナリでバージョン管理できない。大きく以下の2つのアプローチがある。

1. VBEでコードを書く。エクスポートしたコードをバージョン管理
2. コードは好きなエディタで書く。VBEにインポート。

一長一短だと思うが、結局デバッグなどではVBEを使わざるを得ない場面があるだろうということで1を選択。手作業でエクスポートはやってられない。Rubberduckがやってくれる。

#### 1. ディレクトリ構成を決める

バイナリのxlsm,xlsaファイルとエクスポートしたソースコードを管理する必要がある。好みだと思うが、ディレクトリ構成は以下のようにした。(root)以下をGitなどで管理する。

    (root)
    │ MainProgram.xlsm
    │ ClassLibrary.xlam
    └src
        ├MainProgram
        └ClassLibrary

#### 2. コードをエクスポートする

`Ctrl+Shift+E` がプロジェクトエクスポートのショートカット。フォルダ選択で作成しておいた`(root)\src\MainProgram`を選択

#### 3. コミットする

srcディレクトリ以下のコードはテキスト形式なので、差分の確認はこちらで行う。
以後、開発中のコミットでは2と3を行う。


# IDE機能を大幅強化 (Rubberduckで実現)

RubberDuckを導入することで必要な機能がかなり補完される。

### Unit Testing

単体テストを書き、実行し、管理できる。テンプレートを作ってくれるので単体テスト書いたことある人なら直ぐに使えそう。ざっくりとした使い方は

１．`Ctrl+Shift+T`でTestExplorer表示
２．Add->AddModuleでテストモジュール追加
３．CodeExplorerでテストモジュール選択->Renameでテストモジュール名称設定
４．TestExplorerからAdd->TestMethodでテストメソッドを追加
５．テストを書き、TestExplorerから実行

![Test.gif](https://qiita-image-store.s3.amazonaws.com/0/101002/1233bbc3-3a6b-c0dd-ef6e-19bc6fdc2583.gif)


### Code Inspections

* 宣言と使用が離れすぎている
* 小さいスコープにしか利用されていないのにメンバになっている

など「良くないコード」を検出してくれる。更に大抵のものは1クリックで正しい状態に修正してくれる。

![Inspection.gif](https://qiita-image-store.s3.amazonaws.com/0/101002/adac65ef-6bcb-c095-a586-84ea42d973af.gif)


### Refactorings

* リネーム
* インタフェース抽出
* インタフェース実装
* メソッド抽出

など一通り揃っている。特にリネームは置換をひたすらやるストレスから解放されるので大きいと思う。いや、「普通の開発環境」ではそもそもそんなストレス感じないわけだが。

[リネーム]
![Rename.gif](https://qiita-image-store.s3.amazonaws.com/0/101002/9c201cc5-9b1a-c4b7-5e9b-6970babfe329.gif)


### 他にも

##### プロジェクトエクスプローラの上位互換的なCodeExplorer
![CodeExplorer.gif](https://qiita-image-store.s3.amazonaws.com/0/101002/bd029474-8676-2cf2-a93c-78aa78ffd3bd.gif)


##### プロシージャや変数のすべての参照の検索
![Ref.gif](https://qiita-image-store.s3.amazonaws.com/0/101002/894921b8-1343-c612-bdff-3f5cb330a17f.gif)

##### モジュール/プロシージャのインデント整形
![Indent.gif](https://qiita-image-store.s3.amazonaws.com/0/101002/21f83d62-b077-3afa-bf35-bbfd38369753.gif)

など、ストレスを感じていた部分がかなり補完されている。[githubプロジェクト](https://github.com/rubberduck-vba/Rubberduck)を見ると、今も活発に開発が続いており、[Ver.2.3ではオートコンプリート機能も追加される予定らしい。](https://rubberduckvba.wordpress.com/2018/06/05/autocomplete-enhancements/)今後にも期待が高まる！




# 見た目を本当に改善する (VBEThemeColorEditorで実現)

VBAのエディタの色設定はデフォルトではどぎつい16色からしか選べない。あまりにも残念である。・・・と思っていたら、このツールを利用することでその16色を自由にカスタマイズできるらしい。VBE7.dllを書き換えるため、念のためバックアップしておいた方がいいかもしれない（一応このツールもバックアップとってくれてるようだが）。

### VisualStudio2017の濃色テーマっぽいのを作る

改善後のVBEがこちら。
![Theme.png](https://qiita-image-store.s3.amazonaws.com/0/101002/209cdc31-5871-3c36-4064-efdba9c96a0b.png)



#### 1. 導入

[ここ](https://github.com/gallaux/VBEThemeColorEditor/raw/master/VBEThemeColorEditor.zip)からダウンロードして適当に展開。

#### 2. テーマXMLを作成

VBEから選べるのが16色であることには変わりない。その16色自体を変えるのがこのツールがやっていることだ。色の設定はXMLで定義する。例えば以下がVS2017っぽいテーマ。

```xml:VS2017Dark.xml
<?xml version="1.0" encoding="UTF-8"?>
    <VbeTheme name="VS2017" desc="VS2017 Dark Theme">
        <ThemeColors>
	    <Color colorID="1" HexColor="22282a" />
		<Color colorID="2" HexColor="93c761" />
		<Color colorID="3" HexColor="4ec9b0" />
		<Color colorID="4" HexColor="608b4e" />
		<Color colorID="5" HexColor="f1f2f3" />
		<Color colorID="6" HexColor="3b4648" />
		<Color colorID="7" HexColor="8ec763" />
		<Color colorID="8" HexColor="417113" />
		<Color colorID="9" HexColor="dcdcdc" />
		<Color colorID="10" HexColor="7f3640" />
		<Color colorID="11" HexColor="b0af4c" />
		<Color colorID="12" HexColor="E51400" />
		<Color colorID="13" HexColor="D69D85" />
		<Color colorID="14" HexColor="CE9178" />
		<Color colorID="15" HexColor="608B4E" />
		<Color colorID="16" HexColor="B5CEA8" />
      </ThemeColors>
    </VbeTheme>
```

#### 3. VBEThemeColorEditor.exe でDLLを書き換え

exeを起動し、作ったテーマを読み込んで"Apply theme to VBE.DLL"を実行する。これでVBE7.dll（VBEの本体）を書き換えているようだ。VBE7.dllの場所は環境によりまちまちらしい。自分の環境では以下の場所にあった。[Everything](https://www.voidtools.com/)などで検索すればすぐ見つかる。

    C:\Program Files (x86)\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA7.1
    
#### 4. 配色設定を行う

書き換えが成功したらExcelからVBEを開き、オプションから実際の配色設定をいじる。レジストリで一括変更も可能。今回のテーマだと以下の.regファイルで設定可能。
    
```:registry.reg
Windows Registry Editor Version 5.00
    
[HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common]
"CodeForeColors"="14 9 12 9 5 4 2 5 5 5 0 0 0 0 0 0 "
"CodeBackColors"="1 6 1 4 10 1 1 1 1 6 0 0 0 0 0 0 "
```

以上で配色が変更される。

# まとめ

バージョン管理、機能、見た目の3つが大幅に改善でき、素のVBEに比べればかなり良い線いってる気がする。ショートカットもカスタマイズ可能なので、快適に作業できそうだ。

### 参考

* [RubberDuck](http://rubberduckvba.com/)
* [Unit Testing - rubberduck - vba/Rubberduck Wiki](https://github.com/rubberduck-vba/Rubberduck/wiki/Unit-Testing)
* [gallaux/VBEThemeColorEditor: The VBA / VB editor (or VBE) is limited in the 16 colors it can use to render code text. This application replaces the default colors with custom palettes that can be saved and loaded.](https://github.com/gallaux/VBEThemeColorEditor)
* [VBEのコードウィンドウの色を設定する（レジストリ操作）：Excel VBA｜即効テクニック｜Excel VBAを学ぶならmoug](http://www.moug.net/tech/exvba/0150130.html)
* [VBAの本体はどこにあるのか - t-hom’s diary](http://thom.hateblo.jp/entry/2015/09/15/204944)