今日はVBAを使ってバイナリーファイルを読み込んで見よう!
JISコード付きの手法を紹介するね!
エクセルワークシート上に下記図のような形式でバイナリーファイルを読み込みます。
目次
バイナリーファイル読み込みJISコード付き サンプル
バイナリーファイルのデータをエクセルファイルに読み込みたい
今回はShift_JIS の文字コードから文字に変換するChr関数を使って、バイナリーファイルエディターのようにバイナリーファイル(*.bin)をエクセルファイルに読み込みます。拡張子.binファイルデータの整形やデータ確認したいときに便利です。
ワークシート”Binary”を準備して、下記コードを動かしてみて下さい。
二次元配列変数の行数を1000としているため、ファイルサイズに注意して、大きいサイズのバイナリーファイルを扱う場合は、30行目BinData、107行目JisDataの値”1000″を”10000″などに拡張して下さい。
Sub ReadBinaryFile()
Application.ScreenUpdating = False
ThisWorkbook.Worksheets("Binary").Activate
'データクリア
Range("A1").CurrentRegion.ClearContents
Range("S1").CurrentRegion.ClearContents
MsgBox "データをクリアしました(`・ω・´)ゞ"
Dim buff() As Byte
Dim filesize As Long, NowLoc As Long
Dim idx As Long, gyo As Long
Dim strBinary As String
Dim j As Long, i As Long
Dim v As Variant
Dim bkPath As String
Dim BinData As Variant
Dim JISData As Variant
MsgBox "Excelに読み込みたいbinファイルを選択してね(o・ω・o)ノ"
bkPath = Application.GetOpenFileName("すべてのファイル, *.bin", , "binファイルを選択して下さい")
If bkPath <> "False" Then
Open bkPath For Binary As #1
'二次元配列の箱を準備
BinData = Range(Cells(3, 1), Cells(1000, 17))
'全セルの表示形式を文字列に変更
ActiveSheet.Cells.Select
Selection.NumberFormatLocal = "@"
Cells.Font.Name = "Meiryo UI"
'ヘッダー情報をワークシートに出力
Cells(1, 2) = "00"
Cells(1, 3) = "01"
Cells(1, 4) = "02"
Cells(1, 5) = "03"
Cells(1, 6) = "04"
Cells(1, 7) = "05"
Cells(1, 8) = "06"
Cells(1, 9) = "07"
Cells(1, 10) = "08"
Cells(1, 11) = "09"
Cells(1, 12) = "0A"
Cells(1, 13) = "0B"
Cells(1, 14) = "0C"
Cells(1, 15) = "0D"
Cells(1, 16) = "0E"
Cells(1, 17) = "0F"
Cells(2, 1) = " --------------------------------------------------------------------"
Cells(2, 19) = "0123456789ABCDEF"
gyo = 1
Do While NowLoc < LOF(1)
'最大16バイト分の領域を確保し初期化
If (LOF(1) - NowLoc) >= 16 Then
'残りのファイルサイズが16バイト以上のとき
ReDim buff(15)
Else
'最終読み込み時(497バイト~500バイト目)は残りのファイルサイズが16未満
ReDim buff(LOF(1) - NowLoc - 1)
End If
'データ読み込み
Get #1, , buff
'表示用のアドレス生成("00000000"とHexの戻り値を連結した文字列の右から8文字)
strBinary = Right("00000000" & Hex(NowLoc), 8) & " "
'現在位置を保持する(ループBreak判定用)
NowLoc = Loc(1)
'出力文字列を生成
For idx = 0 To UBound(buff)
strBinary = strBinary + Right("00" & Hex(buff(idx)), 2) + " "
Next
v = Split(strBinary, " ")
For j = 1 To 17
BinData(gyo, j) = v(j - 1)
Next
gyo = gyo + 1
Loop
Close #1
Else
MsgBox "Binファイルが正しく選択されなかったので終了します。"
Exit Sub
End If
'二次元配列からセルに一括書き戻し
Range(Cells(3, 1), Cells(1000, 17)) = BinData
'二次元配列の箱を準備
JISData = Range(Cells(3, 19), Cells(1000, 19))
For j = 1 To UBound(JISData)
If BinData(j, 1) = "" Then
Exit For
End If
For i = 2 To 17
If BinData(j, i) = "00" Or BinData(j, i) = "0A" Then
JISData(j, 1) = JISData(j, 1) + "・"
Else
JISData(j, 1) = JISData(j, 1) + Chr(CInt("&H" & BinData(j, i)))
End If
Next
Next
'二次元配列からセルに一括書き戻し
Range(Cells(3, 19), Cells(1000, 19)) = JISData
Range("A1").ColumnWidth = 10
Range("R1").ColumnWidth = 2
Columns("B:Q").AutoFit
Columns("S").AutoFit
End Sub
まとめ
このサンプルを活用いただけると、バイナリーエディターのようにエクセルにバイナリーファイルを読み込むができます。
この記事がミス削減や生産性向上につながるととても嬉しいです。
VBA初級から抜け出すための知恵と、実務で活用できるスキルが学べる1冊です!激しくオススメ!
コメント