見出し画像

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パイプラインでモジュールをエクスポートしてコミットしてほしいです。

ここも先人の知恵を借ります。

VBAのソースを、Gitとかで管理する - Qiita

レガシーな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

_________________________________

執筆者プロフィール:森川 知雄
中堅SIerでテスト管理と業務ツール、テスト自動化ツール開発を12年経験。
SHIFTでは、GUIテストの自動化ツールRacine(ラシーヌ)の開発を担当。
GUIテストに限らず、なんでも自動化することを好むが、ルンバが掃除しているところを眺めるのは好まないタイプ。
さまざま案件で自動化、効率化によるお客様への価値創出を日々模索している。2021年からは技術イベントSHIFT EVOLVEの運営を担当。


お問合せはお気軽に
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/