Board logo

標題: [發問] Application.MemoryFree EXCEL 2007無法執行 [打印本頁]

作者: ML089    時間: 2013-12-8 13:56     標題: Application.MemoryFree EXCEL 2007無法執行

EXCEL 2003 VBA 下列語句可以執行
Application.MemoryFree
Application.MemoryTotal
Application.MemoryUsed

可是在EXCEL 2007卻無法執行(被取消了?)
有什麼函數可以替代?
作者: ML089    時間: 2013-12-8 17:48

網路找到兩篇資料,好像沒有人對此有興趣

2003版的應用

MemoryFree Property [Excel 2003 VBA Language Reference]

來源 URL: http://msdn.microsoft.com/en-us/library/office/aa175728(v=office.11).aspx
MemoryFree Property [Excel 2003 VBA Language Reference]
Office 2003

This topic has not yet been rated - Rate this topic

Returns the amount of memory that's still available for Microsoft Excel to use, in bytes. Read-only Long.

Example

This example displays a message box showing the number of free bytes.

MsgBox "Microsoft Excel has " & _    Application.MemoryFree & " bytes free"

Sub version()

    Dim wrkbk As Variant
    Dim User As Variant
    Dim Vers As Variant
    Dim memfree As Variant
    Dim memtotal As Variant
    Dim memused As Variant
    On Error Resume Next
    wrkbk = Application.ActiveWorkbook.Name
    User = Application.UserName
    Vers = Application.version
    memfree = Application.MemoryFree 'EXCEL 2003 ONLY USE
    memtotal = Application.MemoryTotal 'EXCEL 2003 ONLY USE
    memused = Application.MemoryUsed 'EXCEL 2003 ONLY USE

    MsgBox _
            "Memory Total: " & memtotal & Chr(13) & _
            "Memory Used:  " & memused & Chr(13) & _
            "Memory Free:  " & memfree & Chr(13) & _
            Chr(13) & _
            "Name of workbook: " & wrkbk & Chr(13) & _
            "Name of User: " & User & Chr(13) & _
            "Version of VBA: " & Vers
End Sub

螢幕擷取
作者: ML089    時間: 2013-12-8 17:51

前面是2003版可以執行,2007版不能
下面是2003 /2007版都可以用
但兩個對記憶的表達不同

如何: 從 Excel 2000 中的 Windows API 取得 Windows 的狀態資訊來源 URL: http://support.microsoft.com/kb/213267
如何: 從 Excel 2000 中的 Windows API 取得 Windows  的狀態資訊
在 Microsoft Excel 可以以程式設計的方式取得系統狀態資訊,並顯示在工作表中。本文將逐步提供 Microsoft Visual Basic for Applications 範例會顯示下列的資訊,藉由使用 Windows API 函式的 Sub 程序:
        * GetVersionEx API 函式的 Windows 版本號碼。
        * 具有 GetSystemInfo API 函式的 CPU 處理器型別。
        * 使用 GlobalMemoryStatus API 函式的可用記憶體數量。

若要取得 Windows  狀態資訊的範例程式碼Microsoft 會提供程式設計範例僅供說明,不做任何明示或默示的保證,其中包括但不是限於適售性以及適合某特定用途之默示擔保責任。本文假設您已熟悉我們所示範的程式設計語言以及用來建立和偵錯程序的工具。Microsoft 技術支援工程師可以協助解釋特定程序的功能,但它們不會修改這些範例以提供附加功能或建構程序來滿足您的特定需求。
如果您有限制的程式設計經驗,您可能想要連絡微軟認證夥伴 」 或 「 Microsoft 諮詢服務。如需詳細資訊,請造訪下列 Microsoft 網站取得:

Microsoft 認證合作夥伴- https://partner.microsoft.com/global/30000104

Microsoft 諮詢服務- http://support.microsoft.com/gp/advisoryservice

如需有關可用的支援選項,以及有關如何連絡 Microsoft 的詳細資訊,請造訪下列 Microsoft 網站: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS 若要使用 Windows API 呼叫,以取得 Windows 狀態資訊,請依照下列步驟執行:
        1. 啟動 Microsoft Excel,然後建立新的活頁簿。
        2. 在 [工具] 功能表上指向 [巨集,然後按一下 [ Visual Basic 編輯器] (或按下 ALT + F11)。
        3. 按一下 [插入] 功能表的 [模組]。
        4. 在模組工作表中,輸入下列程式碼:
Option Explicit

Type SYSTEM_INFO
    dwOemID As Long
    dwPageSize As Long
    lpMinimumApplicationAddress As Long
    lpMaximumApplicationAddress As Long
    dwActiveProcessorMask As Long
    dwNumberOrfProcessors As Long
    dwProcessorType As Long
    dwAllocationGranularity As Long
    dwReserved As Long
End Type

Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

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

'The following three Declare lines must be each entered on a single
'line.

Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
             (LpVersionInformation As OSVERSIONINFO) As Long
Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As _
            MEMORYSTATUS)
Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As _
              SYSTEM_INFO)

Public Const PROCESSOR_INTEL_386 = 386
Public Const PROCESSOR_INTEL_486 = 486
Public Const PROCESSOR_INTEL_PENTIUM = 586
Public Const PROCESSOR_MIPS_R4000 = 4000
Public Const PROCESSOR_ALPHA_21064 = 21064

Sub SystemInformation()
Dim msg As String         ' Status information.
Dim NewLine As String     ' New-line.
Dim ret As Integer        ' OS Information
Dim ver_major As Integer  ' OS Version
Dim ver_minor As Integer  ' Minor Os Version
Dim Build As Long         ' OS Build

      NewLine = Chr(13) + Chr(10)  ' New-line.
      ' Get operating system and version.
      Dim verinfo As OSVERSIONINFO
      verinfo.dwOSVersionInfoSize = Len(verinfo)
      ret = GetVersionEx(verinfo)
      If ret = 0 Then
          MsgBox "Error Getting Version Information"
          End
      End If

      Select Case verinfo.dwPlatformId
          Case 0
              msg = msg + "Windows 32s "
          Case 1
              msg = msg + "Windows 95/98 "
          Case 2
              msg = msg + "Windows NT/2000 "
      End Select

      ver_major = verinfo.dwMajorVersion
      ver_minor = verinfo.dwMinorVersion
      Build = verinfo.dwBuildNumber
      msg = msg & ver_major & "." & ver_minor
      msg = msg & " (Build " & Build & ")" & NewLine & NewLine

      ' Get CPU type and operating mode.
      Dim sysinfo As SYSTEM_INFO
      GetSystemInfo sysinfo
      msg = msg + "CPU: "
      Select Case sysinfo.dwProcessorType
          Case PROCESSOR_INTEL_386
              msg = msg + "Intel 386" + NewLine
          Case PROCESSOR_INTEL_486
              msg = msg + "Intel 486" + NewLine
          Case PROCESSOR_INTEL_PENTIUM
              msg = msg + "Intel Pentium" + NewLine
          Case PROCESSOR_MIPS_R4000
              msg = msg + "MIPS R4000" + NewLine
          Case PROCESSOR_ALPHA_21064
              msg = msg + "DEC Alpha 21064" + NewLine
          Case Else
              msg = msg + "(unknown)" + NewLine
      End Select

      msg = msg + NewLine

      ' Get free memory.
      Dim memsts As MEMORYSTATUS
      Dim memory As Long
      GlobalMemoryStatus memsts
      memory = memsts.dwTotalPhys
      msg = msg + "Total Physical Memory: "
      msg = msg + Format(memory \ 1024, "###,###,###") + "K" + NewLine
      memory = memsts.dwAvailPhys
      msg = msg + "Available Physical Memory: "
      msg = msg + Format(memory \ 1024, "###,###,###") + "K" + NewLine
      memory = memsts.dwTotalVirtual
      msg = msg + "Total Virtual Memory: "
      msg = msg + Format(memory \ 1024, "###,###,###") + "K" + NewLine
      memory = memsts.dwAvailVirtual
      msg = msg + "Available Virtual Memory: "
      msg = msg + Format(memory \ 1024, "###,###,###") + "K" + NewLine

      MsgBox msg, vbOKOnly, "System Info"
End Sub
                                       

        5. 在 [工具] 功能表上按一下 [巨集,然後按一下 [巨集。
        6. 按一下屬性,,然後按一下 [執行。

此巨集會傳回您的系統資訊會顯示一個訊息方塊。



螢幕擷取
作者: ML089    時間: 2013-12-8 17:55

表較一下 #1 及 #2 所顯示的記憶體內容

[attach]17009[/attach]

[attach]17011[/attach]
作者: c_c_lai    時間: 2013-12-8 18:03

回復 1# ML089
很遺憾,這些功能都被微軟隱藏起來了。
這亦是他們可愛的地方。
作者: ML089    時間: 2013-12-8 18:47

回復 5# c_c_lai

本以為 2003版的VBA在2007版一定可以使用,原來微軟那麼 "可愛" 還會跟我們開開小玩笑故意把功能取消掉。

我本來是想監測VBA程式開陣列時會用掉多少記憶體,極限是可以開多少記憶體大小,以利讀取大型TXT檔時要如何讀入最大量來加速程式執行。

不知你有這方面的資料可以提供參考嗎?
作者: c_c_lai    時間: 2013-12-8 19:08

回復 6# ML089
之前我只接觸到 C/C++ 應用軟體撰寫方面,甚少獵攝 Excel,
所以你會發覺在 Excel 語法處理上常常需要求助,雖然都是
語言,但是在資料層處理上還是有些微的區別的。
一開始看到你的發文,我也是不斷地上網搜尋相關資料,
結果都跟你 1# 、2# 的內容一樣,所以我才說他們非常可愛。
作者: ML089    時間: 2013-12-8 20:25

DOS 時期寫過 FORTRAN,後來停了15年沒有繼續寫,最近才開始學 Excel VBA語法,也正在摸索中,所以我常來這裡逛。




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)