VB6・VBA関数メモ:LOF関数

LOF関数についてメモしておきます。

この関数はOpenステートメントで開かれたファイルのサイズを取得する際に使用します。
FileLen関数と違いファイルを開いてから使用する必要があります。

FileLen関数と違いLOF関数は書き込み中のファイルサイズが取得できます。
(FileLen関数は書き込み中のファイルのサイズは取得できない)

速度に関してはオープン状態が維持されている場合はLOF関数の方が早いようですが、
毎回オープン・クローズを行う場合はFileLen関数の方が早いようです。


概要

LOF(FileNmber As Integer) As Long
機能 Openステートメントで開かれたファイルのサイズを返す
引数 FileNmber Openステートメントで指定したファイル番号 Integer型
戻り値 ファイルのサイズ(バイト単位) Long型


使用例

説明 記述例 出力
(Sumple.txt)
12345
abcde
あいうえお
ファイルサイズを取得する
Dim str      As String
Dim n        As Integer
Dim fileSize As Long

n = FreeFile
Open "D:¥Sumple.txt" For Input As #n

fileSize = LOF(n)

Close #n

Debug.Print fileSize
24


動作検証

説明 記述例 出力
LOF関数とFileLen関数の動作の違い
(FileLen関数は書き込み中のファイルサイズを取得できない)
Dim i    As Integer
Dim n    As Integer
Dim file As String

file = "D:¥Sumple.txt"
n = FreeFile
Open file For Output As #n

For i = 0 To 2
    Print #n, "123"
    Debug.Print "書き込み中(" & i & ")"
    Debug.Print "LOF     : " & LOF(n)
    Debug.Print "FileLen : " & FileLen(file)
    Debug.Print
Next i
    
Close #n

Debug.Print "ファイルクローズ後"
Debug.Print "FileLen : " & FileLen(file)
書き込み中(0)
LOF     : 5
FileLen : 0

書き込み中(1)
LOF     : 10
FileLen : 0

書き込み中(2)
LOF     : 15
FileLen : 0

ファイルクローズ後
FileLen : 15
LOF関数とFileLen関数の速度の違い

 [1]オープン状態が維持されている場合、LOF関数はFileLen関数より早い

 [2]毎回オープン・クローズを行う場合、LOF関数はFileLen関数より遅い
Dim i    As Long
Dim n    As Integer
Dim tmp  As Long
Dim t    As Double
Dim sec  As Double

t = Timer()

n = FreeFile
Open "D:¥Sumple.txt" For Input As #n

For i = 0 To 30000
    tmp = LOF(n)
Next i

Close #n

sec = ((Timer() - t) * 100) / 100
Debug.Print Format(sec, "0.00") & "秒"
0.15秒
Dim i    As Long
Dim n    As Integer
Dim tmp  As Long
Dim t    As Double
Dim sec  As Double

t = Timer()

For i = 0 To 30000
    n = FreeFile
    Open "D:¥Sumple.txt" For Input As #n
    
    tmp = LOF(n)
    
    Close #n
Next i

sec = ((Timer() - t) * 100) / 100
Debug.Print Format(sec, "0.00") & "秒"
39.11秒
Dim i    As Long
Dim tmp  As Long
Dim t    As Double
Dim sec  As Double

t = Timer()

For i = 0 To 30000
    tmp = FileLen("D:¥Sumple.txt")
Next i

sec = ((Timer() - t) * 100) / 100
Debug.Print Format(sec, "0.00") & "秒"
12.01秒
オープンしていないファイル番号を指定するとエラー
On Error GoTo ERR_HANDLER

    Debug.Print LOF(1)

ERR_HANDLER:
    If Err > 0 Then Debug.Print Error
ファイル名または番号が不正です。


コメント
コメントする








    
この記事のトラックバックURL
トラックバック