メモリの状況を取得する


ExcelのVBAには、Excelが使用できるメモリの総容量や、空き容量などを取得するプロパティがあります。

Sub Sample1()
    Dim n As Long, msg As String
    n = Application.MemoryTotal
    msg = msg & "Excelが使用できるメモリの総容量:" & Format(n / 1024, "#,##0") & "KB" & vbCrLf
    n = Application.MemoryUsed
    msg = msg & "Excelが使用しているメモリの総容量:" & Format(n / 1024, "#,##0") & "KB" & vbCrLf
    n = Application.MemoryFree
    msg = msg & "Excelが使用できるメモリの空き容量:" & Format(n / 1024, "#,##0") & "KB"
    MsgBox msg
End Sub

【注意】

上記のコードで使用している「Application.MemoryTotal」「Application.MemoryUsed」「Application.MemoryFree」は、Excel 2007以降使えなくなりました。

「Excelが使用できる」ということですが、パソコン全体の情報ではありません。パソコンに搭載されている物理メモリの容量や、使用している仮想メモリの情報などは次のようにAPIで取得します。

Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)
Private Type MEMORYSTATUS
    dwLength As Long
    dwMemoryLoad As Long
    dwTotalPhys As Long
    dwAvailPhys As Long
    dwTotalPageFile As Long
    dwAvailPageFile As Long
    dwTotalVirtual As Long
    dwAvailVirtual As Long
End Type

Sub Sample2()
    Dim msg As String, MemData As MEMORYSTATUS
    GlobalMemoryStatus MemData
    With MemData
        msg = msg & "物理メモリサイズ:" & Format(.dwTotalPhys / 1024, "#,##0") & _
                                                                          "KB" & vbCrLf
        msg = msg & "使用可能な物理メモリ:" & Format(.dwAvailPhys / 1024, "#,##0") & _
                                                                          "KB" & vbCrLf
        msg = msg & "ページファイルサイズ:" & Format(.dwTotalPageFile / 1024, "#,##0") & _
                                                                          "KB" & vbCrLf
        msg = msg & "使用可能なページファイル:" & Format(.dwAvailPageFile / 1024, "#,##0") & _
                                                                          "KB" & vbCrLf
        msg = msg & "仮想メモリサイズ:" & Format(.dwTotalVirtual / 1024, "#,##0") & _
                                                                          "KB" & vbCrLf
        msg = msg & "使用可能な仮想メモリ:" & Format(.dwAvailVirtual / 1024, "#,##0") & _
                                                                          "KB"
    End With
    MsgBox msg
End Sub