none
Excel VBA 產生CHART記憶體越來越大 RRS feed

  • 問題

  • 建立圖表時 Set myChart = ActiveSheet.ChartObjects.Add(550, 85, 360, 216) 記憶體越來越大
    請問要如何釋放記憶體呢?
    程式碼如下:

    For k1 = 0 To 10 Step 1
    ‘ Add Chart

    ‘ActiveSheet.Shapes.AddChart.Select
    ‘ Position and size
    Set myChart = ActiveSheet.ChartObjects.Add(550, 85, 360, 216)
    Set ch = myChart.Chart
    
    k = k + 1
    Cells(2, “BF”).Value = k
    Set ch = Nothing
    Set myChart = Nothing
    Next


    Roy Tsai
    2012年1月24日 上午 03:16

解答

  • 如果物件不刪除,本來就會越來越大,你裡面沒有刪除物件的程式碼。

    Excel 2010 @ Win7 x86 / DRAM: 2GB

    執行第一次:Excel 50 MB

    執行第二次:Excel 51 MB

    執行第三次:Excel 52 MB

    執行三次完,Excel 內共計 30 Charts 。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2012年1月24日 上午 10:09

所有回覆

  • 一定要在迴圈內用到Chart嗎?可以移到迴圈外使用嗎...
    2012年1月24日 上午 04:41
  • 如果物件不刪除,本來就會越來越大,你裡面沒有刪除物件的程式碼。

    Excel 2010 @ Win7 x86 / DRAM: 2GB

    執行第一次:Excel 50 MB

    執行第二次:Excel 51 MB

    執行第三次:Excel 52 MB

    執行三次完,Excel 內共計 30 Charts 。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2012年1月24日 上午 10:09
  • 一定要在迴圈內用到Chart嗎?可以移到迴圈外使用嗎...

    我寫VBA是要畫很多Chart,並且比較那些參數是最佳的,所以無法一道迴圈外,請問有甚麼方法可以降低記憶體呢?

    ps 我在執行時有時記憶體只有150MB很正常,但有時卻到1.76GB(Excel 2007),就當掉了


    Roy Tsai
    2012年1月24日 下午 03:04
  • 如果物件不刪除,本來就會越來越大,你裡面沒有刪除物件的程式碼。

    Excel 2010 @ Win7 x86 / DRAM: 2GB

    執行第一次:Excel 50 MB

    執行第二次:Excel 51 MB

    執行第三次:Excel 52 MB

    執行三次完,Excel 內共計 30 Charts 。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

       我在執行時有時記憶體只有150MB很正常,但有時卻到1.76GB(Excel 2007),就當掉了

       後來改試excel 2010 x64,記憶體飆到3GB 無法存檔

       我是VBA的初學者 不知怎麼刪除物件 請告知 謝謝


    Roy Tsai
    2012年1月24日 下午 03:08
  • 一定要在迴圈內用到Chart嗎?可以移到迴圈外使用嗎...

    我寫VBA是要畫很多Chart,並且比較那些參數是最佳的,所以無法一道迴圈外,請問有甚麼方法可以降低記憶體呢?

    ps 我在執行時有時記憶體只有150MB很正常,但有時卻到1.76GB(Excel 2007),就當掉了


    Roy Tsai
    你前面這篇不是說不要刪?

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2012年1月25日 下午 02:40
  •  

    • 作業系統版本-Windows 7 pro
    • Office XP, Office 2007
    • 開發環境-VBA
    • 錯誤訊息與狀況描述-

              我有兩個檔案,VBA的程式碼是相同,有一個執行時很正常,另一個會發生記憶體過大到1.76GB,無法存檔,後來發現是建立圖表時 Set myChart = ActiveSheet.ChartObjects.Add(550, 85, 360, 216) 記憶體越來越大

    • 程式碼如下:
    '獲得當前的Excel設置狀態,將其放置在代碼的開頭
        screenUpdateState = Application.ScreenUpdating
        statusBarState = Application.DisplayStatusBar
        calcState = Application.Calculation
        eventsState = Application.EnableEvents
        displayPageBreakState = ActiveSheet.DisplayPageBreaks '注:這是工作表級的設置
        '關閉一些Excel功能使代碼運行更快
        Application.ScreenUpdating = False
        Application.DisplayStatusBar = False
        Application.Calculation = xlCalculationManual
        Application.EnableEvents = False
        ActiveSheet.DisplayPageBreaks = False '注:這是工作表級的設置

        Dim Min1 As Currency, Max1 As Currency, Step1 As Currency, Min2 As Currency, Max2 As Currency, Step2 As Currency
        Dim Min3 As Currency, Max3 As Currency, Step3 As Currency, Min4 As Currency, Max4 As Currency, Step4 As Currency
        Dim k As Long, k1 As Long, k3 As Long, k2 As Long, k1max As Long, k3max As Long, k2max As Long
        Dim k1start As Long, k3start As Long, k2start As Long, k1end As Long, k3end As Long, k2end As Long
        Dim UnitNumber As Long, ChartNo As Long
        Dim Left As Long, Top As Long, Width As Long, Height As Long, SrartRaw As Long, UnitNumber1 As Long
        Dim Left1 As Long, Top1 As Long, MiddleChart As Currency, InnerChart As Currency, OuterChart As Currency, UnitNumber2 As Long
        Dim ChartContent As String, MiddleChartContent As String, InnerChartContent As String, OuterChartContent As String, xaxis As String
        Dim MiddleChartContentC As String, InnerChartContentC As String, OuterChartContentC As String
        'Dim Start As Double, Finish As Double
        Dim Series1 As String, Series2 As String, Series3 As String
        Dim myChart As ChartObject
        Dim ch As Chart
        'Start = Timer: '**
        Min1 = Cells(1, "AX").Value
        Max1 = Cells(2, "AX").Value
        Step1 = Cells(3, "AX").Value
        Min2 = Cells(1, "BA").Value
        Max2 = Cells(2, "BA").Value
        Step2 = Cells(3, "BA").Value
        Min3 = Cells(1, "BD").Value
        Max3 = Cells(2, "BD").Value
        Step3 = Cells(3, "BD").Value
        Min4 = Cells(1, "BI").Value
        Max4 = Cells(2, "BI").Value
        Step4 = Cells(3, "BI").Value
        k1max = Cells(1, "BM").Value
        k2max = Cells(2, "BM").Value
        k3max = Cells(3, "BM").Value
        k1start = Cells(1, "BO").Value
        k2start = Cells(2, "BO").Value
        k3start = Cells(3, "BO").Value
        k1end = Cells(1, "BQ").Value
        k2end = Cells(2, "BQ").Value
        k3end = Cells(3, "BQ").Value
        ' Check value
        If k1end > k1max Then
            k1end = k1max
            Cells(1, "BQ").Value = k1max
        End If
        If k1start < 0 Then
            k1start = 0
            Cells(1, "BO").Value = 0
        End If
        If k2end > k2max Then
            k2end = k2max
            Cells(2, "BQ").Value = k2max
        End If
        If k2start < 0 Then
            k2start = 0
            Cells(2, "BO").Value = 0
        End If
        If k3end > k3max Then
            k3end = k3max
            Cells(3, "BQ").Value = k3max
        End If
        If k3start < 0 Then
            k3start = 0
            Cells(3, "BO").Value = 0
        End If
        SrartRaw = Cells(1, "BF").Value
        xaxis = Cells(3, "BG").Value
        UnitNumber = (Max4 - Min4) / Step4 + 1
        UnitNumber1 = (Max1 - Min1) / Step1 + 1
        UnitNumber1 = UnitNumber * UnitNumber1
        UnitNumber2 = (Max2 - Min2) / Step2 + 1
        Left = Cells(1, "BK").Value
        Top = Cells(2, "BK").Value
        Width = 360
        Height = 216
        k = Cells(2, "BF").Value
        OuterChartContentC = Cells(3, "BB").Value
        OuterChartContent = Cells(1, "BB").Value
        MiddleChartContentC = Cells(3, "AY").Value
        MiddleChartContent = Cells(1, "AY").Value
        InnerChartContentC = Cells(3, "AV").Value
        InnerChartContent = Cells(1, "AV").Value
        ChartNo = Cells(2, "AU").Value
        Series1 = Cells(2, "I").Value
        Series2 = Cells(2, "AP").Value
        Series3 = Cells(2, "AQ").Value
       
        ' Delete chart
        If ChartNo = 1 Then
            ActiveSheet.ChartObjects.Delete
            Cells(2, "BF").Value = 0
            k = 0
        End If
       
        ' Outer loop
        For k3 = k3start To k3end Step 1
            ' Middle loop
            For k2 = k2start To k2end Step 1
                ' Inner loop
                ChartNo = Cells(2, "AU").Value
                For k1 = k1start To k1end Step 1
                    ' Add Chart
                    'ActiveSheet.Shapes.AddChart.Select
                    ' Position and size
                    MiddleChart = Cells(SrartRaw + k * UnitNumber, MiddleChartContentC)
                    InnerChart = Cells(SrartRaw + k * UnitNumber, InnerChartContentC)
                    OuterChart = Cells(SrartRaw + k * UnitNumber, OuterChartContentC)
                    ChartContent = OuterChartContent & "=" & OuterChart & " " & MiddleChartContent & "=" & MiddleChart & " " & InnerChartContent & "=" & InnerChart
                    Left1 = Left + (k1 + 1) * (Width + 20)
                    Top1 = Top + (k3 * UnitNumber2 + k2) * (Height + 10)
                    'Left1 = Left + k3 * (Width + 20)
                    'Top1 = Top + k1 * (Height + 10)
                    Set myChart = ActiveSheet.ChartObjects.Add(Left1, Top1, Width, Height)
                    Set ch = myChart.Chart
                    With ch
                        .ChartType = xlXYScatterSmooth
                        ' Add Series 1
                        .SeriesCollection.NewSeries
                        .SeriesCollection(1).Name = Series1
                        .SeriesCollection(1).XValues = Range(Cells(SrartRaw + k * UnitNumber, xaxis), Cells(SrartRaw + k * UnitNumber + (UnitNumber - 1), xaxis))
                        .SeriesCollection(1).Values = Range(Cells(SrartRaw + k * UnitNumber, "J"), Cells(SrartRaw + k * UnitNumber + (UnitNumber - 1), "J"))
                        ' Add Series 2
                        .SeriesCollection.NewSeries
                        .SeriesCollection(2).Name = Series2
                        .SeriesCollection(2).XValues = Range(Cells(SrartRaw + k * UnitNumber, xaxis), Cells(SrartRaw + k * UnitNumber + (UnitNumber - 1), xaxis))
                        .SeriesCollection(2).Values = Range(Cells(SrartRaw + k * UnitNumber, "AP"), Cells(SrartRaw + k * UnitNumber + (UnitNumber - 1), "AP"))
                        ' Add Series 3
                        .SeriesCollection.NewSeries
                        .SeriesCollection(3).Name = Series3
                        .SeriesCollection(3).XValues = Range(Cells(SrartRaw + k * UnitNumber, xaxis), Cells(SrartRaw + k * UnitNumber + (UnitNumber - 1), xaxis))
                        .SeriesCollection(3).Values = Range(Cells(SrartRaw + k * UnitNumber, "AQ"), Cells(SrartRaw + k * UnitNumber + (UnitNumber - 1), "AQ"))
                        .SeriesCollection(3).AxisGroup = 2
                        .SetElement (msoElementLegendBottom)
                        '.PlotArea.Select
                        .SetElement (msoElementPrimaryCategoryGridLinesMajor)
                        '.Axes(xlCategory).Select
                        .Axes(xlCategory).MinimumScale = Min4
                        .Axes(xlCategory).MaximumScale = Max4
                        '.Axes(xlValue).Select
                        .Axes(xlValue).TickLabelPosition = xlLow
                        '.Axes(xlCategory).Select
                        .SetElement (msoElementChartTitleAboveChart)
                        .ChartTitle.Text = ChartContent
                    End With
                    k = k + 1
                    Cells(2, "BF").Value = k
                    Set ch = Nothing
                    Set myChart = Nothing
                    'Application.WindowState = xlMinimized
                    'Application.WindowState = xlMaximized
                Next ' end For Inner loop
            Next ' end For Middle loop
        Next ' end For Outer loop
       
        '代碼運行後,恢復Excel原來的狀態;將下面的代碼放在代碼的末尾
        Application.ScreenUpdating = screenUpdateState
        Application.DisplayStatusBar = statusBarState
        Application.Calculation = calcState
        Application.EnableEvents = eventsState
        ActiveSheet.DisplayPageBreaks = displayPageBreaksState '注:這是工作表級的設置

      此問題困擾很久 一職找不到解答 讓程式能順利地執行

      我可以將檔案寄給您 幫我找錯誤嗎?


    Roy Tsai

    2012年1月25日 下午 02:54
  • 請整理為能重現問題的最小程式碼,並使用常數,以便網友協助測試。

    你若需要提供檔案給網友測試,請使用 skydrive 或 其他網路空間。

    http://skydrive.live.com/


    T.L. Cheng

    2012年2月11日 上午 06:29
    版主
  • 檔案放在 https://skydrive.live.com/#cid=07E50F54D1CB8320&id=7E50F54D1CB8320!117

    TW-SP-Angle - 2.xlsm 是可以執行

    TW-SP-Angle - 3.xlsm事不能正常執行 

    請幫幫debug 謝謝


    Roy Tsai

    2012年2月11日 上午 08:25
  • 請把檔案縮減到能重現問題的必要內容,包含把沒有影響的程式碼、資料都移除。

    在適當的地方加上註解說明,協助網友快速找到你的問題點,包含測試步驟。

    我打開你的檔案,不知道我接下來要幹嘛,裡面有 3 個巨集,不知道你打算從哪裡開始,然後一堆資料與標頭,也不知道該看啥。

    這邊有一些網友像微軟付費問問題 CSS 部門提問的案例,可以看到問題本身都簡單化,也知道拿到檔案後要做哪些步驟:

    http://tlcheng.wordpress.com/category/%e6%9b%b4%e6%96%b0%e8%88%87%e5%9b%9e%e5%a0%b1/


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年2月12日 上午 09:58