【こんな時どうする?エクセルVBA 】 非Python編

普段はPythonを学んでいるけれど、「会社や現場ではExcel VBAを避けられない」という人へ。本記事は、Pythonで解決したい気持ちを持ちつつも、まずはVBAで切り抜けたい場面に出会ったときに役立ちます。

この記事のゴールは「VBAの壁にぶつかったときに、どうマインドを切り替え、最小限の工夫で前に進むか」を学ぶこと。
さらにPython的な視点(再利用・保守・柔軟性)も意識した解決法に触れていきます。

目次

なぜ“非Python編”をPythonブログに書くのか?

「Pythonを勉強しているのに、現場で求められるのはVBA」というギャップは、本当に多くの人が直面します。学習のモチベーションはPythonにあるのに、業務で必要とされるのは「マクロで処理を組んでほしい」というVBA。ここで「せっかくPythonを学んでいるのに」と落ち込んでしまう人もいます。

しかし、このギャップは実はチャンスでもあります。

なぜなら、Python的な考え方をVBAに持ち込むことで、ただのVBAスクリプトが「後でPythonに移植しやすい下地」になるからです。

一時的にVBAで対応

  • 配列で一括処理する → Pythonならリスト内包表記で書き換えやすい
  • 遅延バインディングで環境依存を減らす → Pythonでの標準ライブラリ優先と同じ発想
  • 例外処理やガード変数を置く → Pythonのtry/exceptやフラグ管理と同じ

つまり「一時的なVBA対応」も、将来のPython実装にそのまま橋渡しできます。
現場での経験を無駄にせず、VBAの知識をPython学習に逆輸入するつもりで取り組むと、学びが何倍にも広がります。

VBAに取り組むときのマインドセット

  • 「一時対応」と割り切る:完璧を求めず、最低限動かす。
  • 「Pythonで書くならどうするか」と比べる:VBAコードを見直す良い練習になる。
  • 「共通する考え方」を探す:配列、辞書、参照、例外処理。言語が違っても根本は同じ。

症状別「こんな時どうする?」(Python的に考える)

1) マクロが動かない

環境依存を意識する
Pythonでもライブラリや仮想環境の違いで動かないことがある。VBAは保存形式やセキュリティ設定を最初に確認。

2) Missingエラー

importの違いをイメージ
VBAの参照設定はPythonのimportに近い。遅延バインディングは「標準ライブラリに寄せる」発想。

3) 空配列でUBoundエラー

len()と同じ発想で守る
空リストでも落ちないPythonに慣れている人は、「空配列チェック関数」を作って補うと安心。

4) シート名が変わって壊れる

変数参照に置き換える
Pythonで変数を使うのと同じで、VBAもCodeNameで“固定ハンドル”を持つ。

5) ループが遅い

配列処理はPythonのリスト内包に近い
VBAも配列に取り込んで一括処理すれば「for文の遅さ」を避けられる。

6) OneDriveで動かない

パスは常に動的に
Pythonでos.path.joinを使うように、VBAでもThisWorkbook.Pathや環境変数で柔軟に。

7) 64bit Declareが落ちる

バージョン差異は if 文で切り替え
#If VBA7 ThenはPythonでの条件分岐と同じ考え方。

8) イベントが暴走

フラグ管理で守る
Pythonの再帰処理を止めるときと同じく、ガード変数で制御。

9) CSV文字化け

encoding指定を忘れない
Pythonでopen(file, encoding="utf-8")を意識するように、VBAもコードページを指定。

10) 列構成が変わる

dict的発想
見出しをキーに列を探すのは、Pythonで辞書のキーを使うのと同じ。

VBAからPythonへシフトするときのヒント

  • 配列処理 → list comprehension
  • Dictionary → dict
  • File操作 → with open
  • エラー処理 → try/except

付録:両者の対応表で学び直す

VBAPython
UBound/ LBoundlen()
Dictionarydict
On Errortry/except
ThisWorkbook.Pathos.getcwd() / __file__
Select Casematch/case (3.10~)

コード比較:VBAとPythonで同じ処理を書くと?

例:範囲からユニーク値を取り出す

VBA版

Function UniqueValues(rng As Range) As Collection
    Dim dict As Object, c As Range
    Set dict = CreateObject("Scripting.Dictionary")
    For Each c In rng
        If Not dict.exists(c.Value) Then
            dict.Add c.Value, 1
        End If
    Next
    Set UniqueValues = dict.keys
End Function

Python版

import openpyxl

wb = openpyxl.load_workbook("sample.xlsx")
sheet = wb.active

values = [cell.value for cell in sheet["A1:A10"]]
unique_values = list(set(values))
print(unique_values)

発想は同じ。
「辞書や集合でユニークを取る」という共通点が見えると、VBAとPythonをつなげやすいです。

結論:Python的に考える

VBAに出会うのは「Pythonだけではまだ解決できない現場の事情」に向き合うチャンス。
VBAでしのぎつつ、Python的に考えることで、両方の世界を橋渡しできます。焦らず、比べながら、一歩ずつ進んでいきましょう。

この記事を書いた人

目次