「非表示モジュール内でコンパイルエラーが発生しました」mso.dllの原因と解決方法

Excelを開いた瞬間やマクロを実行しようとしたとき、「非表示モジュール内でコンパイルエラーが発生しました。mso.dll」というエラーが表示されて困っていませんか?
このエラーはVBA(Visual Basic for Applications、Excel上で動くプログラム)のコードに問題があるときに発生します。
原因はいくつかあり、それぞれ対処法が異なるため、この記事では原因ごとに順番に解説します。

スポンサーリンク

エラーメッセージの意味

「非表示モジュール内でコンパイルエラーが発生しました」というメッセージは、Excelファイルに埋め込まれたVBAコードをコンパイル(実行前の変換処理)しようとした際にエラーが起きたことを示しています。

「mso.dll」とは、Microsoft Officeの共通機能を提供するシステムファイルのことです。
エラーメッセージにこのファイル名が含まれる場合、Officeのビット数の不一致やファイルの破損が関係している可能性が高くなります。

「非表示モジュール」という言葉が示すとおり、エラーが発生しているVBAコードはパスワードで保護されているため、具体的なエラー箇所が画面に表示されません(Microsoft公式ドキュメントより)。
そのため、自分でコードを修正できる場合と、ファイルの作成者に対応を依頼する必要がある場合に分かれます。

主な原因と確認方法

このエラーが発生する原因は、大きく4つに分類できます。

原因症状の特徴対象者
32bit→64bit版への切り替えOffice更新・PC買い替え後に急に発生VBAコードを持つファイルを使う全員
参照設定の欠損(MISSING)特定のファイルを開くときだけ発生マクロ付きファイルを別PCで開くとき
アドインの競合Excel起動時に毎回発生アドインを複数インストールしている場合
.exdファイルの破損Office更新後に突然発生ActiveXコントロールを使うファイル

まずは「いつからエラーが出るようになったか」を確認してみましょう。
Office 365やOffice 2021にアップデートした直後であれば、原因①(ビット数の不一致)が最も可能性が高いです。


対処法①:Officeのビット数を確認する(最も多い原因)

なぜビット数でエラーが起きるのか

32bit版のExcel向けに書かれたVBAコードは、64bit版のExcelではそのまま動きません。

以前はOfficeの既定インストールが32bit版でしたが、現在のOffice 365やOffice 2021では64bit版が既定になっています(Microsoft公式サイトより)。
PC買い替えやOffice再インストールのタイミングで、気づかないうちに64bit版に切り替わっているケースが多いです。

Officeのビット数を確認する手順

  1. Excelを開く
  2. 「ファイル」→「アカウント」→「Excelのバージョン情報」をクリックする
  3. 画面に「64ビット」と表示されているか確認する

64bit版のExcelで、古い32bit向けのVBAコードを含むファイルを開くと、このエラーが発生します。

VBAコードを修正できる場合の対処法

VBAコードにアクセスできる場合は、DeclareステートメントにPtrSafeキーワードを追加することで解決できます。

修正前(32bit向け):

Declare Function SetCurrentDirectory Lib "kernel32" Alias _
    "SetCurrentDirectoryA" (ByVal CurrentDir As String) As Long

修正後(64bit対応):

Declare PtrSafe Function SetCurrentDirectory Lib "kernel32" Alias _
    "SetCurrentDirectoryA" (ByVal CurrentDir As String) As Long

32bit・64bitの両環境で動くようにしたい場合は、以下のように条件分岐を使います。

#If VBA7 Then
    Declare PtrSafe Function SetCurrentDirectory Lib "kernel32" Alias _
        "SetCurrentDirectoryA" (ByVal CurrentDir As String) As Long
#Else
    Declare Function SetCurrentDirectory Lib "kernel32" Alias _
        "SetCurrentDirectoryA" (ByVal CurrentDir As String) As Long
#End If

複数箇所ある場合は、VBAエディタの「編集」→「置換」でDeclareDeclare PtrSafeに一括置換するのが効率的です。
ただし、必ずバックアップを取ってから作業してください。

VBAコードにアクセスできない場合

ファイルがパスワード保護されていてコードを修正できない場合は、そのファイルの作成者に連絡して修正を依頼してください(Microsoft公式ドキュメントより)。


対処法②:VBAの参照設定から「MISSING」を削除する

VBAが参照しているライブラリが移動・削除されると、「MISSING」状態になりエラーが発生します。

