VBAで大容量のファイルを出力したり、バックアップを作成したりするマクロを組む際には、処理の実行前に「保存先のドライブに十分な空き容量があるか?」を事前にチェックできると、より安全で親切なプログラムになります。
FileSystemObject (FSO)
の**Drive
オブジェクトを使えば、PCに接続されている特定のドライブ(CドライブやDドライブなど)の、合計サイズや空き容量**といった情報を簡単に取得できます。
この記事では、その具体的な方法を解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、Cドライブの合計サイズ、空き容量、使用済み容量を計算し、分かりやすいGB(ギガバイト)単位でメッセージボックスに表示するVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub GetDriveSpaceInfo()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim targetDrive As Drive
Dim driveLetter As String
Dim totalSpace As Currency
Dim freeSpace As Currency
Dim usedSpace As Currency
'--- 調査対象のドライブ文字を設定 ---
driveLetter = "C"
' ドライブが存在しない場合のエラーを回避
If Not fso.DriveExists(driveLetter) Then
MsgBox driveLetter & "ドライブが見つかりません。", vbCritical
Exit Sub
End If
'--- 1. Driveオブジェクトを取得 ---
Set targetDrive = fso.GetDrive(driveLetter)
' ドライブの準備ができていない場合(CDドライブにディスクがないなど)
If Not targetDrive.IsReady Then
MsgBox targetDrive.Path & " は準備ができていません。", vbExclamation
Exit Sub
End If
'--- 2. 各プロパティで容量(バイト単位)を取得 ---
totalSpace = targetDrive.TotalSize
freeSpace = targetDrive.FreeSpace
'--- 3. 使用済み容量を計算 ---
usedSpace = totalSpace - freeSpace
'--- 4. 結果をGB単位で表示 ---
Dim message As String
Const GIGABYTE As Currency = 1024 * 1024 * 1024 ' 1GBをバイトで定義
message = "【" & UCase(driveLetter) & "ドライブの容量情報】" & vbCrLf & vbCrLf & _
"合計サイズ: " & Format(totalSpace / GIGABYTE, "0.00") & " GB" & vbCrLf & _
"使用済み: " & Format(usedSpace / GIGABYTE, "0.00") & " GB" & vbCrLf & _
"空き容量: " & Format(freeSpace / GIGABYTE, "0.00") & " GB"
MsgBox message, vbInformation, "ドライブ容量の取得"
' オブジェクトを解放
Set targetDrive = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
① fso.GetDrive("ドライブ文字")
GetDrive
メソッドは、引数で指定したドライブレター("C"
や"D"
など)に対応するDrive
オブジェクトを返します。このオブジェクトが、ドライブの様々な情報を持っています。
② Drive
オブジェクトの容量プロパティ
Drive
オブジェクトには、容量に関する主要なプロパティが3つあります。
.TotalSize
: ドライブの総容量をバイト単位で返します。.FreeSpace
: ドライブ全体の空き容量をバイト単位で返します。.AvailableSpace
: 現在のユーザーが利用可能な空き容量をバイト単位で返します。通常は.FreeSpace
と同じ値ですが、ディスククォータ(ユーザーごとの容量制限)が設定されている環境では、より少ない値を返すことがあります。一般的には.FreeSpace
を使えば問題ありません。
③ 単位の変換
各プロパティが返す値は、非常に大きな数値になるバイト単位です。人間にとって分かりやすいGB(ギガバイト)などの単位に変換するには、1024
で割る計算を行います。
- KB:
バイト数 / 1024
- MB:
バイト数 / 1024 / 1024
- GB:
バイト数 / 1024 / 1024 / 1024
サンプルコードでは、大きな数値を扱う際に誤差が出にくいCurrency
(通貨型)を計算用のデータ型として使用しています。
【応用】十分な空き容量があるかチェックする関数
このテクニックを応用すれば、「指定したサイズのファイルを保存するのに十分な空き容量があるか?」を判定する、実用的な自作関数も作れます。
Function HasEnoughSpace(driveLetter As String, requiredSizeMB As Double) As Boolean
Dim fso As New FileSystemObject
If fso.DriveExists(driveLetter) Then
If fso.GetDrive(driveLetter).FreeSpace / 1024 / 1024 >= requiredSizeMB Then
HasEnoughSpace = True
End If
End If
End Function
Sub CheckSpace()
If HasEnoughSpace("C", 500) = True Then ' Cドライブに500MBの空きがあるか?
MsgBox "十分な空き容量があります。"
Else
MsgBox "空き容量が不足しています。"
End If
End Sub
まとめ
FSOを使えば、ドライブの容量情報を簡単に取得できます。
- **
fso.GetDrive("C")
**で、調べたいドライブのDrive
オブジェクトを取得する。 - **
.TotalSize
で合計サイズ、.FreeSpace
**で空き容量を取得する。 - 戻り値はバイト単位なので、
1024
で割ってGBなどに変換する。
大容量のファイルを扱うマクロでは、この方法で事前に空き容量をチェックする処理を組み込むことで、よりユーザーに親切で、安定したツールを作成することができます。