Excel VBA の実行時エラー辞典
実行時エラー '48':コード リソースまたは DLL 読み込み時のエラーです
Declare で呼び出す DLL が、Excel のビット版(32 ビット/64 ビット)や必要な関連ファイルと合っているか確認します。
よくある原因
- 32 ビット版の DLL を 64 ビット版の Excel から呼び出している、またはその逆です。
- DLL が別の DLL を必要としていて、その DLL が存在しないか、見つからない場所にあります。
- Declare の Lib に指定したファイルが、Windows の DLL として読み込める形式ではありません。
- 古い DLL で、現在の Windows の環境に対応していません。
直し方
- 停止した呼び出しに対応する Declare の Lib 句から、読み込もうとした DLL のファイル名と場所を確認します。
- Excel の[ファイル]→[アカウント]→[Excel のバージョン情報]で 32 ビット版か 64 ビット版かを確かめ、同じビット版の DLL を DLL の提供元から入手します。
- DLL の提供元の資料で必要な関連 DLL を確認し、指定された場所に配置します。
- ファイルのパスと名前も確認します。ファイルがない場合は、エラー 53 の解説も参考にしてください。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
mytool.dll と C:\tools は説明用の架空の名前です。Declare は Sub の中ではなく、標準モジュールの先頭(宣言セクション)に書きます。PtrSafe は Office 2010 以降(VBA7)を前提にしています。引数や戻り値の型は、DLL の提供元の資料に合わせてください。
修正前
' 64 ビット版の Excel で、32 ビット版の DLL を指定している
Private Declare PtrSafe Function ToolVersion Lib "C:\tools\x86\mytool.dll" () As Long
修正後
#If Win64 Then
Private Declare PtrSafe Function ToolVersion Lib "C:\tools\x64\mytool.dll" () As Long
#Else
Private Declare PtrSafe Function ToolVersion Lib "C:\tools\x86\mytool.dll" () As Long
#End If
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- DLL の関数を最初に呼ぶ行で止め、F8 で進めてエラー 48 が出るか確認します。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? Dir("C:\tools\x64\mytool.dll")
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。
関連エラー
- 実行時エラー '53':ファイルが見つかりません
- 実行時エラー '76':パスが見つかりません
- 実行時エラー '429':コンポーネントはオブジェクトを作成できないか、このオブジェクトの参照を返せません