none
2016 Excel VBA Memory 不足 RRS feed

  • 問題

  • 本人用錄製巨集方式,改寫VBA,但是執行時卻出現記憶體不足,偵錯出現,請教該如何處理?

    我是WINDOWS 10 版本1709 作業系統組建16299.64 64位元、2016 Office 64位元

    感恩!

    <style></style>

    2017年11月20日 上午 06:37

所有回覆

  • 你有試過你改網址後,下載的資料有多少嗎?

    你只有這樣的資訊,連猜都不知道往哪猜。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年11月21日 下午 04:46
  • 抱歉!本人也是新手,第一次使用VBA,我將程式附錄於下:

                                              

    Sub 批次下載()

    Dim D As String
    Dim E As String
    Dim i As Long
    Dim j As Long


        D = Application.WorksheetFunction.Text(Sheets("日期").Range("B1"), "yyyy/mm/dd")
        E = Application.WorksheetFunction.Text(Sheets("日期").Range("B2"), "yyyy/mm/dd")
        i = DateValue(D)
        j = DateValue(E)
        Application.Goto ActiveWorkbook.Sheets("Temp").Range("A2")
            For i = DateValue(D) To j Step 1
                Call GetStockData(i)
            Next i    

    End Sub
    Sub GetStockData(i)
        Dim st As Date
        Dim ed As Date
        Dim N As String
        Dim x As Integer
        Dim y As Integer
        Dim QryTbl As QueryTable
        Dim Webaddress As String

        st = CDate(i)
        N = Application.WorksheetFunction.Text(st, "yyyymmdd")
        Webaddress = "http://www.twse.com.tw/exchangeReport/MI_INDEX?"
        With Worksheets("Temp")
        .Cells.Clear
        Set QryTbl = .QueryTables.Add("TEXT;" & Webaddress & "response=csv&date=" & N & "&type=ALLBUT0999" _
                     , Destination:=Range("$B$1"))
        End With
        With QryTbl
            .Name = "MI_INDEX?response=csv&date=" & N & "&type=ALLBUT0999"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 950
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
        Set a = Range("A:A").Find("1101", lookat:=xlPart)
            x = a.Row - 1
        Range(Cells(1, 1), Cells(x, 1)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlUp)).Select
        Selection.Delete Shift:=xlUp
        Selection.Columns.AutoFit
        Range("A1").Select
        Range(Selection, Selection.End(xlToRight)).Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$1:$P$927").AutoFilter Field:=1, Criteria1:=Array( _
            "1312A", "2002A", "2881A", "2882A", "2887E", "910322", "910482", "910708", "910801", _
            "910861", "911608", "911616", "911619", "911622", "911868", "912000", "912398", _
            "本統計資訊含一般、零股、盤後定價、鉅額交易,不含拍賣、標購。", "除境外指數股票型基金及外國股票第二上市外,餘交易單位皆為千股。", "備註:", _
            "當證券代號為認購(售)權證及認股權憑證時本益比欄位置為結算價;但如為以外國證券或指數為標的之認購(售)權證及履約方式採歐式者,該欄位為空白。", _
            "漲跌(+/-)欄位符號說明:+/-/X表示漲/跌/不比價。"), Operator:=xlFilterValues
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Delete Shift:=xlUp
        Selection.AutoFilter
        Range("A1").Select

        If Sheets("Temp").Range("B1") = "很抱歉,沒有符合條件的資料!" Then

            Range("A1", Selection.End(xlDown)).Select
            Range(Selection, Selection.End(xlToRight)).Select
            Selection.Delete
            Application.CutCopyMode = False

        Else

            y = Cells(Rows.Count, 2).End(xlUp).Row
            Range(Cells(2, 1), Cells(x, 1)) = N
            Range("A2", Selection.End(xlDown)).Select
            Range(Selection, Selection.End(xlToRight)).Select
            Selection.Copy
            Application.Goto ActiveWorkbook.Sheets("資料彙集").Range("A2")
            Selection.Insert Shift:=xlDown
            Application.Goto ActiveWorkbook.Sheets("Temp").Range("A2")
            Application.CutCopyMode = False

        End If
    End Sub

    若還需要資料請告知!

    2017年11月22日 上午 01:29
  • ...

    記憶體不足通常是資料過大,造成自動轉換過度耗損記憶體。

    問你下載網址資料有多大,你貼程式碼,試打算等人有空再理你嗎?

    那時,這篇都不知道被洗到哪了。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年11月22日 下午 03:59
  • 謝謝指正,上網找到測虛擬記憶體程式,約1G,我的RAM約3.89G可用,詳如執行後如下圖:

    測試下載資料量本機記憶體規格

    2017年11月23日 上午 01:39
  • ...

    你如果看不懂這句「問你下載網址資料有多大」,請直接問。

    我不知道貼程式碼、貼程式執行前記憶體使用情形有啥意義。

    另外,每個 Process 配置的記憶體上限是 2GB ,同一個 Process 內單一陣列有陣列記憶體宣告上限為 256 MB (VBA 的 Variant Array 限制),如果你總記憶體含虛擬記憶體大於 2GB 時,貼總記憶體的容量並沒有意義。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年11月23日 下午 03:54
  • 感謝您的回應

    說實在我不知道要如何知道下載資料量要到那找到這個數據,我是用心開啟一個Excel檔案,開啟資料標籤,從文字檔下載,從TWSE下載每日收盤行情下載在工作表1,再用showMemorey2.xlxb測得數據為約為1G,不知這是否可說明下載資料量有多大問題?請指正?

    2017年11月24日 上午 01:25
  • 如果您的資料是來自文字檔, 可以看一下文字檔的大小, 如果資料是來自TWSE下載每日收盤行情, 可以資料下到EXCEL工作表後, 將Excel工作表匯出成純文字文件, 再看一下文字檔的大小, 就可以知道資料量的大約大小
    2017年11月24日 上午 01:49
  • 感謝協助,我測得資料量大小為7.11KB,詳如附圖
    2017年11月24日 上午 02:26
  • 如果檔案只有 17kb ,遠小於最小一節區 64kb ,在各種角度不會觸發 memory 不足。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年11月24日 下午 03:49
  • 感謝回應,請教大師下載檔案既然只有7.11KB,為何會出現記憶體不足的訊號,而且停止運作?可能是程式出問題嗎?或是其他可能性?請大師指點?
    2017年11月25日 上午 02:31
  • 不知道,沒有對應資訊測試你的程式碼。

    因為你是呼叫 Excel 內建方法,跟 Excel 版本與環境有關:

    1. 忘了八月還是九月,Office Update 會影響 VBA ,請確認更新到最新版。

    2. 拿到別台跑看看,避免受增益集或防毒軟體干擾。

    3. 改用 xmlhttp 自行從 VBA 內下載網頁檔案,自行匯入,可改善 Excel 內建方法無法除錯問題。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年11月25日 上午 02:54
  • 感謝大師回應,也感謝您的指點,我仍在學習xmlhttp,我會試試。

    請教大師我的Office 2016顯示 (KB4011262)64位元版本2017/11/16已更新,我都是自動使用下載更新版,本您說的是指這個版本嗎?

    請教您1.的說明,能否說明影響VBA甚麼功能?

    關於2.目前我只有一台,會努力嘗試用別人電腦跑跑看。

    感恩!

    2017年11月25日 上午 03:45
  • 往前面翻一下先前貼文,Word/Excel/PowerPoint/Outlook 都有不正常的情形。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年11月25日 下午 03:28