Microsoft Excel VBA - ディスクの容量や空き容量を取得する方法

◆概要

このページは、Excel VBAやVisual Basic 6.0でディスクの容量や空き容量を取得する方法について記載しています。

◆APIのGetDiskFreeSpaceを使う方法

APIのGetDiskFreeSpaceを使うと、ディスクの容量や空き容量を取得することができます。
Windows 95 と Windows 98 のすべてのバージョンでは、GetDiskFreeSpace は 2 GB の最大合計サイズと最大空き容量サイズを返します。逆に言えば、ディスクのサイズが2GB以上は正しい数値を返してきません。この制限は、Windows 95 の最初のバージョンが最大 2 GB の容量しかサポートしていないためのものです。

◆Sample code

Option Explicit

'API宣言
'(2ギガまで)
Private Declare Function GetDiskFreeSpace _
    Lib "KERNEL32" Alias "GetDiskFreeSpaceA" ( _
    ByVal lpRootPathName As String, lpSectorsPerCluster As Long, _
        lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, _
        lpTtoalNumberOfClusters As Long) As Long
 
Public Function DiskFreeMB(ByVal MODE As String, ByVal RootPath As String) _
                                                                As Double
  Dim rc As Long
  Dim lpRootPathName As String          'ルートのパス ”C:\"など
  Dim lpSectorsPerCluster As Long       'クラスタ当たりのセクタ数
  Dim lpBytesPerSector As Long          'セクタ当たりのバイト数
  Dim lpNumberOfFreeClusters As Long    'クラスタの空き数
  Dim lpTtoalNumberOfClusters As Long   'クラスタの総数
  
  
  'ルートディレクトリを指定
  lpRootPathName = RootPath
  
  '関数の実行
  rc = GetDiskFreeSpace(lpRootPathName, lpSectorsPerCluster, _
                lpBytesPerSector, lpNumberOfFreeClusters, _
                lpTtoalNumberOfClusters)
  Select Case MODE
  Case "空き容量"
    DiskFreeMB = CDbl(lpSectorsPerCluster) * CDbl(lpBytesPerSector) * _
                CDbl(lpNumberOfFreeClusters) / CDbl(1048576)
  Case "ディスク容量"
    DiskFreeMB = CDbl(lpSectorsPerCluster) * CDbl(lpBytesPerSector) * _
                CDbl(lpTtoalNumberOfClusters) / CDbl(1048576)
  End Select
  

End Function

Sub GetFreeSpace()
'ディスクの空き容量を取得する

    Dim dbFreespace As Double
    dbFreespace = DiskFreeMB("空き容量", "C:\")
    MsgBox dbFreespace
    
End Sub

Sub GetTotalDisk()
'ディスクの総容量を取得する

    Dim dbTotalspase As Double
    dbTotalspase = DiskFreeMB("ディスク容量", "C:\")
    MsgBox dbTotalspase
End Sub

◆GetDiskFreeSpaceEx 関数を使う方法

Windows 95 OSR 2(OEM Service Release 2)以降では、GetDiskFreeSpaceEx 関数が利用できます。GetDiskFreeSpaceEx 関数は、ボリュームが 2GB より大きいときも、正しい値を返します。

Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias _
                    "GetDiskFreeSpaceExA" _
                    (ByVal lpDirectoryName As String, _
                    lpFreeBytesAvailableToCaller As Currency, _
                    lpTotalNumberOfBytes As Currency, _
                    lpTotalNumberOfFreeBytes As Currency) As Long

' ドライブの空き容量を得る。
Private Function DiskFreeSpace(ByVal MODE As String, _
                        strDriveRoot As String) As Currency
    ' strDriveRoot : ドライブのルート(例: "C:\")
    Dim lngResult                As Long
    Dim curFreeAvailableToCaller As Currency
    Dim curTotalByte             As Currency
    Dim curTotalFreeByte         As Currency

    lngResult = GetDiskFreeSpaceEx(strDriveRoot, _
                                   curFreeAvailableToCaller, _
                                   curTotalByte, _
                                   curTotalFreeByte)
    Select Case MODE
        Case "空き容量"
            ' 通貨型で受けて、10000倍するとVBで正しい数値となる。
            DiskFreeSpace = curTotalFreeByte * 10000@
        Case "ディスク容量"
            ' 全容量なら curTotalByte * 10000@ で得られる。
            DiskFreeSpace = curTotalByte * 10000@
    End Select
    
End Function

Sub GetFreeSpace()
'ディスクの空き容量を取得する

    Dim dbFreespace As Double
    dbFreespace = DiskFreeSpace("空き容量", "C:\")
    MsgBox "空き容量は " & dbFreespace & " Byteです。", _
                            vbOKOnly + vbInformation
    
End Sub

Sub GetTotalDisk()
'ディスクの総容量を取得する

    Dim dbTotalspase As Double
    dbTotalspase = DiskFreeSpace("ディスク容量", "C:\")
    MsgBox "ディスク容量は " & dbTotalspase & " Byteです。", _
                            vbOKOnly + vbInformation
    
End Sub

◆SHGetDiskFreeSpaceを使う方法

Internet Explorer 4.0以上がインストールされた環境でなら、 SHGetDiskFreeSpace が使えます。

Private Declare Function SHGetDiskFreeSpace Lib "shell32" Alias _
                                "SHGetDiskFreeSpaceA" _
                                (ByVal pszVolume As String, _
                                 pqwFreeCaller As Currency, _
                                 pqwTot As Currency, _
                                 pqwFree As Currency) As Long
                                 
Private Sub Command1_Click()
    Dim lngResult       As Long
    Dim curFreeCaller   As Currency
    Dim curTot          As Currency
    Dim curFree         As Currency

    lngResult = SHGetDiskFreeSpace("C:\", _
                                   curFreeCaller, _
                                   curTot, _
                                   curFree)
    ' 成功。
    If (lngResult <> 0) Then
        MsgBox "ユーザーが利用できるディスクの空き容量 : " & _
                Format$(curFreeCaller * 10000, "#,##0") & "Bytes" & vbCr & _
                "ディスクの総容量 : " & Format$(curTot * 10000, "#,##0") & _
                "Bytes" & vbCr & _
                "ディスクの空き容量 : " & Format$(curFree * 10000, "#,##0") & _
                "Bytes"
    End If
End Sub


▼ページトップへ