VBA(Excel VBA言語)

VBAとは

VBA は、Excel や Access などの Office 製品に組み込まれているプログラミング言語です。Officeがあれば追加のインストールなしで動くため、業務部門が自分で作った自動化が長年積み上がっています。

Sub 請求書を出力()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("明細")

    Dim i As Long
    For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
        If ws.Cells(i, 3).Value > 0 Then
            Call 明細を書き出す(ws.Rows(i))
        End If
    Next i
End Sub

「古いから捨てる」で済まないのがVBAの実情です。 業務そのものが VBA に書かれていることがあり、置き換えるにはまず読んで仕様を取り出す必要があります。

現代の開発者が知っておくこと

  • 1始まりの添字 — セルも配列も既定で1から。0始まりの言語から来ると境界を間違えます
  • 型宣言は任意だが必須と思ってよい — Dim を省くと Variant になり、誤りが実行時まで出ません。Option Explicit を先頭に書いて宣言を強制します
  • エラー処理は On Error — 例外機構ではなく、goto に近い分岐です。On Error Resume Next はすべての失敗を握り潰すため、範囲を限定して使います
  • 保存形式 — マクロを含むブックは .xlsm。.xlsx で保存するとコードが警告のみで消えます

壊れやすい書き方

VBAで最も多い不具合は、言語ではなくExcelの操作に依存した書き方から来ます。

壊れやすい安定する
Select / Activate で選択してから操作オブジェクトを変数に取って直接操作
セル番地の直書き(Range("C5"))見出し行から列位置を探す
シート名の直書き名前付き範囲やシートのオブジェクト名
ActiveSheet を前提ThisWorkbook.Sheets("...") を明示

Select を使ったコードは、実行中に人がクリックしただけで壊れます。 記録マクロがこの書き方を生成するため、そのまま残っている資産が非常に多くあります。

Pythonへの置き換えを考えるとき

[[Python]] で置き換える判断は、何が目的かで変わります。

  • 帳票やブックの生成が目的 — [[Excel自動生成]] のライブラリで置き換えられる。VBAを残す理由は薄い
  • 人がExcelを開いて操作する流れの一部 — ボタン1つで動く体験を再現するコストが高い。VBAのまま整えるほうが早いことがある
  • 他システムとの連携が主 — VBAから外に出る処理は脆い。Python側へ寄せる価値が大きい

置き換えの前に現行の入出力を [[CSV]] などで固定してテストにすると、移行後の差分を検証できます。仕様書が無いことがほとんどなので、[[ドキュメンテーション]] を書き起こす作業が実質的な第一歩になります。

初学者向けポイント

  • 変数名・関数名に日本語が使えます。業務用語をそのまま書けるのは可読性の利点ですが、外部連携では扱いにくくなります
  • 実行前に必ずブックの複製で試します。VBAは元に戻す操作が効きません
  • コードはブックの中に埋め込まれるため、[[技術的負債]] として履歴管理が効きにくい状態になります。テキストとして書き出してバージョン管理する運用を足せます

関連技術とのつながり

  • [[Excel自動生成]] — 帳票生成を外部から行う置き換え先
  • [[Python]] — 連携や集計を移す先として現実的な選択肢
  • [[CSV]] — 移行時に入出力を固定して差分を検証する形式
  • [[ドキュメンテーション]] — 仕様が無い資産から仕様を書き起こす工程
  • [[技術的負債]] — ブック内に埋もれたコードは履歴も検査も効きにくい
Q: VBAで `Option Explicit` を先頭に書く理由はどれ?
- [ ] 実行速度が上がるから
- [x] 変数宣言を強制し、綴り誤りを実行前に検出できるから
- [ ] マクロの保存形式が変わるから
解説: 宣言を省くと `Variant` として通ってしまい、誤りが実行時まで表面化しません。

Q: 記録マクロが生成しがちな壊れやすい書き方はどれ?
- [x] `Select` / `Activate` で選択してから操作する
- [ ] オブジェクトを変数に取って直接操作する
- [ ] 名前付き範囲を使う
解説: 実行中に人がクリックしただけで対象がずれます。オブジェクトを直接扱う形へ書き換えます。

Q: マクロを含むブックの保存形式はどれ?
- [ ] .xlsx
- [x] .xlsm
- [ ] .csv
解説: `.xlsx` で保存すると警告のみでコードが失われます。