FileLen関数
FileLen関数は指定したファイルのサイズをバイト単位で返します。
指定したファイルが存在しない場合はエラーになります。(実行時エラー ’53’: ファイルが見つかりません。)
Long型の精度のため約2GBを超えるファイルの場合は取得できません。その場合の対応方法は後述しています。
構文
Function FileLen(PathName As String) As Long
PathName | ファイルサイズを取得するファイルパスを指定します。ファイル名だけを指定することも可能です。 |
戻り値 | Long型でファイルサイズを返します。詳細は後述していますが、約2GBを超えるファイルの場合は正しくファイルサイズを取得できません。 |
単純なコードであればこのような感じになります。
1 2 3 4 5 6 |
Sub FileLenTest() Dim iSize '// アクティブブックのファイルサイズを取得 iSize = FileLen(ActiveWorkbook.FullName) End Sub |
エラー発生時の対応方法
指定したファイルが存在しない場合は「実行時エラー ’53’: ファイルが見つかりません。」が発生し、そこで処理が止まります。
FileLen関数を使う場合は、ファイルパスは変数で渡すことが多く、可変であるため、そのファイルが存在しているかどうかが不明なままFileLen関数を実行することが多くなります。
そうなると当然、ファイルが存在しないことも発生しやすくなり、結果としてエラーになり処理が止まってしまう、ということに陥ります。
そこで、事前にそのファイルが存在するのかをチェックを行い、存在するファイルパスのみをFileLen関数を行うようにしてエラーを回避します。
以下のサンプルでは、ファイル存在チェックを含めたコードを紹介します。
サンプルコード
指定ファイルパスのファイルサイズを出力するサンプルコードです。
上記の通り、ファイルが存在しない場合はエラーで処理が止まるため、ファイルの存在チェックを行い、存在する場合のみFileLen関数でファイルサイズを取得するようにしています。
ファイル存在チェックの「IsExistFileDir」関数は「VBAでファイルの存在をチェックする」のサンプルコードを利用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Sub FileLenTest() On Error GoTo ERR_LABEL Dim iSize As Long '// ファイルサイズ Dim sFilePath As String '// ファイルパス Dim bRet As Boolean '// ファイル存在チェック結果 '// ファイルパスを取得 sFilePath = ActiveWorkbook.FullName '// ファイル存在チェック bRet = IsExistFileDir(sFilePath) '// ファイルが存在しない場合 If (bRet = False) Then Exit Sub End If '// アクティブブックのファイルサイズを取得 iSize = FileLen(sFilePath) Debug.Print "ファイルサイズ=" & CStr(iSize) & "バイト" Exit Sub ERR_LABEL: '// エラー内容を出力 Debug.Print Err.Number & " " & Err.Description End Sub '// ファイル存在チェック Function IsExistFileDir(a_sFilePath) As Boolean Dim a a = Dir(a_sFilePath) If (a <> "") Then IsExistFileDir = True Else IsExistFileDir = False End If End Function |
約2GBを超えるファイルは正しく動作しない
FileLen関数はファイルサイズをLong型で返すため、Long型の範囲の-2,147,483,648から2,147,483,648(約2GB)を超えるファイルサイズの場合は正しく動作しません。
試しに「2.17 GB (2,340,790,272 バイト)」のファイルを使ってFileLen関数を実行すると「1,954,177,024バイト」という不正な値が返されました。
このようなLong型の精度を超えるようなファイルサイズを取得する場合は、FileLen関数ではなく、FileSystemObjectクラスのGetFileメソッドを使ってFileオブジェクトを取得し、そのSizeプロパティを使うことで取得できます。SizeプロパティはVariant型のためLong型を超える精度でも取得可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub FileSizeTest() Dim fso As Object Dim f As File Dim sFilePath As String '// FileSystemObjectのインスタンス作成 Set fso = CreateObject("Scripting.FileSystemObject") sFilePath = "C:\aaa\abc.mts" '// Fileオブジェクトを取得 Set f = fso.GetFile(sFilePath) Debug.Print "ファイルサイズ=" & CStr(f.Size) & "バイト" End Sub |