WindowsのFormatMessage API(エラーコードから内容を引くAPI)を利用して、システムのエラーコード一覧をExcelのシートに自動出力するVBAマクロです。
エラー調査を行う際、手元にエラーコードの早見表があると非常に便利です。このマクロを実行すると、実行したPC環境に応じたエラーコード一覧表を作成できます。
前提条件
Windows環境(32bit / 64bit)のExcelで動作します。VBA7以降(64bit版Office)に対応した宣言を行っています。
サンプルコード
以下のコードをExcelの標準モジュールに貼り付けて実行してください。
Option Explicit
Public Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Long = &H100
Public Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Long = &H2000
Public Const FORMAT_MESSAGE_FROM_HMODULE As Long = &H800
Public Const FORMAT_MESSAGE_FROM_STRING As Long = &H400
Public Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Public Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200
Public Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Long = &HFF
#If VBA7 Then
Public Declare PtrSafe Function FormatMessage Lib "kernel32" Alias _
"FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, _
ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) _
As Long
Private Declare PtrSafe Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFOEX) As Long
#Else
Public Declare Function FormatMessage Lib "kernel32" Alias _
"FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, _
ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) _
As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFOEX) As Long
#End If
Private Type OSVERSIONINFOEX
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Private Function GetOSVersion()
Dim lpVerInfo As OSVERSIONINFOEX
lpVerInfo.dwOSVersionInfoSize = Len(lpVerInfo)
Dim Result As Long
Result = GetVersionEx(lpVerInfo)
If Result = 0 Then Exit Function
GetOSVersion = CStr(lpVerInfo.dwMajorVersion) + "." + CStr(lpVerInfo.dwMinorVersion) + " " + CStr(lpVerInfo.dwBuildNumber)
End Function
Public Function GetErrorMessage(ByVal dwMessageId As Long) As String
Dim dwFlags As Long 'オプションフラグ
Dim lpBuffer As String 'メッセージを格納するバッファ
Dim Result As Long '戻り値(文字列のバイト数)
dwFlags = FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS Or FORMAT_MESSAGE_MAX_WIDTH_MASK
lpBuffer = String(1024, vbNullChar)
Result = FormatMessage(dwFlags, 0&, dwMessageId, 0&, lpBuffer, Len(lpBuffer), 0&)
If (Result > 0) Then
lpBuffer = Left(lpBuffer, InStr(lpBuffer, vbNullChar) - 1)
Else
lpBuffer = ""
End If
GetErrorMessage = lpBuffer
End Function
Sub Sample()
On Error GoTo EXCEPTION
Dim i As Long
Dim str As String
Dim r As Range: Set r = Sheets("Sheet1").Range("A1")
'ヘッダ行
r.Value = "ヘキサ表示(VB用)"
r.Offset(0, 1).Value = "ヘキサ表示"
r.Offset(0, 2).Value = "内容(OSバージョン=" & GetOSVersion & ")"
Set r = r.Offset(1, 0)
For i = 0 To 65535
str = GetErrorMessage(i)
If str <> "" Then
r.Value = "&H" & Hex(i)
r.Offset(0, 1).Value = "0x" & Right("00000000" & Hex(i), 8)
r.Offset(0, 2).Value = str
Set r = r.Offset(1, 0)
DoEvents
End If
Next i
MsgBox "完了"
Exit Sub
EXCEPTION:
MsgBox Err.Description
End Sub
実行手順
- Excelを開き、
Alt + F11でVBE(Visual Basic Editor)を起動します。 - メニューの「挿入」から「標準モジュール」を追加します。
- Excelに戻り、
Alt + F8からSampleマクロを実行します。 - アクティブシートの「Sheet1」の先頭からエラーコードとメッセージの一覧が書き出されます。
上記コードを貼り付けてウィンドウを閉じます。
アウトプット例(一部)
ヘキサ表示(VB用) | ヘキサ表示 | 内容
&H0 | 0x00000000 | この操作を正しく終了しました。
&H1 | 0x00000001 | ファンクションが間違っています。
&H2 | 0x00000002 | 指定されたファイルが見つかりません。
&H3 | 0x00000003 | 指定されたパスが見つかりません。
&H4 | 0x00000004 | ファイルを開くことができません。
&H5 | 0x00000005 | アクセスが拒否されました。
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月12日
- 削除リンク切れとなっている外部ZIPファイルのダウンロードリンクを削除しました。
- 追加Winerror.hのエラーコード一覧を取得するためのVBAサンプルコードと実行手順を本文に直接追加しました。
