【VBA】位置を指定してバイナリファイルを読み書きする
<機能>
・テスト用のバイナリファイルを出力します
・位置を指定してファイルに書き込みを行います
(Putステートメント)
・Seekで位置を指定してファイルから読み込みを行います
(Getステートメント)
<動作検証>
Microsoft Office 2016
<実行イメージ>
指定位置(1062バイト目/1077バイト)から書き込みを実施
全角8文字(16バイト)を書き込み
先頭から37バイト目から全角26文字を読み込み
<使い方>
適当なところにソースを貼り付けてください
バイナリファイルを読み書き() を実行すると処理を開始します
'********************************************
'ファイルポインタ(位置)を指定してファイルを読み書き
'********************************************
Sub バイナリファイルを読み書き()
Dim strFile As String
Dim fp As Long, fileLen As Long
Dim strbuf As String * 26
'//ファイル名を生成
strFile = ThisWorkbook.Path & "¥binaryTest.dat"
'//テスト用バイナリデータをファイルへ書き込み
Call TestFileWrite(strFile)
'//バイナリモードでファイルをオープン
fp = FreeFile
Open strFile For Binary As #fp
'//ファイルサイズを取得
fileLen = LOF(fp)
'//最後の8文字(16バイト)にデータを書き込み
'//第2引数には先頭から書き込む場合は1を指定する
Put #fp, (fileLen - 16) + 1, "さいごの8バイト"
'//読み込み位置にポインタ移動
Seek #fp, 37
'//26文字[ABCDEFGHIJKLMNOPQRSTUVWXYZ]読込
Get #fp, , strbuf
Debug.Print strbuf
'//ファイルを閉じる
Close (fp)
MsgBox "おわりました", vbInformation
End Sub
'ファイルポインタ(位置)を指定してファイルを読み書き
'********************************************
Sub バイナリファイルを読み書き()
Dim strFile As String
Dim fp As Long, fileLen As Long
Dim strbuf As String * 26
'//ファイル名を生成
strFile = ThisWorkbook.Path & "¥binaryTest.dat"
'//テスト用バイナリデータをファイルへ書き込み
Call TestFileWrite(strFile)
'//バイナリモードでファイルをオープン
fp = FreeFile
Open strFile For Binary As #fp
'//ファイルサイズを取得
fileLen = LOF(fp)
'//最後の8文字(16バイト)にデータを書き込み
'//第2引数には先頭から書き込む場合は1を指定する
Put #fp, (fileLen - 16) + 1, "さいごの8バイト"
'//読み込み位置にポインタ移動
Seek #fp, 37
'//26文字[ABCDEFGHIJKLMNOPQRSTUVWXYZ]読込
Get #fp, , strbuf
Debug.Print strbuf
'//ファイルを閉じる
Close (fp)
MsgBox "おわりました", vbInformation
End Sub
'********************************************
'バイナリデータをテストファイルに出力
'********************************************
Sub TestFileWrite(ByVal strfil As String)
'//バイナリファイルの1バイト毎の入出力にはByte型を用いる
Dim strbuf As String * 1024
Dim i As Integer
Dim fp As Long
'バイナリデータをテストファイルに出力
'********************************************
Sub TestFileWrite(ByVal strfil As String)
'//バイナリファイルの1バイト毎の入出力にはByte型を用いる
Dim strbuf As String * 1024
Dim i As Integer
Dim fp As Long
'//書き込みデータをセット
strbuf = "abcdefghijklmnopqrstuvwxyz0123456789" & _
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _
"0123456789月火水木金土日あいうえおかきくけこ"
strbuf = "abcdefghijklmnopqrstuvwxyz0123456789" & _
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _
"0123456789月火水木金土日あいうえおかきくけこ"
'//FreeFile関数で使用可能なファイル番号を割り当て
fp = FreeFile
fp = FreeFile
'//ファイルが存在する場合は指定アドレスが上書きされるだけのため
'//書き込み前にファイルを削除するか中身を一旦クリアする
Open strfil For Output As #fp
Close (fp)
'//書き込み前にファイルを削除するか中身を一旦クリアする
Open strfil For Output As #fp
Close (fp)
'//ファイルオープン(バイナリ書き込みでオープン、ファイルが存在しない場合は新規作成)
'//モードに下記のいずれかが指定されていればファイルが存在しない場合、新規作成されます
'//追加モード(Append)、バイナリモード(Binary)、出力モード(Output)、ランダムアクセスモード(Random)
Open strfil For Binary Access Write As #fp
'//モードに下記のいずれかが指定されていればファイルが存在しない場合、新規作成されます
'//追加モード(Append)、バイナリモード(Binary)、出力モード(Output)、ランダムアクセスモード(Random)
Open strfil For Binary Access Write As #fp
'//ファイルに書き込み(ファイル先頭からの書き込みを明示)
Put #fp, 1, strbuf
'//ファイルを閉じる
Close (fp)
End Sub
Put #fp, 1, strbuf
'//ファイルを閉じる
Close (fp)
End Sub
よろしければポチッと押してください