手順

  1. エラーが出るファイルを開いた状態でAlt + F11を押してVBAエディタを開く
  2. メニューの「ツール」→「参照設定」をクリックする
  3. 一覧に「MISSING: ○○」と表示されている項目があれば、チェックを外す
  4. 「OK」をクリックして閉じる
  5. Alt + QでExcelに戻る

これだけでエラーが解消されることがあります。
もし必要なライブラリが外れてしまった場合は、再度同じ画面で正しい参照先にチェックを入れてください。


対処法③:アドインを無効化して原因を特定する

アドイン(Excelに追加する拡張機能)が原因の場合、Excelをセーフモードで起動することで確認できます。

セーフモードで起動する手順

  1. Win + Rを押して「ファイル名を指定して実行」を開く
  2. excel /safeと入力して「OK」をクリックする
  3. セーフモードでExcelが起動したら、問題のファイルを開く

セーフモードではアドインが無効化された状態で起動します。
この状態でエラーが出なければ、アドインが原因です。

問題のアドインを特定・無効化する手順

  1. 通常モードでExcelを開く
  2. 「ファイル」→「オプション」→「アドイン」を開く
  3. 「管理」のプルダウンで「COMアドイン」を選択して「設定」をクリックする
  4. 一覧のアドインのチェックを1つずつ外してエラーが消えるか確認する

対処法④:.exdファイルを削除する

ActiveX(ボタンやチェックボックスなどの部品)を使うファイルで発生する場合、.exdファイル(一時キャッシュファイル)が破損していることがあります。

手順

  1. Excelをすべて閉じる
  2. Win + Rを押して、以下のパスをそれぞれ入力して開く
  • %AppData%\Microsoft\Forms
  • %Temp%\Excel8.0
  • %Temp%\VBE
  1. 各フォルダ内にある.exdという拡張子のファイルをすべて削除する
  2. Excelを再起動して確認する

対処法⑤:Officeの修復を実行する

ここまでの対処法で解決しない場合、mso.dllファイル自体が破損している可能性があります。
Officeの修復機能を使うことで、破損したファイルを自動的に置き換えられます。

手順(Windows 10 / 11共通)

  1. 「スタート」→「設定」→「アプリ」を開く
  2. 一覧から「Microsoft Office」を見つけてクリックする
  3. 「変更」または「修復」をクリックする
  4. 「クイック修復」を選んで実行する
  5. 解決しない場合は「オンライン修復」を試す

クイック修復はインターネット接続なしで10〜15分程度で完了します。
オンライン修復はより徹底的な修復を行いますが、時間がかかります。


対処法を試す順番のまとめ

手順対処法所要時間の目安
1Officeのビット数を確認(64bit版なら原因①を試す)5分
2Excelをセーフモードで起動してエラー確認2分
3VBAエディタでMISSINGの参照を削除5分
4.exdファイルを削除して再起動5分
5Officeのクイック修復を実行10〜20分
6Officeのオンライン修復を実行30分〜

VBAコードが保護されていて修正できない場合

VBAコードがパスワードで保護されている(非表示モジュールになっている)場合、自分ではコードを修正できません。
以下のいずれかの方法を検討してください。

  • ファイルの作成者に連絡して、64bit版Excel対応の修正版を作成してもらう
  • そのファイルが社内ツールであれば、IT部門に相談する
  • 自分でマクロなしのExcelファイルとして作り直す

また、VBAコードに依存しない形での業務自動化として、Office スクリプトという選択肢もあります。
VBAよりもシンプルで、64bit環境の互換性問題が起きにくい点が特徴です。


まとめ

「非表示モジュール内でコンパイルエラーが発生しました(mso.dll)」は、主に以下の4つが原因です。

  1. 32bit向けVBAコードを64bit版Excelで開いている(最多)
  2. VBAの参照設定に「MISSING」がある
  3. アドインの競合
  4. .exdファイルまたはOfficeファイルの破損

Office 365への移行やPC買い替えのタイミングで発生することが多く、まずOfficeのビット数を確認するのが近道です。
VBAコードを修正できる立場にある場合は、DeclareステートメントへのPtrSafe追加で解決するケースがほとんどです。

VBAに関連するその他のExcelエラーについては、Excelのエラー一覧もあわせてご覧ください。
Excelファイルが開けないトラブルは、OneDriveでExcelファイルが開けない問題の解決ガイドも参考になります。


参考情報源:

コメント

タイトルとURLをコピーしました