現在、Microsoft 365のアップデート「Version 2508」以降を適用した環境において、これまで正常に動作していたExcelマクロが「Assertion Failed!」というエラーで停止するトラブルが急増しています。この原因は、Microsoftが進めているWindows内での「VBScript」の段階的廃止に伴う、ライブラリの仕様変更にあります。
VBA(Excelマクロ)自体が廃止されるわけではありませんが、多くのマクロが文字列処理やファイル操作のために呼び出している「VBScript.RegExp(正規表現)」や「Scripting.Dictionary(連想配列)」などの部品が、OSの変更によって不安定になっています。本記事では、現在発生している実行時エラーの具体的な回避策と、将来的な完全廃止を見据えた技術的な書き換え手順について詳説します。
結論:今すぐエラーを回避する方法
正規表現(RegExp)を使用しているコードでエラーが出る場合、「レイトバインディング(CreateObject)」から「アーリーバインディング(参照設定)」に書き換えることで、当面の動作を安定させることが可能です。具体的なコード例は、第4章で解説します。
目次
1. VBScript廃止の背景とExcelマクロへの影響
VBScript(Visual Basic Scripting Edition)は、1996年にリリースされた歴史あるスクリプト言語です。Microsoftはセキュリティ強化とシステムモダン化のため、Windows 11以降、このVBScriptを段階的に削除する方針を明確にしました。これは、古い技術に依存する脆弱性(リモートコード実行などのリスク)を排除することが主な目的です。
なぜVBAに影響が及ぶのか
VBAは言語仕様として、高度な正規表現や連想配列を直接サポートしていません。そのため、開発現場ではWindowsのシステムファイルである「vbscript.dll」や「scrrun.dll」を外部ライブラリとして呼び出す手法が一般的でした。MicrosoftがOSからこれらの部品を「オンデマンド機能(FOD)」へ切り分け、さらに内部コードの整理を始めた結果、呼び出し側のVBAで整合性が取れなくなり、エラーが発生しています。
2. 発生しているエラーの技術的詳細:Version 2508問題
特に混乱を招いているのが、OfficeのVersion 2508以降で発生する「Assertion Failed!(表明の失敗)」というRuntimeエラーです。これは主に、VBAから「レイトバインディング(実行時バインディング)」で正規表現オブジェクトを生成しようとした際に発生します。
不具合のメカニズム
通常、VBAでオブジェクトを生成する際は、以下の記述がよく用いられます。
Set re = CreateObject("VBScript.RegExp")
この記述は、実行時にシステム内のレジストリを参照してDLLを特定しますが、VBScriptの廃止フェーズ1によって関連モジュールが分離された結果、この紐付けプロセスで内部的なメモリ矛盾やアクセス違反が生じ、C++ランタイムのエラーが引き起こされる事態となっています。これは単なるマクロのバグではなく、OSとアプリケーションの連携レベルでの仕様変更に起因するものです。
3. VBScriptコンポーネントへの依存度チェック
自社のExcel資産が今回の廃止の影響を受けるかどうかは、コード内の特定のキーワードを検索することで判断できます。以下のコンポーネントを使用している場合、対策が必須です。
| コンポーネント名 | 主な用途 | キーワード(検索用) |
|---|---|---|
| VBScript.RegExp | 正規表現によるパターンマッチング、置換 | RegExp, CreateObject(“VBScript.RegExp”) |
| Scripting.Dictionary | キーと値のペア管理(連想配列) | Dictionary, Scripting.Dictionary |
| Scripting.FileSystemObject | ファイル、フォルダの作成・コピー・移動 | FileSystemObject, FSO |
4. 具体的なエラー回避策:アーリーバインディングへの書き換え
最も推奨される即効性のある対策は、参照設定を利用した「アーリーバインディング(事前参照)」への切り替えです。これにより、実行時ではなくコンパイル時にライブラリの紐付けが完了するため、Version 2508特有のAssertionエラーを回避できます。
手順1:参照設定の変更
- Visual Basic Editor(VBE)を開きます。
- 上部メニューの「ツール」から「参照設定」を選択します。
- 一覧から「Microsoft VBScript Regular Expressions 5.5」を探し、チェックを入れます(DictionaryやFSOの場合は「Microsoft Scripting Runtime」を選択)。
手順2:コードの修正
参照設定を行うことで、オブジェクトを「New」キーワードで直接生成できるようになります。以下の通りリライトを行ってください。
' 【修正前:エラーが発生しやすいレイトバインディング】
Sub OldMethod()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
' ...処理...
End Sub
' 【修正後:安定動作が期待できるアーリーバインディング】
Sub NewMethod()
' 参照設定済みであることが前提
Dim re As RegExp
Set re = New RegExp
With re
.Global = True
.IgnoreCase = True
.Pattern = "[a-zA-Z0-9]+"
End With
' ...処理...
End Sub
5. 将来を見据えた移行戦略:Pythonと標準機能への転換
アーリーバインディングによる対策は、あくまでVBScriptのDLLがシステム内に存在している間だけ有効な「延命」に過ぎません。Microsoftのロードマップによれば、最終的にVBScriptはWindowsから物理的に削除されます。その際、上記の手順を行っていてもマクロは動作しなくなります。
① Python in Excel への移行
Microsoftが現在最も推奨しているのが「Python in Excel」の活用です。Pythonには標準で強力な正規表現ライブラリ(reモジュール)が含まれており、Windows OSのコンポーネント廃止の影響を受けません。複雑な文字列処理やデータ加工を行っているマクロは、Pythonへの移植を計画すべきタイミングと言えます。
② VBA標準機能への立ち返り
ライブラリへの依存をなくすため、VBA標準の演算子や関数でロジックを再構築する方法もあります。
- Like演算子:簡易的なワイルドカード検索であれば、正規表現を使わずに「If 文字列 Like “[A-Z]*” Then」といった記述で対応可能です。
- Collectionオブジェクト:データの重複排除などが目的であれば、Dictionaryの代わりにVBA標準のCollectionを使用することで、依存関係を解消できます。
まとめ:今すぐマクロ資産の「生存確認」を
VBScriptの廃止は、長年放置されてきた企業内マクロ資産(シャドーIT)にとっての大きな転換点です。今回のVersion 2508で発生したトラブルは、単なるバグの兆候ではなく、システムのアーキテクチャそのものが変化している証拠です。
まずは、業務上不可欠なマクロをリストアップし、VBScript.RegExp等の記述がないか「棚卸し」を急いでください。一時的な回避策としての「参照設定の変更」を適用しつつ、並行してPython等の次世代技術への移行準備を進める。これが、Microsoftの冷徹な仕様変更に振り回されず、業務の継続性を守る唯一の道筋です。
