INDEX
Seekの概要
ファイル内の読み書き位置を変更する VBAの予約語 | ||
Seek 概要 Seek は、VBAでファイルの読み書きを行う際に、現在のファイルポインタ(データの読み書きを開始する位置)を変更するために使用されます。 わかりやすく説明 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
を使うのが簡単。