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` で保存すると警告のみでコードが失われます。