【Window業務効率化】バッチファイルとGetObjFmAccdbでAccess のVBAコードを抽出しよう

バッチファイルとGetObjFmAccdbでAccess のVBAコードを抽出しよう

この記事では、指定フォルダ配下のAccess プロジェクト *.accdb ファイルから

  • ExportVBAcodeFromAccdb.bat
  • GetObjFmAccdb.exe

というバッチファイルとユーティリティプログラムを利用して、VBAコードを抽出する方法について紹介します。

これらのツールを用いてVBAコードを抽出することで、Accessファイル内のVBAコードの内容をテキスト形式で取得できるほか、Subversion のクライアント TortoiseSVN と連携し、VBAの差分管理ができるようになります。

しらかば堂

こんにちわ。しらかば堂です。
この記事が少しでも皆さんのお役に立てれば幸いです。

利用方法

このバッチファイル、vbsコードを

  • %USERPROFILE%\Tools\bat\ExportVBAcodeFromAccdb.bat
  • %USERPROFILE%\Tools\bin\GetObjFmAccdb.exe

配下に配置し、またこの ExportVBAcodeFromAccdb.bat のコピーを例えば以下のようなターゲットファイル

Sample.accdb

と同じフォルダ配下に配置して、このバッチファイルを起動すると

Sample.accdb の Module1 に対するVBEコード表示画面


そのフォルダ配下に、フォームモジュール、標準モジュール、クラスモジュールに含まれるVBAコードが抽出され

VBAコード抽出後の Sample.accdb 格納フォルダ


次のようにモジュール名.bas という名前でSJIS(Shift JIS)文字コードで保存されます。

しらかば堂

ExportVBAcodeFromAccdb.bat のコピーをターゲットとなるVBAコードを含む*.accdbと同じフォルダ配下に配置するのは、このバッチファイルのダブルクリックでファイル名を指定せずにVBAコードを抽出する利便性を確保するためです。

抽出された Module1.bas の内容
しらかば堂

ここでサンプル表示している Sample.accdb というマクロファイルは動作確認用のVBAコードなので、その内容にあまり意味はありません。

また、

  • 同一フォルダ内に含まれている複数 accdb ファイル中に同一モジュール名が含まれていると、先に抽出された bas ファイルに上書きされる
  • .accdb ファイルの中に autoexec マクロがあると正しくVBAコードが抽出できないので、事前にマクロ名を autoexec_ 等に変更し、自動起動を抑制することが必要です
  • ので注意が必要です。

解決できること

これらのツールと Subversion クライアント TortoiseSVN を利用すると

  1. VBA の含まれた .accdb ファイルの VBAコードに修正をかける
  2. ExportVBAcodeFromAccdb.bat を起動し、VBAコードを抽出する
  3. TortoiseSVN で上記の修正に対する差分を抽出する
  4. 上記の差分も含めた全てをTortoiseSVN を使ってリポジトリにコミットする

といった一連の作業によリ、VBAの差分管理ができるようになります。

そしてこのSubversion が Redmine と連携していれば、さらに問題(チケット)管理と修正したVBAの紐づけができるようになり、個人、チームでのVBA開発の変更の可視化、維持管理に計り知れないメリットを提供します。

しらかば堂

例えばここでサンプルとして紹介している Sample.accdb の Module1 内のVBAコードの 20-21行目をコメントアウトして保存後、この ExportVBAcodeFromAccdb.bat を実行すると TortoiseSVNの機能により変更のあったファイルのアイコンが赤い!に変わります。

VBAコード修正、VBAコード抽出後の Sample.accdb 格納フォルダ
しらかば堂

さらに、TortoiseSVN でModule1.bas の差分比較すると以下のように16-20行目でピンポイントで修正前後のVBAコードが見えるようになります。
凄くないですか?

TortouseSVN で ワークスペースの Module1.bas とリポジトリとの差分表示画面

読んでほしい方

  • Access VBAを使った業務効率化に取り組まれている方
  • Subversion を使った開発リソースの差分管理を実施中、もしくは検討されている方
  • Access VBA マクロの維持管理の継承性を考慮している方、または苦労されている方

ExportVBAcodeFromAccdb.bat の紹介

保存場所

本記事ではこのバッチファイルを以下の記事も参考にしながら

  • %USERPROFILE%\Tools\bat\GetObjFmAccdb.bat

に保存し、そのコピーをVBAコードを抽出したい .accdb ファイルが格納されているフォルダに保存します。%USERPROFILE% については必要に応じて以下の記事も参照ください。

詳細

このバッチファイル ExportVBAcodeFromAccdb.bat は、Accessプロジェクト(.accdbファイル)内のVBAコードをエクスポートするためのもので、カレントディレクトリ内のすべての.accdbファイルに対し、/decompile スイッチ(注1)でVBAコードを未コンパイル状態にしたあと、そのファイル名をパラメータとしてGetObjFmAccdb.exe /v を呼び出してVBAコードを抽出します。

rem @echo off
setlocal

%USERPROFILE%\Tools\exe\GetObjFmAccdb.exe /h

taskkill /f /im msaccess.exe >nul 2>&1

for %%f in (*.accdb) do (
    "%%~ff" /decompile /x exit
    %USERPROFILE%\Tools\exe\GetObjFmAccdb.exe /v "%%~ff" 
)

pause
endlocal

