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を超える巨大ファイルに対して
FileLen 関数を使用すると、「オーバーフロー」エラーが発生し、プログラムが停止する可能性があります。
現代のネットワーク環境では、巨大なZIPファイルや動画ファイルなど、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活用の幅をさらに広げ、生産性向上に役立ててください。