VBAのSeekでファイルの読み書き位置を変更する方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

Seekの概要

ファイル内の読み書き位置を変更する VBAの予約語

Seek

概要 Seek は、VBAでファイルの読み書きを行う際に、現在のファイルポインタ(データの読み書きを開始する位置)を変更するために使用されます。

わかりやすく説明 Seek は、「ファイルのどこから読み書きするかを指定するよ!」という命令です。指定した位置からデータを読み込んだり、書き込んだりすることができます。

  • ファイルの読み書き位置(ファイルポインタ)を変更できる。
  • Seek(ファイル番号) で現在のファイル位置を取得。
  • Seek #ファイル番号, 位置 でファイルポインタを指定の位置に移動。
  • バイナリファイルやランダムアクセスファイルで特に有用。

Seek の基本的な使い方(ファイルの途中から書き込み)

Seek を使って、ファイルの途中からデータを書き込む基本的な例です。

Sub WriteAtPosition()
    Dim fileNum As Integer
    fileNum = FreeFile
    
    ' ファイルを開く(既存データを上書きしない)
    Open "C:\Temp\example.txt" For Random As #fileNum Len = 20
    
    ' 5番目の位置から書き込み
    Seek #fileNum, 5
    Put #fileNum, , "Hello"
    
    Close #fileNum
End Sub

解説:

  • Open ... For Random で固定長レコードのファイルを開く。
  • Seek #fileNum, 5 でファイルの 5 番目の位置に移動。
  • Put #fileNum, , "Hello" で 5 番目から “Hello” を書き込む。

Seek を使ってファイルの途中から読み込み

Seek を使って、ファイルの途中からデータを読み込む例です。

Sub ReadAtPosition()
    Dim fileNum As Integer
    Dim result As String * 5
    fileNum = FreeFile
    
    ' ファイルを開く
    Open "C:\Temp\example.txt" For Random As #fileNum Len = 20
    
    ' 5番目の位置から読み込み
    Seek #fileNum, 5
    Get #fileNum, , result
    
    Close #fileNum
    
    MsgBox "読み込んだデータ: " & result, vbInformation, "Seek の例"
End Sub

解説:

  • Seek #fileNum, 5 で 5 番目の位置からデータを取得。
  • Get #fileNum, , result で 5 文字分のデータを読み取る。

ExcelでのSeekの活用例(ログファイルの追記)

Excel のデータをログファイルとして記録し、Seek を使って末尾に追記する例です。

Sub AppendToLog()
    Dim fileNum As Integer
    fileNum = FreeFile
    
    ' 既存のデータの末尾に書き込む
    Open "C:\Temp\log.txt" For Append As #fileNum
    Print #fileNum, "新しいログ: " & Now
    Close #fileNum
End Sub

解説:

  • For Append を使えば、Seek を明示的に指定しなくても、末尾に書き込める。
  • ログファイルを作成し、日付とともに追記する。

エラーを回避する方法

Seek を使用する際に、ファイルが開いていないとエラーが発生するため、適切に管理します。

Sub SafeSeek()
    Dim fileNum As Integer
    fileNum = FreeFile
    
    On Error Resume Next
    Open "C:\Temp\safe.txt" For Binary As #fileNum
    
    If Err.Number <> 0 Then
        MsgBox "ファイルを開けませんでした: " & Err.Description, vbExclamation, "エラー"
        Err.Clear
        Exit Sub
    End If
    
    Seek #fileNum, 10 ' 10 バイト目に移動
    Put #fileNum, , "VBA"
    
    Close #fileNum
End Sub

解説:

  • ファイルを開く際にエラーが発生した場合、メッセージを表示し処理を中断。
  • エラーハンドリングを適用して、安全に Seek を実行できるようにする。

Seekの注意事項

  • Seek は 1 から始まる: ファイルの最初の位置は Seek #fileNum, 1 で指定。
  • Seek で移動しすぎるとエラー: ファイルサイズより大きな位置を指定するとエラーになる。
  • バイナリファイルでは 1 バイト単位、ランダムアクセスではレコード単位: ファイルモードによって Seek の単位が異なる。

よくある質問

Q: Seek でファイルの末尾に移動するにはどうすればいいですか?
A: Seek #fileNum, LOF(fileNum) + 1 でファイルの末尾に移動できます。
Q: Seek を使わずにファイルの末尾に追記できますか?
A: はい。Open ... For Append を使えば、自動的に末尾に書き込まれます。
Q: Seek を使用するとファイルの内容が上書きされますか?
A: はい。既存のデータがある位置に書き込むと、上書きされます。
Q: ファイルサイズよりも大きな位置を Seek するとどうなりますか?
A: エラーが発生します。ファイルサイズは LOF(ファイル番号) で確認できます。

まとめ

  • Seek は、VBA でファイルの読み書き位置を変更するために使用される。
  • ファイルの途中から読み込みや書き込みを行う際に便利。
  • バイナリファイルやランダムアクセスファイルで特に有用。
  • ファイルサイズを超えた位置を指定するとエラーになるため、適切に管理する必要がある。
  • ファイルの末尾にデータを追加する場合は For Append を使うのが簡単。