Windowsで定義されているシステムエラーメッセージ一覧を取得するため、Windows APIの `FormatMessage` 関数をExcel VBAから呼び出し、指定したエラーコードのメッセージを出力する方法を解説します。
## FormatMessage関数とは
`FormatMessage` は Windows API(kernel32.dll)に含まれる関数で、エラーコード(メッセージID)を指定することで、対応するシステムエラー文字列を取得できます。
### API定義(C/C++)
“`c
DWORD FormatMessage(
DWORD dwFlags,
LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPTSTR lpBuffer,
DWORD nSize,
va_list *Arguments
);
“`
## VBAサンプルコード
32ビット版および64ビット版のExcel(VBA7)に対応したコード例です。
“`vba
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function FormatMessage Lib “kernel32” Alias “FormatMessageA” ( _
ByVal dwFlags As Long, _
ByVal lpSource As LongPtr, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
ByVal Arguments As LongPtr _
) As Long
#Else
Private Declare Function FormatMessage Lib “kernel32” Alias “FormatMessageA” ( _
ByVal dwFlags As Long, _
ByVal lpSource As Long, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
ByVal Arguments As Long _
) As Long
#End If
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200
‘ エラー番号からメッセージを取得する関数
Function GetSystemErrorMessage(ByVal errorCode As Long) As String
Dim buffer As String * 1024
Dim length As Long
Dim flags As Long
flags = FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS
length = FormatMessage(flags, 0, errorCode, 0, buffer, Len(buffer), 0)
If length > 0 Then
GetSystemErrorMessage = Left(buffer, length)
GetSystemErrorMessage = Replace(GetSystemErrorMessage, vbCrLf, “”)
Else
GetSystemErrorMessage = “該当するエラーメッセージが見つかりません。”
End If
End Function
‘ ワークシートに出力する例(0〜20番)
Sub ExportErrorMessages()
Dim i As Long
Dim msg As String
For i = 0 To 20
msg = GetSystemErrorMessage(i)
Cells(i + 1, 1).Value = “0x” & Hex(i)
Cells(i + 1, 2).Value = msg
Next i
End Sub
“`
## 注意点・処理時間について
DWORD(`0xFFFFFFFF`)の全範囲をループ処理する場合、10進換算で **4,294,967,295** 回(約43億回)のAPI呼び出しが発生します。
VBAで全範囲をループ実行すると途方もない時間がかかるため、通常は必要な範囲(例: `0x0` 〜 `0xFFFF`)に絞って検索・出力することを推奨します。
—
## 出力例(0x00000000 〜 0x0000001F)
“`text
0x00000000 この操作を正しく終了しました。
0x00000001 ファンクションが間違っています。
0x00000002 指定されたファイルが見つかりません。
0x00000003 指定されたパスが見つかりません。
0x00000004 ファイルを開くことができません。
0x00000005 アクセスが拒否されました。
0x00000006 ハンドルが無効です。
0x00000007 記憶域制御ブロックが壊れています。
0x00000008 このコマンドを実行するのに十分な記憶域がありません。
0x00000009 記憶域制御ブロックのアドレスが無効です。
0x0000000A 環境が間違っています。
0x0000000B 間違ったフォーマットのプログラムを読み込もうとしました。
0x0000000C アクセス コードが無効です。
0x0000000D データが無効です。
0x0000000E この操作を完了するのに十分な記憶域がありません。
0x0000000F 指定されたドライブが見つかりません。
0x00000010 ディレクトリを削除できません。
0x00000011 ファイルを別のディスク ドライブに移動できません。
0x00000012 これ以上ファイルがありません。
0x00000013 このメディアは書き込み禁止になっています。
0x00000014 指定されたデバイスが見つかりません。
0x00000015 デバイスの準備ができていません。
0x00000016 デバイスがコマンドを認識できません。
0x00000017 データ エラー (巡回冗長検査 (CRC) エラー) です。
0x00000018 プログラムはコマンドを発行しましたが、コマンドの長さが間違っています。
0x00000019 指定されたディスクの領域またはトラックが見つかりません。
0x0000001A 指定されたディスクまたはフロッピー ディスクにアクセスできません。
0x0000001B 要求されたセクタが見つかりません。
0x0000001C プリンタは用紙切れです。
0x0000001D 指定されたデバイスに書き込めません。
0x0000001E 指定されたデバイスから読み取れません。
0x0000001F システムに接続されたデバイスが機能していません。
“`
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月10日
- 削除リンク切れとなっていた外部ZIPファイルのダウンロードリンクを削除しました。
- 追加64ビットおよび32ビットOffice環境に対応したFormatMessage APIのVBA宣言とサンプルコードを追加しました。
- 変更DWORDの10進数表記におけるカンマ位置の誤りを修正しました。
