Sample Site

VBA VBEアドイン1

VbaHeaderEdit

VisualBasic6.0 がギリギリ現役のころ、筆者はMicrosoftOffice製品に付属するマクロ言語 VBA のために、VbaHeaderEdit (以下VHE)というアドインソフトを作成しました。これは当時から作る人が少なかった、IDE環境である VisualBasicEditor(VBE) のアドインとして動作するものです。VB6 の VBE用のものを先に作り上げ、次にOffice用に作り直しましたが、何せネットに挙げられている実例数も乏しく、情報を集めることすら難しいのに、中身が変態的に複雑なので、気が遠くなるほどトライ&エラーを繰り返して作成した覚えがあります。

このアドインは、VBA をコーディングする際、モジュール全体の概要をはじめ、各プロシージャのパラメータや戻り値を含む定型ヘッダコメントの挿入/更新や、統一されたエラートラップを半自動記述(挿入)する機能と、おまけで変数や配列のデバッグライトを超?省力化する機能を持っています。ありがたいことに、現役のOffice製品でも本体の VBE の仕様が大きく変わらないため、いまだに使い続けることができています。

コメンタとしての機能

他人がソースを見て、何をしたいプロシージャなのかわかるためには、ヘッダコメントが必要です。すべてのプロシージャに。ですので、手間を省くためにこれを使います。この機能は定型ヘッダコメントを挿入するだけでなく、ソースに手を入れた更新時、必要なパラメータの名前さえ変えなければ、パラメータが増減しようと、パラメータの型が変わろうと、情報を引き継いで更新することができます。

以下のように使います。

コードを書いて、メニュー/アドインから VHE を起動します。
vba_addin_comment1.jpg
対象プロシージャ内の適当な場所をクリックします。 カーソルが対象プロシージャ内にあればどこでも OK です
vba_addin_comment2.jpg
「2 GetProc」ボタンをクリック。 ダイアログのキャプションがプロシージャ名に変化します。 続いて「3 Write」ボタンをクリック
vba_addin_comment3.jpg
プロシージャのヘッダコメントが挿入されます。 このヘッダコメントに必要事項を書き入れます。
vba_addin_comment4.jpg
ヘッダコメントを書いてから時間が経過し、何らかの事情により、Trim$() と Trim() を 使い分けたくなって、COUNTB のパラメータに optional ではないフラグをもう一つ加え、 さらに戻り値をInteger型に変更したとします。

上記と同じ手順を行うと VHE がこのように「更新」します。
vba_addin_comment5.jpg
手入力した情報はそのままに、戻り値の型、パラメータの順位、パラメータの型、 パラメータの増減(減の場合説明情報は失われる)、「I/O」(プロシージャ内でByRef パラメータを左辺値とすると I/O となる)の変更等は自動で更新します。 手入力情報を維持したまま更新できないのは、既存のパラメータの名前を変えてしまった 場合です。既存パラメータの名前を変えてしまうということは、新たなパラメータが作成 され、既存のパラメータは削除されたものとみなすからです。

さて、モジュール内のすべてのプロシージャにヘッダコメントを付け終わったら、 モジュールのコメントです。以下に別モジュールの例を挙げます
vba_addin_comment6.jpg
宣言部のどこかをクリックします。 宣言部がない場合は仮に「Option Explicit」を入れるか変数を宣言してください。
vba_addin_comment7.jpg
「2 GetProc」をクリックするとキャプションが「ThisModule」に変わります。
vba_addin_comment8.jpg
「3 Write」をクリックすると、すべてのプロシージャの概要情報が集まります。 プロシージャのヘッダコメント同様更新可能です。順位が変わっても増減しても反映されます。

詳しくはマニュアルを参照してほしいのですが、Vector様に置いてあります。 が、5年位前から更新(メンテナンス)していません。win7 までは堂々と更新して アップしておりましたが、さすがに win10 ではリスキーではないかと思うように なりまして、更新を止めています。なにせ VB6 の作品ですから。

エラートラップを半自動記述する機能

統一されたエラートラップをプロシージャ自身に持たせると、エラーを追いかける作業が楽になります。タイプしないでこれを実行するために、この機能を盛り込みました。
以下のように使います。

コードを書いて、メニュー/アドインから VHE を起動します。
vba_addin_err1.jpg
ラジオボタン「error」をクリックします。
vba_addin_err2.jpg
ソースの対象プロシージャをクリック(カーソルを対象プロシージャへ)して 「2 GetProc」ボタンをクリックします。
vba_addin_err3.jpg
キャプションがソース.カーソル位置のプロシージャ名に変わります。 「3 Write」ボタンをクリックします。
vba_addin_err4.jpg
エラートラップが挿入されます。 「On Error Goto ~」が変数宣言の後に挿入されていますが、 定義部直下に変更することも可能です(付属 iniファイル)。
vba_addin_err5.jpg
実際にエラーを起こすと、こんな感じになります。 行番号を付けていないと Erl でエラー行が特定できませんので、Erl は用いていません。 VBE とともにある VBA では、デバッグ環境と作成したソフトウェアがいつも一緒なので、 この機能はありがたくないかもしれません。いえ、デバッガが起動しないので、 要らないですよね、これ。まあ、VB6 用に作ったものの流用なので。 VB6 でコンパイルされたプログラムにはこれが必須なんです。

配列の Debug.Print を簡便にする機能(おまけ)

筆者は VBA コーディング中はいつも VHE を呼び出したままにしています。いつでも最前面に設定してあるので、他のアプリを起動しても、それより前に出てきて多少うざいですが。
この機能は、新たなプロジェクト等で頻繁にテストを行う際に、配列の中身チェックが面倒すぎる(筆者は記録比較ができないローカル/ウォッチが嫌い)ので、後から付け足したものです。
以下のように使います。注:多次元配列には対応していない

あらかじめモジュール変数 deb を宣言しておきます。 Debug.Printしたい配列をコメントで「deb 配列名 for」と書きます。 一般変数であればコメント「deb 変数名」と書きます。 モジュール内に何個書いてあってもかまいません。
vba_addin_deb1.jpg
「ReplaceDeb」ボタンをクリック。
vba_addin_deb2.jpg
各 Debug.Print が一括で適宜展開されます。
vba_addin_deb3.jpg
array_test() を実行するとこのようになります。 ローカル/ウォッチと内容は同じですが、こちらは出力行数が多くなければ ログのように使えます。前の動作がわかるのは便利です。 残念ながらイミディエイトは純然たるアウトプットではなく、対話型のシェル みたいな感じですので表示が200行しかできません。CMDプロンプトみたいに 表示バッファを設定できたらいいのに。なので小さな配列でないとこの恩恵に あずかれないんです。
注:Vector様でダウンロードできるものはプロシージャ名/モジュール名が出ません。