ExportVBAcodeFromAccdb.bat の簡単な説明

行番号 説明
1 このバッチファイルで echo コマンド を除いた以後の実行コマンドそのもの、あるいはその実行結果を以下のようにコマンドプロンプト上に表示しないように指定
2 一時的な環境変数を作成し、スクリプト内での変更を限定します。
4 GetObjFmAccdb の評価版/有償版識別のためのヘルプ情報を出力します
6 現在実行中の msaccess.exe という名前のプロセスを念のため強制終了します。エラーメッセージは表示せず、結果を無視します。
8 現在のフォルダ内のすべての .accdbファイルに対して11行までの処理を繰り返すためのループです。
9 %%~ff で指定された現在処理中の.accdb データベースに対しVBAコードをデコンパイル(注1)します。”~”は指定されたパラメータから “” を取る修飾子です(注2)。
10 %%~ff で指定された現在処理中の.accdb データベースをパラメータとして
%USERPROFILE%\Tools\exe\GetObjFmAccdb.exe /v
つまりVBA抽出機能を呼び出します。
13 GetObjFmAccdb の評価版/有償版識別のためのヘルプ情報を確実に参照できるようここで一旦ポーズします。必要に応じて削除してください。
14 setlocalで作成した一時的な環境変数を破棄し、元の状態に戻します。
参考情報

(注1) /decompile スイッチはAccess の起動スイッチの一つで、VBA抽出の前に既にコンパイル済のVBAコードを未コンパイル状態に戻します。

ここではこの /decompile スイッチを /x exit スイッチと一緒に利用し、以下の exit マクロを呼び出し Access を終了するところまでを一気に実行しています。

Sample.accdb 内exit マクロ

詳細については必要に応じて以下の記事も参照ください。


(注2) バッチファイルのパラメータの修飾子の使い方については必要に応じて以下の記事も参照ください。

GetObjFmAccdb.exe の紹介

保存場所

バッチファイルと同様に

  • %USERPROFILE%\Tools\exe\GetObjFmAccdb.exe

に保存します。

入手方法

この GetObjFmAccdb.exeファイル はしらかば堂が開発したユーティリティプログラムで以下の2種類のインストーラを準備しており、インストーラを使って上記のフォルダに GetObjFmAccdb.exe として保存可能です。

しらかば堂

まず無償の評価版でその動作、効果を体感して頂き、気に入って頂けた方は有償版の購入をご検討くださいね。

評価版 有償版
説明 インストーラ入手先
価格 無償 3,000円
利用可能期間 1カ月 無制限
機能 ヘルプ(注2) 〇 〇
.accdb からの .bas 抽出(注3) 〇 〇
.accdb からの .sql 抽出(注4) 〇 〇
.sql からの .bas 生成(注5)   〇 〇

(注2) ヘルプ … この GetObjFmAccdb コマンドで利用可能なコマンドスイッチ、使い方を表示します。

(注3) .accdb からの .bas 抽出 … 例えば Sample.accdb の中に VBA コードを含むフォームモジュール、標準モジュール、クラスモジュールが定義されているとき、/v スイッチを使用してこれらのモジュールからVBAコードを モジュール名.bas として抽出します。

(注4) .accdb からの .sql 抽出 … 例えば Sample.accdb の中にクエリ定義が存在する場合、/q スイッチを使用してこれらのクエリをSQLテキスト クエリ名.sql として抽出します。

(注5) .sql からの .bas 生成 … /c スイッチを使って上記機能で抽出された クエリ名.sql を入力とした VBA スニペットコード クエリ名.bas を生成します。

起動スイッチ

Windows 10 のコマンドプロンプト配下でこの GetObjFmAccdb.exe のヘルプ機能を実行すると以下のようになります。

>GetObjFmAccdb /h

GetObjFmAccdb.exe : ver 1.230 (2023/10/07 06:15:48)

使用方法:

>GetObjFmAccdb /h              ... このヘルプを出力します

>GetObjFmAccdb /v sample.accdb ... sample.accdb ファイルからVBAコードを抽出し、モジュール名.basを出力します

>GetObjFmAccdb /s sample.accdb ... sample.accdb ファイル内のクエリをSQLとして抽出し、クエリ名.sqlを出力します

>GetObjFmAccdb /c sample.sql   ... sample.sql ファイルをVBA変換し、sample.basを出力します

>

まとめ

この記事では、特定のフォルダ内にある「*.accdb」形式のAccessプロジェクトファイルに含まれるクエリを抽出する方法を紹介しました。

具体的には、

  • GetObjFmAccdb.bat 
  • GetObjFmAccdb.exe

というバッチファイルとユーティリティプログラムを使用して、クエリをSQLファイルとして取り出し、さらにそのSQLファイルからVBAのスニペット(注1)を生成する手順を説明しました。

これらのツールを用いて*.accdb ファイル中に含まれるクエリをテキスト形式のSQLファイルやVBAのスニペットとして保存しておくことで、Accessファイル内のクエリをSubversion のクライアント TortoiseSVN による差分管理ができるようになります。

また将来的にあなたの Access ツールをアップサイジングし、SQL Server をバックエンドとしたユーザー向けのフロントエンドとしてリファクタリングする際 、このVBAのスニペットの再利用があなたの生産性を爆上げすることは確実です。

この記事が少しでも皆さんのお役に立てれば幸いです。