wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA FileLenの使い方

VBA FileLenで添付ファイルサイズを瞬速確認!2GBの壁を越える実務テクニック

「この添付ファイル、もしかして大きすぎる…?」
「メールサーバーの容量制限に引っかかって、送信エラーになったらどうしよう…」
ネットワークを介したファイル共有やメール送信において、添付ファイルのサイズは常に悩みの種ですよね。特にビジネスシーンでは、わずかな手間や遅延が大きなロスにつながることも。VBAの FileLen 関数を使えば、そんなファイルサイズ確認のタスクを自動化し、事前にリスクを回避できます。 この記事では、FileLen の基本的な使い方から、知っておくべき「2GBの壁」とその回避策まで、VBAエキスパートの実践的なノウハウを余すことなくお伝えします。

コピペで動く!添付ファイルサイズ確認の実務コード

まずは、FileLen 関数を使った基本的なファイルサイズ確認コードです。指定したファイルのサイズをバイト単位で取得し、メールサーバーの容量制限(例: 10MB)を超えていないかをチェックします。

Sub CheckAttachmentSize_FileLen_Basic()
    ' --- 設定値 ---
    Const MAX_ALLOWED_FILE_SIZE_MB As Long = 10 ' 許容する最大ファイルサイズ (MB単位, 例: 10MB)
    Dim targetFilePath As String              ' 確認したいファイルのパス

    ' === ここに確認したいファイルのパスを指定してください ===
    ' 例: "Attach.zip" をCドライブのTempフォルダに置いた場合
    targetFilePath = "C:\Temp\Attach.zip"

    ' --- 処理開始 ---
    Dim fileSizeInBytes As Long ' FileLen関数はLong型を返します
    Dim fileSizeInMB As Double

    ' ファイルの存在確認
    If Dir(targetFilePath) = "" Then
        MsgBox "エラー: 指定されたファイルが見つかりません。" & vbCrLf & _
               "パス: " & targetFilePath, vbCritical
        Exit Sub
    End If

    ' FileLen関数でファイルサイズを取得 (バイト単位)
    ' !!! 注意: 2GBを超えるファイルではLong型の制限によりエラーが発生する可能性があります。 !!!
    fileSizeInBytes = FileLen(targetFilePath)

    ' ファイルサイズをMBに変換
    fileSizeInMB = CDbl(fileSizeInBytes) / (1024 * 1024)

    ' 結果表示
    MsgBox "対象ファイル: " & targetFilePath & vbCrLf & _
           "サイズ: " & Format(fileSizeInMB, "0.00") & " MB (" & _
           Format(fileSizeInBytes, "#,##0") & " バイト)", vbInformation

    ' 容量制限チェック
    If fileSizeInBytes > MAX_ALLOWED_FILE_SIZE_MB * 1024 * 1024 Then
        MsgBox "警告: 添付ファイルのサイズが " & MAX_ALLOWED_FILE_SIZE_MB & "MB の上限を超えています!" & vbCrLf & _
               "送信前にサイズを削減するか、他の送信方法をご検討ください。", vbCritical
    Else
        MsgBox "添付ファイルのサイズは許容範囲内です。", vbInformation
    End If

End Sub

FileLenの落とし穴:2GBを超える巨大ファイルへの対処法

上記のコードはシンプルで使いやすいですが、FileLen 関数には一つ大きな「落とし穴」があります。それは、戻り値の型が Long であること。 VBAの Long 型が扱える最大値は 2,147,483,647 バイト、つまり約 2GB です。

では、2GBを超えるファイルサイズを正確に取得するにはどうすれば良いでしょうか?
VBAでこの問題を回避するための強力なツールが、FileSystemObject (FSO) です。FSOの GetFile メソッドで取得できる File オブジェクトの Size プロパティは、Long 型の制限を受けず、より大きなファイルサイズ(Double 型で表現可能な範囲)を正確に返します。

FSOを使った安全なファイルサイズ取得コード

