ファイル保存の前にこのVBAを使用し空き容量をチェックしておくと、不用のエラーから回避することができます。
ドライブの空き容量の取得を取得するには、Windows APIのGetDiskFreeSpaceEx関数を使用します。
GetDiskFreeSpace関数もありますが、これは2GB以上の大容量では不正確です。
GetDiskFreeSpaceExの構文
Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, lpFreeBytesAvailableToCaller As Currency, lpTotalNumberOfBytes As Currency, lpTotalNumberOfFreeBytes As Currency) As Long
戻り値:関数が成功すると0以外の値が返り、関数が失敗すると0が返ります。
- lpDirectoryName:最後尾に"\"をつけドライブ名を指定します。
- lpFreeBytesAvailableToCaller:使用出来るドライブの空き容量が入ります。
- lpTotalNumberOfBytes:ドライブの総容量が入ります。
- lpTotalNumberOfFreeBytes:空き容量が入ります。ユーザー毎に割当てがある場合、lpTotalNumberOfFreeBytesとは異なる値になります。
VBAの場合、容量は10000倍し通貨型に格納します。
関連する「ドライブ・フォルダ・ファイルの更新日時を取得」を掲載していますので参照してください。
ドライブの空き容量の取得を取得するVBAコード
ExcelシートとVBA入力画面
シートにコマンドボタンを配置します。
GetDiskFreeSpaceExの宣言文、ExGetDiskFreeSpaceプロシージャ、CommandButton1のクリックイベントを入力します。
VBAコードの解説
- Windows APIのGetDiskFreeSpaceExを宣言します。
ExGetDiskFreeSpaceプロシージャ
- 引数は取得するドライブ名、通貨型の容量を格納する3つの変数です。
- GetDiskFreeSpaceExを実行します。
- 通貨型の変数に、取得した容量を10000倍し格納します。
CommandButton1のクリックイベント
- ドライブ名を格納する変数、通貨型の容量を格納する3つの変数を宣言します。
- ドライブ名を格納する変数に、取得するドライブ名をセットします。
- 引数をセットし、ExGetDiskFreeSpaceプロシージャを呼び出します。
- Format関数で書式を設定し、取得した容量をB5セルに表示します。
ExcelシートのVBAコード
Option Explicit
'空き容量を取得するWindowsAPI
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" _
Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, _
lpFreeBytesAvailableToCaller As Currency, _
lpTotalNumberOfBytes As Currency, _
lpTotalNumberOfFreeBytes As Currency) As Long
'空き容量を取得を実行
Public Sub ExGetDiskFreeSpace(Drive As String, freeBytesAvailable As Currency, _
totalNumberOfBytes As Currency, totalNumberOfFreeBytes As Currency)
GetDiskFreeSpaceEx Drive, freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes
'通貨型を10000倍すると取得する数値となる
freeBytesAvailable = freeBytesAvailable * 10000
totalNumberOfBytes = totalNumberOfBytes * 10000
totalNumberOfFreeBytes = totalNumberOfFreeBytes * 10000
End Sub
Private Sub CommandButton1_Click()
'調べるフォルダ名
Dim sDir As String
'ユーザーが利用可能な空き容量
Dim freeBytesAvailable As Currency
'ディスク総容量
Dim totalNumberOfBytes As Currency
'ディスクの空き容量
Dim totalNumberOfFreeBytes As Currency
sDir = "c:\"
ExGetDiskFreeSpace sDir, freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes
'結果表示
Range("B5") = "ドライブ:" & sDir & vbCrLf & _
"利用可能な空容量: " & Format$(Format$(freeBytesAvailable, "#,##0"), "@@@@@@@@@@@@@@@ Byte") & vbCrLf & _
"総容量: " & Format$(Format$(totalNumberOfBytes, "#,##0"), "@@@@@@@@@@@@@@@ Byte") & vbCrLf & _
"空容量: " & Format$(Format$(totalNumberOfFreeBytes, "#,##0"), "@@@@@@@@@@@@@@@ Byte")
End Sub
実行結果 Excel画面
ユーザー毎の割当てがない(1名で使用)ので、利用可能な空容量と空容量は同じ値になります。