エクセルの VBA で、正規表現(VBScript.RegExp)の .Excute メソッドを使っているプロジェクトにて、不自然に動作が重くなってしまう現象に遭遇しました。
Windows 10 Pro バージョン 2004 (OS ビルド 19041.630) 上で、Microsoft® Excel® for Microsoft 365 MSO (16.0.13328.20262) 32 ビットにて発生。
Excel VBA で VBScript.RegExp の .Execute がやたらと重くなる(百文字程度の置換で1秒前後もかかってしまう問題)https://t.co/mad9v4jyEN
— 風柳 (@furyutei) 2020年11月15日
が、https://t.co/bzrvO4dPJh
の実行でも再現したので、調査中…。
※こちらはExcelやWindowsの再起動でも直らない
実は、以前にも同じ現象が発生していたのですが、そのときには Windows の再起動で発生しなくなったので放置していました。
しかし、今回の場合は Excel や Windows を再起動しても改善が見られなかったため、少し調べてみることにしました。
発生した状況(再現方法)
- 「Microsoft Excel マクロ有効ワークシート」を新規作成
- 標準モジュールを追加し、VBSCript.RegExp の Excute メソッドを使用しているこちらのプロジェクトのソースコードを貼付け
- サンプルツイートのテキスト(【】部分に隠し文あり)を選択してコピーし、A1セルに貼り付けたあと、B1セルに「=ZenDecode(A1)」のような数式を入力(画像1)
なお、この段階では特に遅くは感じない - 一度保存して閉じてから、再度開き、「セキュリティの警告」に対して [コンテンツの有効化] ボタンを押す(画像2)
対策
ワークシートを作成直後には特に重くなかったのに、保存して閉じる→再度開く→[コンテンツの有効化] を実施後に重くなってしまう(その後はずっと重いままとなる)ことに気づいたので、セキュリティ関係の機能の問題ではないかとあたりをつけ、トラスト センターの「信頼できる場所」に、当該マクロ有効ワークシートの場所を追加してみました。- リボンの「ファイル」メニューから、「オプション」→「トラスト センター」で [トラスト センターの設定 (T) ...] をクリック
- 「信頼できる場所」の [新しい場所の追加 (A) ...] で、当該ワークシートを置いてあるフォルダを指定する(必要に応じて、「□ この場所のサブフォルダーも信頼する (S)」にもチェックを入れておく)
注意事項
- 同様の環境であっても、現象が再現しない場合もあります
自分のところでも、同じファイルを、別の PC 上で試しても(「信頼できる場所」に置いていないにも関わらず)特に重くなりませんでした。また、同一 PC 上であっても、ファイルの内容によっては(?)再現しない場合もあるようです。 - 上記の対策は、マクロのセキュリティ関連の設定になるため、「信頼できる場所」に追加するフォルダについては慎重に検討するようにしてください。試して見る場合には自己責任でお願いします。
- あくまで当方個人の環境での対策のため、同様の現象が発生していて対策通りの手順を踏んでも改善されない場合もあるかと思いますが、ご容赦願います。