Board logo

標題: [發問] 程式碼運行一段時間之後會出現"記憶體不足",有哪邊可以釋放記憶體嗎? [打印本頁]

作者: PKKO    時間: 2015-8-23 16:18     標題: 程式碼運行一段時間之後會出現"記憶體不足",有哪邊可以釋放記憶體嗎?

跑了一段時間之後就會出現記憶體不足,想問一下,有哪邊還可以加入釋放記憶體的程式碼?

還是有哪一段程式碼寫的不好,佔用了太多記憶體嗎?
  1. Sub 按鈕形2_Click() '7*6
  2.     Application.ScreenUpdating = False '螢幕
  3.     rrr = Range("BG7")
  4.     If rrr = "" Then MsgBox "尚未輸入起始列數!": Exit Sub
  5.     '取出連續透支數
  6.     losetime = Sheets("7x6").[c7]
  7.     If losetime < 0 Then MsgBox "透支不可為負數!": Call after: Exit Sub
  8.     t1 = Hour(Now()) * 3600 + Minute(Now()) * 60 + Second(Now())
  9.     Dim ar, TestArray() As String, br(), x&, y&, z&, n&, rng2, win_num, aa()
  10.     win_num = 0 '最後成功紀錄的組數
  11.     '清除BA欄資料
  12.     Sheets("7x6").Columns("Bt:Bt").ClearContents
  13.     Sheets("data").Columns("af:bu").ClearContents
  14.     '檢查data分頁有幾筆資料
  15.     num1 = WorksheetFunction.CountA(Sheets("data").Range("K:K")) / 7
  16.     If num1 < 2 Then MsgBox "資料不足夠!": Exit Sub
  17.     '建立data分頁的陣列
  18.     Rng = Sheets("data").[w1].Resize(num1 * 8, 1)
  19.     '取出盈虧陣列
  20.     earn = Sheets("7x6").Range("bg" & rrr).Resize(ED("bg", , "7x6") - rrr + 1, 1).Value
  21.    
  22.    
  23.     '將基本排序輸入陣列
  24.     ReDim ar(1 To num1, 1 To 1)
  25.     For i = 1 To num1
  26.         ar(i, 1) = Rng((i - 1) * 8 + 1, 1)
  27.     Next
  28.     Dim D As Object
  29.     Set D = CreateObject("SCRIPTING.DICTIONARY")  '字典物件
  30.     '跑出排列組合---------------------------------------------------
  31.     For y = x + 1 To UBound(ar) - 1
  32.         For z = y + 1 To UBound(ar)
  33.             '檢查六個元素內容是否有重複
  34.             reallyname = ar(y, 1) & "_" & ar(z, 1)
  35.             temp = Split(reallyname, "_")
  36.             For i = 0 To 5
  37.                 If Not D.Exists(CStr(temp(i))) Then
  38.                     D.Add CStr(temp(i)), i
  39.                 Else
  40.                     D.RemoveAll: GoTo fn2
  41.                 End If
  42.             Next
  43.             D.RemoveAll
  44.             n = n + 1
  45.             ReDim Preserve br(1 To 2, 1 To n)
  46.             br(1, n) = ar(y, 1)
  47.             br(2, n) = ar(z, 1)
  48. fn2:     Next
  49.     Next
  50.     Set D = Nothing
  51.     Set ar = Nothing
  52.     If n = 0 Then MsgBox "經過移除重複的組合之後,沒有任何一組可以合成7*7*6": Exit Sub
  53.     br = Application.Transpose(br)
  54.     ReDim rng2(1 To 7, 1 To 42)
  55.     '將組合後的內容輸入至陣列內---------------------------------------------------
  56.     '跑每一筆未來的排列組合
  57.     Rng = Sheets("data").[w1].Resize(num1 * 8, 1)
  58.     For i = 1 To UBound(br)
  59.         '跑2個組合
  60.         For j = 1 To 2
  61.             '跑每一筆原本的組合
  62.             For K = 1 To UBound(Rng) Step 8
  63.                 '判斷原本組合的代碼,是否符合排列組合之後的代碼
  64.                 If CStr(Rng(K, 1)) = CStr(br(i, j)) Then
  65.                     '建立原本的陣列
  66.                     org_rng = Sheets("data").Range("J" & K + 1).Resize(7, 21)
  67.                     '找到代碼之後,將原本的陣列內容輸入至新的排列組合陣列內
  68.                     For L = 1 To 7
  69.                         For M = 1 To 21
  70.                             'L是1~7的列數,M是欄數,K是該編號的列數位置
  71.                             rng2(L, M + (j - 1) * 21) = CStr(org_rng(L, M))
  72.                         Next
  73.                     Next
  74.                     Exit For
  75.                 End If
  76.             Next
  77.         Next
  78.         '每跑完一個完整的7*21組合,就把資料放到7*3分頁裡面進行比對-----------------------------
  79.         '放置資料
  80.         Sheets("7x6").[I9].Resize(7, 42).Value = rng2
  81.         '跑每一筆盈虧
  82.         x = 0 '用來計算連續幾筆透支
  83.         For j = 1 To UBound(earn)
  84.             If earn(j, 1) = "" Then GoTo fn
  85.             If earn(j, 1) >= 0 Then: x = 0: GoTo fn
  86.             x = x + 1
  87.             If x = losetime Then GoTo f1 '到達透支標準=>不予紀錄,執行下一個組合
  88. fn:     Next
  89.         '可以執行到這邊,代表透支數量沒有超過,需要紀錄編號組合到[ba]位置
  90.         win_num = win_num + 1 '成功的次數
  91.         Sheets("7x6").Range("Bt" & win_num).Value = win_num & "--" & br(i, 1) & "_" & br(i, 2)
  92.         Sheets("data").Range("as" & (win_num - 1) * 8 + 1).Value = br(i, 1) & "_" & br(i, 2)
  93.         Sheets("data").Range("af" & (win_num - 1) * 8 + 1).Value = win_num
  94.         Sheets("data").Range("af" & (win_num - 1) * 8 + 2).Resize(7, 42).Value = rng2
  95. f1: Next
  96.     T2 = Hour(Now()) * 3600 + Minute(Now()) * 60 + Second(Now())
  97.     MsgBox win_num & "/" & UBound(br) & "(組)共耗時 " & T2 - t1 & " 秒"
  98. End Sub
複製代碼

作者: jackyq    時間: 2015-8-23 16:52

num1 = WorksheetFunction.CountA(Sheets("data").Range("K:K")) / 7

num1 最大值可以到多少?
作者: lcctno    時間: 2015-8-23 20:09

我是初學者 我有遇到您說的問題  我是使用縮小取樣次數之總比數後先轉成值 然後多做幾次同樣的動作 老實說我不太會表達意思 請您參考
http://forum.twbts.com/thread-14907-1-1.html
這帖 您應該會比較容易知道我說的意思 若造成您的不悅 還請見諒
作者: PKKO    時間: 2015-8-24 20:56

回復 2# jackyq


    最大300以內




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