Function GetFileSize_Robust(filePath As String) As Double
    ' ファイルサイズをDouble型で返す関数 (2GB超対応)
    Dim fso As Object       ' FileSystemObject
    Dim targetFile As Object  ' Fileオブジェクト

    On Error GoTo ErrorHandler

    Set fso = CreateObject("Scripting.FileSystemObject")

    ' ファイルの存在確認
    If Not fso.FileExists(filePath) Then
        MsgBox "エラー: 指定されたファイルが見つかりません。", vbCritical
        GetFileSize_Robust = -1 ' ファイルがない場合は-1を返すなどの処理
        Exit Function
    End If

    Set targetFile = fso.GetFile(filePath)
    GetFileSize_Robust = targetFile.Size ' .SizeプロパティはDouble型で大きな値を扱えます

    Set targetFile = Nothing
    Set fso = Nothing
    Exit Function

ErrorHandler:
    MsgBox "ファイルサイズ取得中に予期せぬエラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical
    GetFileSize_Robust = -2 ' エラー発生時は-2を返すなどの処理
    Set targetFile = Nothing
    Set fso = Nothing
End Function

Sub CheckAttachmentSize_Robust()
    ' --- 設定値 ---
    Const MAX_ALLOWED_FILE_SIZE_MB As Long = 10 ' 許容する最大ファイルサイズ (例: 10MB)
    Dim targetFilePath As String              ' 確認したいファイルのパス

    ' === ここに確認したいファイルのパスを指定してください ===
    targetFilePath = "C:\Temp\HugeAttach.zip" ' 例: 巨大なファイル

    ' --- 処理開始 ---
    Dim fileSizeInBytes As Double ' FSOのSizeプロパティはDouble型で受け取る
    Dim fileSizeInMB As Double

    ' FSOを使ったロバストなファイルサイズ取得関数を呼び出す
    fileSizeInBytes = GetFileSize_Robust(targetFilePath)

    If fileSizeInBytes < 0 Then ' GetFileSize_Robust関数でエラーまたはファイルなしの場合
        Exit Sub
    End If

    ' ファイルサイズをMBに変換
    fileSizeInMB = fileSizeInBytes / (1024 * 1024)

    ' 結果表示
    MsgBox "対象ファイル: " & targetFilePath & vbCrLf & _
           "サイズ: " & Format(fileSizeInMB, "0.00") & " MB (" & _
           Format(fileSizeInBytes, "#,##0") & " バイト)", vbInformation

    ' 容量制限チェック
    If fileSizeInBytes > MAX_ALLOWED_FILE_SIZE_MB * 1024 * 1024 Then
        MsgBox "警告: 添付ファイルのサイズが " & MAX_ALLOWED_FILE_SIZE_MB & "MB の上限を超えています!" & vbCrLf & _
               "送信前にサイズを削減するか、他の送信方法をご検討ください。", vbCritical
    Else
        MsgBox "添付ファイルのサイズは許容範囲内です。", vbInformation
    End If
End Sub

この GetFileSize_Robust 関数を使うことで、2GBを超えるファイルでも正確なサイズを取得し、FileLen のオーバーフロー問題を回避できます。 必要に応じて、この関数を既存のプロジェクトに組み込むことをお勧めします。

まとめ

VBAの FileLen 関数は、手軽にファイルのサイズを確認できる便利なツールです。しかし、その戻り値が Long 型であるため、2GBを超える巨大ファイルでは「オーバーフロー」エラーの危険性があります。
この落とし穴を回避するには、FileSystemObject (FSO)GetFile メソッドと Size プロパティを組み合わせることで、よりロバスト(堅牢)なファイルサイズ取得が可能になります。
これらのVBAテクニックを駆使すれば、メールの添付ファイルサイズ確認から、サーバーの容量制限チェックまで、ネットワーク関連のタスクを効率的かつ安全に自動化できます。あなたの業務におけるVBA活用の幅をさらに広げ、生産性向上に役立ててください。

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら