「MakeErrorCodeList.zip」をダウンロード
FormatMessage(エラーコードから内容を引くAPI)を利用して、エラーコード一覧を取得するマクロ。
サンプル結果として、自分のPC(Windows8 64bit)の結果も添付。
エラー調査するときに、手元にエラーコード一覧(早見表)があると便利なので作成。
各々のPC環境でこのマクロを実行すれば、その環境のエラー一覧ができるはず。
サンプルコード
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 LongPrivate 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 LongPrivate 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 TypePrivate 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 FunctionPublic 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 FunctionSub 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
Debug.Print "&H" & Hex(i) & str
r.Value = "&H" & Hex(i)
‘ r.Offset(0, 1).Value = "0x" & 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
アウトプット(一部)
ヘキサ表示(VB用) ヘキサ表示 内容(OSバージョン=6.2 9200)
&H0 0x00000000 この操作を正しく終了しました。
&H1 0x00000001 ファンクションが間違っています。
&H2 0x00000002 指定されたファイルが見つかりません。
&H3 0x00000003 指定されたパスが見つかりません。
&H4 0x00000004 ファイルを開くことができません。
&H5 0x00000005 アクセスが拒否されました。
&H6 0x00000006 ハンドルが無効です。
&H7 0x00000007 記憶域制御ブロックが壊れています。
&H8 0x00000008 このコマンドを実行するための十分な記憶域がありません。
&H9 0x00000009 記憶域制御ブロックのアドレスが無効です。
&HA 0x0000000A 環境が間違っています。
&HB 0x0000000B 間違ったフォーマットのプログラムを読み込もうとしました。
コメント