Microsoft Excel VBA - メモリーの使用状況を表示する

◆概要

 このページは、Excelでメモリー容量を取得する方法について記載しています。

APIのGlobalMemoryStatus関数を使うとメモリー容量を取得することができます。GlobalMemoryStatus関数は2GBを超えるとエラーになりますので、2GBを超える場合はMEMORYSTATUSEX関数を使います。

◆Sample code
次の例は、空き物理メモリを取得しメッセージボックスに表示します。

Private Type MEMORYSTATUSEX
     dwLength As Long               ' MEMORYSTATUSの大きさ
     dwMemoryLoad As Long           ' 使用中メモリの割合
     ullTotalPhys As Currency       ' 全物理メモリ
     ullAvailPhys As Currency       ' 空き物理メモリ
     ullTotalPageFile As Currency   ' ページング可能な最大ファイルサイズ
     ullAvailPageFile As Currency   ' 現在ページング可能なファイルサイズ
     ullTotalVirtual As Currency    ' 最大仮想メモリ
     ullAvailVirtual As Currency    ' 現在使用可能な仮想メモリ
     ullAvailExtendedVirtual As Currency
 End Type


Private Declare Function GlobalMemoryStatusEx _
     Lib "kernel32" (mseStatus As MEMORYSTATUSEX) As Long

Private Type MEMORYSTATUS
         dwLength As Long           ' MEMORYSTATUSの大きさ
         dwMemoryLoad As Long       ' 使用中メモリの割合
         dwTotalPhys As Long        ' 全物理メモリ
         dwAvailPhys As Long        ' 空き物理メモリ
         dwTotalPageFile As Long    ' ページング可能な最大ファイルサイズ
         dwAvailPageFile As Long    ' 現在ページング可能なファイルサイズ
         dwTotalVirtual As Long     ' 最大仮想メモリ
         dwAvailVirtual As Long     ' 現在使用可能な仮想メモリ
End Type

Private Declare Sub GlobalMemoryStatus Lib "kernel32" ( _
                                 lpBuffer As MEMORYSTATUS)

Sub Test()
    Dim dMemoryLoad As Double       ' メモリ使用率
    Dim dTotPhys As Double          ' 全物理メモリ
    Dim dAvailPhys As Double        ' 利用可能メモリ
    Dim dTotalPageFile As Double    ' ページング可能な最大ファイルサイズ
    Dim dAvailPageFile As Double    ' 現在ページング可能なファイルサイズ
    Dim dTotalVirtual As Double     ' 最大仮想メモリ
    Dim dAvailVirtual As Double     ' 現在使用可能な仮想メモリ
    
    Dim res As Long
  
    Dim mem As MEMORYSTATUS
    Dim MemStat As MEMORYSTATUSEX

    ' GlobalMemoryStatus はWindows98ではエラーになる
     On Error Resume Next
     MemStat.dwLength = Len(MemStat)
     'If Err.Number = 0 Then
     res = GlobalMemoryStatusEx(MemStat)
     If res Then
        dMemoryLoad = MemStat.dwMemoryLoad          ' メモリ使用率
        dTotPhys = MemStat.ullTotalPhys * 10000&    '/ (1024& * 1024)'全物理メモリ
        dAvailPhys = MemStat.ullAvailPhys * 10000&  ' 利用可能メモリ
        dTotalPageFile = MemStat.ullTotalPageFile   ' ページング可能な最大ファイルサイズ
        dAvailPageFile = MemStat.ullAvailPageFile   ' 現在ページング可能なファイルサイズ
        dTotalVirtual = MemStat.ullTotalVirtual     ' 現在使用可能な仮想メモリ
         ' don't assign 2+gig to a Long
     Else
         ' 次のコードはWindows98ではオーバーフローになってエラーとなる
         ' しかし、Windows 98では2GB以上はありそうもない
         Call GlobalMemoryStatus(mem)
         dMemoryLoad = mem.dwMemoryLoad             ' メモリ使用率
         dTotPhys = mem.dwTotalPhys                 ' 全物理メモリ
         dAvailPhys = mem.dwAvailPhys               ' 利用可能メモリ
         dTotalPageFile = mem.dwTotalPageFile       ' ページング可能な最大ファイルサイズ
         dAvailPageFile = mem.dwAvailPageFile       ' 現在ページング可能なファイルサイズ
         dTotalVirtual = mem.dwTotalVirtual         ' 現在使用可能な仮想メモリ
     End If

    ' メッセージボックスにメモリ情報を表示
    MsgBox "メモリ使用率:" & dMemoryLoad & vbCrLf & _
            "全物理メモリ;" & Format(dTotPhys / (1024& * 1024), "#,##0") & "MB" & vbCrLf & _
            "利用可能メモリ;" & Format(dAvailPhys / (1024& * 1024), "#,##0") & "MB" & vbCrLf & _
            "ページング可能な最大ファイルサイズ;" & Format(dTotalPageFile / 1024, "#,##0") & "KB" & vbCrLf & _
            "現在ページング可能なファイルサイズ;" & Format(dAvailPageFile / 1024, "#,##0") & "KB" & vbCrLf & _
            "現在使用可能な仮想メモリ;" & Format(dTotalVirtual / 1024, "#,##0") & "KB"

End Sub

◆実行結果

▼ページトップへ