VBAだってGitでモジュール管理したい
どうも自動化アーキテクトの森川です。
卵はどちらかといえば白身が好きな方ですが、どうやらそれは我が家が超固ゆで派で、いつも黄身がパサパサで月のミニチュアの様だったからだと思います。今では半熟卵が大好きです。
数年前にとある中堅Excel王国からSHIFTに転職した自分としては、なるべくExcelマクロやVBAには触れずに純粋なプログラミング言語やフレームワークを触って過ごしたいと常々思っています。
しかしながら望むようにはならないものです。
VBAであれこれExcelのIN/OUTを自動化したり、COMコンポーネントで自動処理したり、まだまだMS-Officeと業務は切っても切れない我々人類なのですね。
先日もとある自動ツールをVBAで開発していましてGitでバージョン管理していましたが、なにぶんExcelファイルはZIPアーカイブみたいなものですから変更履歴がさっぱり見えない。
コミットの変更箇所を見ようとして
「どれどれ、はいクリック」
「見れないってさ!」となります。
これではどの部分を修正したのかさっぱり見えません。
モジュール毎にファイルとして管理したほうが良さそうです。
VBAのモジュールはVBE(Visual Basic Editor)から手動でポチポチとエクスポートできますが数が多いとやってられません。
ということで自動化。ここは先人の知恵を借ります。
標準モジュール等の一括エクスポート | Excel作業をVBAで効率化
記事を参考にして一括ExportするVBAのプロシージャを標準モジュールに一つ書いて実行するだけ。
あとは出力されたモジュールをコミットすればGitLab上から見えるようになります。
普通のプログラム言語みたいにSide By Sideで色付きで表示されるのがうれしいです。
Inlineにしてコメントを書いてみたり。
作業所要時間(約15分)
もっと楽をしたい
欲深き人間はさらなる効率化を考えたくなるというもの。
ExcelファイルをコミットしたらCIパイプラインでモジュールをエクスポートしてコミットしてほしいです。
ここも先人の知恵を借ります。
レガシーなWSF(Windows Script File)でやるか、pythonを使うか。
むむむ。
リソース節約のためにもLinuxで動くpythonにしてみましょう。
これまた先人はとっくに到達していました。
ExcelマクロのVBAソースコードをAzure DevOpsでバージョン管理する方法 - by Takeru Saso - Medium
Azure Pipelinesで実現されています、脱帽。しかも日本語文字化けする問題にもご自身で対応されているとか。脱帽Ⅱ
このまま終わっては悔しいのでCircieCIでやってみることにしました。(それに何の意味があるのかは聞かないでください)
恒例のパイプライン晒しです。
#
# YAML to extract VBA source files for CircleCI
#
version: 2.1
jobs:
commit-vba-modules:
docker:
- image: cimg/python:3.10.2
environment:
TARGET_DIR: './'
VBA_DIR: 'modules'
steps:
- checkout
- add_ssh_keys:
fingerprints:
- "${SSH_FP}"
- run:
name: Install extract_vba_source.py
command: |
python -m pip install pip --upgrade
pip install pipenv
git clone https://github.com/takeruko/extract_vba_source.git
- run:
name: Extract VBA source files
command: |
export PIPENV_PIPFILE=$(pwd)/extract_vba_source/Pipfile
pipenv install
pipenv run python ./extract_vba_source/extract_vba_source.py \
--dest ${VBA_DIR} \
--src-encoding='shift_jis' \
--out-encoding='utf8' \ # 再帰処理なら --recursive
${TARGET_DIR}
- run:
name: Commit vba source files
command: |
rm -fr ./extract_vba_source
git config --global user.email "${USER_MAIL}"
git config --global user.name ${CIRCLE_USERNAME}
MESSAGE=$(git log -1 --pretty=format:%s)
git add ${TARGET_DIR}
git commit -m "Extracted VBA source files(${MESSAGE}) [skip ci] #${CIRCLE_BUILD_NUM}" || true
git push origin ${CIRCLE_BRANCH} || true
workflows:
version: 2.1
build_and_test:
jobs:
- commit-vba-modules:
filters:
branches:
only:
- main
- /.*vba.*/
上述のextract_vba_sourceでおおかたの処理をまとめられていますので、処理の流れについては省略します。
実行結果
ブランチが更新されるとジョブが走ります。
成功です。
これでマクロファイルをリモートにプッシュするだけでモジュールが更新されるようになりました。
少しは21世紀らしくなったと思います。
更に欲を言えば、Azure PipelinesからCircleCIへパイプラインスクリプトを自動変換するツールとかあったらいいのに…
などと欲深い思いが尽きないところで今日はこの辺で。
駄文におつきあいいただき深謝でございます。
作業所要時間(約60分)
参考:Migrating from Azure DevOps - CircleCI
_________________________________
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/