ExcelツールをGit管理するならエクスポートするべき

以前、とあるVBAの開発現場で遭遇したことですが、

その現場では、Excelツールをそのままソース管理ソフトにアップロードして管理していました。

自分は初めてVBAを作る仕事をさせてもらった時から、エクスポートしてソース管理している現場ばかりだったので率直に驚きました。

もし、あなたの現場でもソース管理ソフトにそのままExcelをあげているのであれば、非常にもったいないのですぐに改善したほうが良いかと思います。

なぜGitに直接上げるのが勿体ないのか

繰り返しになりますが、ツールが保持しているソースをすべてエクスポートしてからGitなどにあげるべきです。

Gitなどに直接Excelツールだけをおいておくのが勿体ない理由は以下の2つです。

  • ソースの差分が見れなくなる
  • モジュールの共通化がしにくくなる

ソースの差分が見れなくなる

ExcelはZIP形式のバイナリファイルなので、Gitなどにあげてもソースとして認識されません。

一応、このままでも「いつ誰が修正したのか」という履歴は管理できますし、ソースに問題があった場合に前バージョンを参照することはできるので、管理していないよりは相当マシです。

しかしGitの重要要素であるソース差分の閲覧ができないですし、ソース差分がないとプルリクのレビューも出来ません。

(まあダウンロードして見比べれば無理矢理レビューできないこともないですが…)

エクスポートしない場合

↑そのまま上げただけだと「 Binary file not shown. 」と表示されてしまう…

エクスポートした場合

Excel本体が 「 Binary file not shown. 」 と表示されてしまうのは同じです。

しかし、エクスポートしたソースはテキスト形式なので差分として表示することが出来ました。

これでソース履歴を追いやすいし、レビューの仕組みも作りやすいです。

モジュールの共通化がしにくくなる

もしExcelツールが20個も30個もある職場であれば、同じような処理をしているツールは存在するはずなので共通関数を作るべきです。

何か共通的に修正しなければいけない事項が発生した場合に、全ツールに対して修正するのは面倒ですよね。

例えば令和みたいに元号が追加になったり、消費税の管理をしていたりする場合です。

一番簡単なのは、共通関数が記載されているモジュールを作ってしまうことですね。

上記例では、Commonというモジュールを作成して、その中に共通関数を記載していくようにします。

そして共通処理以外は、Common以外のモジュールに記載をするようにします。(個別ツール側で共通関数の修正は不可)

もし、共通関数に修正があった場合は、Gitから最新の共通関数をダウンロードしてインポートすればいいだけです。

しかし、 Git上にモジュール単位でソースが管理されていなければ、このような共通関数モジュールの仕組みが難しくなります。

(そもそもdll化したりアドインにしろよという意見もあるかもしれませんが…)

WinMergeを使用するとGitにあげたExcelの差分を見れる

ちなみにGitにExcelを直接あげた場合でも、WinMergeというソフトを使用するとソースの差分を見ることが出来ます。

ちなみに非常に見づらいですがシートの差分などを見ることも出来ます。

WinMergeはGitやSVNとも連携できて、差分を比較するのにデフォルトの機能を使うより見やすいのでぜひ入れておくべきツールかと思います。

しかし、WinMergeをいれたとしてもExcelのソースをエクスポートしてからGitにあげるべきだと考えています。

理由は前述した「モジュールの共通化がしにくくなる」ためです。

またWinMergeに出来るのはソース比較のみであり、履歴についてはファイル単位になってしまうので、ソース個別の履歴を見たい時に不便になります。


Gitに上げる度にエクスポートは面倒なのでバッチ化しよう

でもGitにあげる度にエクスポートするのってすごく面倒ですよね。

エクスポートは複数のファイルを指定できず、1ファイルごと実施しなければいけないためです。

ソースの数が増えてくるほど厳しくなってくると思いますし、レビューの度に出し直さなければいけません。

エクスポートとインポートもVBAで簡単に行うことが出来ます。

その方法が以下サイトに記載されています。

私がおすすめしたいのがバッチを使用して出力する方法です。

VBAでやると開発用ソースをツールに仕込むことになりますし、仮に専用のツールを作成するなら、バッチの方法のほうが楽かなと思ったからです。

バッチで出力する方法は下記のサイトで学習しました。

https://qiita.com/aimoriu/items/d6ca634ba7436cff3833

ただし、そのままだとセキュリティの問題で動かないのと、Git管理するなら自フォルダに出したいのでそこだけ修正します。

セキュリティの設定変更

ファイル→オプションをクリックします

セキュリティセンター→セキュリティセンターの設定をクリックします

マクロの設定→VBAプロジェクトオブジェクトモデルへのアクセスを信頼する似チェックを入れます

引用元サイトのサンプルを微修正して、自フォルダに保存されるようにする。

ExportExcelModule.bat

- set EXPORT_PATH="C:\ExcelVBA_SOURCE\Export"
+ set EXPORT_PATH=%~dp0

ExportExcelModule.vbs

54行目以降のselect文を以下のように修正

            Select Case TempComponent.Type
                'STANDARD_MODULE
                Case 1
                    TempComponent.Export strExportPath & "\" & TempComponent.Name & ".bas"
                'CLASS_MODULE
                Case 2
                    TempComponent.Export strExportPath & "\" & TempComponent.Name & ".cls"
                'USER_FORM
                Case 3
                    TempComponent.Export strExportPath & "\" & TempComponent.Name & ".frm"
                'SHEETとThisWorkBook
                Case 100
                    TempComponent.Export strExportPath & "\" & TempComponent.Name & ".bas"
            End Select

これでバッチを実行するだけでGitに上げられる形になりました。

バッチ実行前

バッチ実行後


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)