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

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

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

この記事では、指定フォルダ配下のVBAコードを含むExcel マクロファイル *.xlsm ファイルから

  • ExportVBAcodeFromXlsm.bat
  • GetObjFmXlsm.exe

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

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

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
しらかば堂

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

利用方法

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

  • %USERPROFILE%\Tools\bat\ExportVBAcodeFromXlsm.bat
  • %USERPROFILE%\Tools\exe\GetObjFmXlsm.exe

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

比較.xlsm

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

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
比較.xlsm の Module1 に対するVBEコード表示画面


そのフォルダ配下に、標準モジュール、クラスモジュール、Sheetモジュール、ThisWorkbookモジュールを含めた全てのモジュールに含まれたVBAコードが抽出され

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
VBAコード抽出後の 比較.xlsm 格納フォルダ


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

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
しらかば堂

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

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
抽出された Module1.bas の内容
【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
しらかば堂

ここでサンプル表示している 比較.xlsm というマクロファイルは知り合いから入手した練習用のVBAコードなので、その内容にあまり意味はありません。

また、

  • 同一フォルダ内に含まれている複数 xlsm ファイル中に同一モジュール名が含まれていると、先に抽出された bas ファイルに上書きされる
  • ツール起動後直ぐに実行が開始されるような xlsm ファイル、すなわち ThisWorkbook モジュール内に Wookbook_Open() が含まれている場合、これを Wookbook_Open_() 等に名称変更して自動起動しないようにしないと、正常にVBAコード抽出できない

ので注意が必要です。

解決できること

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

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

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

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

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
しらかば堂

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

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
VBAコード修正、VBAコード抽出後の 比較.xlsm 格納フォルダ
【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
しらかば堂

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

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
TortouseSVN で ワークスペースの Module1.bas とリポジトリとの差分表示画面
【Windows 環境構築】共同作業がスムーズになる!自宅、会社のワークスペースで Subversion を使ってみよう
【Windows環境構築】Subversion のクライアント TortoiseSVN 環境を整え 開発効率を爆上げしよう
【Windows環境構築】RedmineとSubversionの連携方法とメリットを徹底解説!プロジェクト管理と品質管理を効果的に遂行する方法

読んでほしい方

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

ExportVBAcodeFromXlsm.bat の紹介

保存場所

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

【Windows業務効率化】バッチファイルでツールのフォルダ環境を自動生成しよう
  • %USERPROFILE%\Tools\bat\ExportVBAcodeFromXlsm.bat

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

【Windows業務効率化】バッチファイルの基本テクニックを知ろう

詳細

このバッチファイル ExportVBAcodeFromXlsm.bat は、Excelマクロ有効ブック(.xlsmファイル)内のVBAコードをエクスポートするためのバッチファイルで、カレントディレクトリ内のすべての.xlsmファイルに対し、そのファイル名をパラメータとして GetObjFmXlsm.exe をパラメータ /v 付きで呼び出します。

@echo off
setlocal

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

taskkill /f /im EXCEL.EXE >nul 2>&1

for %%f in (*.xlsm) do (
	 %USERPROFILE%\Tools\exe\GetObjFmXlsm.exe /v "%%~ff"
)

pause
endlocal

ExportVBAcodeFromXlsm.batの簡単な説明

行番号 説明
1 このバッチファイルで echo コマンド を除いた以後の実行コマンドそのもの、あるいはその実行結果を以下のようにコマンドプロンプト上に表示しないように指定
2 一時的な環境変数を作成し、スクリプト内での変更を限定します。
4 GetObjFmXlsm の評価版/有償版識別のためのヘルプ情報を出力します。
6 現在実行中の EXCEL.EXEという名前のプロセスを念のため強制終了します。エラーメッセージは表示せず、結果を無視します。
8-10 カレントディレクトリ内のすべての.xlsmファイルをパラメータとして
%USERPROFILE%\Tools\exe\GetObjFmXlsm.exe /v
つまりVBA抽出機能を繰り返し呼び出します。
12 GetObjFmXlsm の評価版/有償版識別のためのヘルプ情報を確実に参照できるよう、ここでいったんポーズします。必要に応じて削除してください。
13 setlocalで作成した一時的な環境変数を破棄し、元の状態に戻します。

GetObjFmXlsm.exe の紹介

保存場所

バッチファイルと同様に

  • %USERPROFILE%\Tools\exe\GetObjFmXlsm.exe

に保存します。

入手方法

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

【Window業務効率化】バッチファイルとGetObjFmXlsmでExcelのVBAコードを抽出しよう
しらかば堂

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

評価版 有償版
説明 インストーラ入手先
価格 無償 2,000円
利用可能期間 1カ月 無制限
機能 ヘルプ(注1)
.xlsm からの .bas 抽出(注2)
.xlsx または .xlsm からの .pq 抽出(注3)

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

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

(注3) .xlsx または .xlsm からの .pq 抽出例えば Sample.xlsxの中にPowerQuery のM言語によるクエリ定義が存在する場合、/m スイッチを使用してこれらのクエリをクエリ名.pq として抽出します。

起動スイッチ

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

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

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

>GetObjFmXlsm /m sample.[xlsx|xlsm] ... sample.xlsx または sample.xlsm ファイル内からM言語を抽出し、クエリ名.pq を出力します

>

まとめ

この記事では、指定フォルダ配下のVBAコードを含むExcel マクロファイル *.xlsm ファイルから

  • ExportVBAcodeFromXlsm.bat
  • GetObjFmXlsm.exe

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

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

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

【特集】自動化ツールをバッチファイルで統合し 作業をワンクリックで終わらせよう