返回列表 上一主題 發帖

棘手的excel運算問題,如何改善??

棘手的excel運算問題,如何改善??

本帖最後由 藍天麗池 於 2016-1-26 14:18 編輯

明細變動記錄.rar (148.6 KB)

附檔是一個小弟平常用在紀錄的excel目前有些棘手的運算問題還麻煩版上大大幫我一下

如圖所示,左邊是我平時在紀錄的儲存格,右邊是計算用的儲存格,但是因為右邊計算的儲存格裡面我有寫一些函數,造成整個excel在跑的時候左邊無法紀錄或是整個當掉(因為所寫函數太吃CPU和記憶體),請問一下版上大大小的這個問題應該怎麼解決才好??

我有想出一些解決方式,無奈對VBA不是太熟,在煩請版上高手幫幫忙

解決方式
1.讓左邊A-F列即時運算(A2-F2是DDE所以需要隨時更新才能接收資料),R-T列每分鐘運算一次,更新完後寫成值而不是公式,這樣的方式可以嗎??(不知道同一個sheet可不可以不同頻率即時運算)

2.變更R-T列的函數寫法,讓整個程式跑起來不要那麼吃資源

3.將S-T列的函數寫在VBA裡面,每分鐘執行一次執行完後將公式寫成值

煩請版上的高手大大幫幫小弟

回復 40# c_c_lai

http://forum.twbts.com/viewthread.php?tid=16452&extra=
C大新年快樂,有空可以麻煩幫我看看嗎??

TOP

回復 43# 藍天麗池


    封關一樣可試

TOP

回復 42# GBKEE


    G大今天台股封關了,要試也要等過年後了,謝謝妳

TOP

本帖最後由 GBKEE 於 2016-2-3 10:34 編輯

回復 38# 藍天麗池

附檔試試看看另一作法

EX.rar (28.72 KB)
   



ThisWorkbook模組
  1. Option Explicit
  2. Private Sub Workbook_BeforeClose(Cancel As Boolean) '
  3.     '檔案關閉:關閉檔案連結
  4.     '**檔案在開啟時,不啟動詢問更新資料的視窗
  5.    
  6.     ActiveWorkbook.UpdateLinks = xlUpdateLinksNever
  7.     'UpdateLinks 屬性 傳回或設定 XlUpdateLink 常數,此常數可指出活頁簿更新內嵌 OLE 連線的設定。讀/寫。
  8.    
  9.     'XlUpdateLinks 可以是這些 XlUpdateLinks 常數之一。
  10.     'xlUpdateLinksAlways 永遠更新指定活頁簿的內嵌 OLE 連線。
  11.     'xlUpdateLinksNever 永遠不更新指定活頁簿的內嵌 OLE 連線。
  12.     'xlUpdateLinksUserSetting  根據使用者對指定活頁簿的設定來更新內嵌的 OLE 連線。
  13. End Sub

  14. Private Sub Workbook_Open()
  15.     Application.Calculation = xlAutomatic  ' 活頁簿設為自動重算
  16.     '檔案在開啟時:自動更新連結
  17.     With ActiveWorkbook
  18.         .UpdateRemoteReferences = True
  19.         .SaveLinkValues = True
  20.     End With
  21. End Sub
複製代碼
Sheet1(Sheets("RTD")) 模組的程式碼
  1. Option Explicit
  2. Dim D As Object, xTime As Date, Volume As Double
  3. Private Sub Worksheet_Calculate()
  4.     If IsError([E2]) Or Time < #8:45:00 AM# Then Application.StatusBar = "等候開盤中": Exit Sub
  5.    
  6.     '[E2] = "--" 開盤前的符號
  7.    If Volume <> [E2] And [E2] <> "--" And Time >= #8:45:00 AM# And Time < #1:46:00 PM# Then
  8.         If D Is Nothing Then
  9.             Application.OnTime #1:46:00 PM#, "SHEET1.紀錄"  '收盤後強制寫出最後一分鐘的資料
  10.             Application.StatusBar = False
  11.             Set D = CreateObject("scripting.dictionary")
  12.             Range("A" & Rows.Count).End(xlUp).CurrentRegion.Offset(1) = ""
  13.             Sheets("紀錄").UsedRange.Clear
  14.             xTime = TimeSerial(Hour(Time), Minute(Time), 0)
  15.         End If
  16.         If TimeSerial(Hour([B2]), Minute([B2]), 0) <> xTime And D.Count > 0 Then 紀錄 '下一分鐘開始時,紀錄上一分鐘的紀錄
  17.         D([C2].Value) = D([C2].Value) + IIf([D2] <= 10, -1, 1)    '字典物件:紀錄成交單量公式的值
  18.         Volume = [E2]
  19.         xTime = TimeSerial(Hour([B2]), Minute([B2]), 0)
  20.         '**************** 記錄每次成交紀錄***************
  21.          With Range("A" & Rows.Count).End(xlUp).Offset(1)
  22.             .Cells(1) = [B2]                        '時間
  23.             .Cells(1, 2) = [C2]                     '成交價
  24.             .Cells(1, 3) = [D2]                     '成交單數
  25.             .Cells(1, 4) = IIf([D2] <= 10, -1, 1)   '成交單量公式的值
  26.         End With
  27.         '************************************************
  28.     End If
  29. End Sub
  30. Private Sub 紀錄()
  31.     Dim R As Integer, C As Integer, X As Integer
  32.     Application.EnableEvents = False
  33.     With Sheets("紀錄")
  34.         If .[A1] = "" Then .[A1] = "時間"
  35.         With .Range("A" & .Rows.Count).End(xlUp).Offset(1)
  36.             R = .Row
  37.             .NumberFormat = "HH:MM"
  38.             .Value = xTime
  39.             .Resize(2).Merge
  40.         End With
  41.         C = 2
  42.         '迴圈:字典物件的KEY(關鍵字) 最大值 - 最小值.
  43.         For X = Application.Max(D.KEYS) To Application.Min(D.KEYS) Step -1
  44.             If D.EXISTS(X) Then   '字典物件有這個KEY(關鍵字)
  45.                 If .Cells(1, C) = "" Then .Cells(1, C) = C - 1
  46.                 .Cells(R, C) = X
  47.                 .Cells(R, C).Interior.ColorIndex = 40
  48.             
  49.                 .Cells(R + 1, C) = D(X)
  50.                 C = C + 1
  51.             End If
  52.         Next
  53.     End With
  54.     D.RemoveAll   '重設,字典物件(紀錄成交價的公式的值)
  55.    
  56.    '這行的程式碼可刪除上一分鐘的資料,加速程式的運行
  57.     Range("A" & Rows.Count).End(xlUp).CurrentRegion.Offset(1) = ""    '如要保留可註解掉不必執行
  58.     Application.EnableEvents = True
  59. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 40# c_c_lai


    可以記錄,但不可統計,C大謝謝,我想我還是改用API+EXCEL的方式進行好了,不用再費心了,真的非常的謝謝妳

TOP

回復 38# 藍天麗池
  1. Sub 統計()        '  L、M、N、O 欄位統計
  2.     Dim DD As Date
  3.    
  4.     dicStatics
  5.     DD = Format(Now, "yyyy/mm/dd hh:mm")    '  DD = 2016/1/28 上午 12:41:00 : Date
  6.     TimeTxt = DD + 1 / 1440                 '  TimeTxt = 2016/1/28 上午 12:42:00 : Variant/Date
  7.     Application.OnTime TimeTxt, "統計"      '  每一分鐘自動再次執行一次。
  8. End Sub

  9. Sub dicStatics()
  10.     Dim txt As String, dic As Object, dic2 As Object, A As Range, sp As Variant

  11.     ' txt = [B2] & Left(CStr(Format([A2], "HH:MM:SS")), 5)
  12.     ' txt = [B2] & Left(CStr([A2]), 5)
  13.     '  MsgBox txt

  14.     Set dic = CreateObject("Scripting.Dictionary")
  15.     Set dic2 = CreateObject("Scripting.Dictionary")

  16.     For Each A In Range([A3], [A3].End(xlDown))
  17.         txt = A.Offset(, 1) & "," & Left(Format(A, "HH:MM:SS"), 5)
  18.         '  dic(txt) = IIf(IsEmpty(dic(txt)), A.Offset(, 4).Value + 1, dic(txt)) + A.Offset(, 4).Value
  19.         '  在 IsEmpty(dic(txt)) 判斷時, dic(txt) 會自動先賦予一次之 A.Offset(, 4).Value 值,然後再次
  20.         '  Assign 一次的 A.Offset(, 4).Value 值, 如 A.Offset(, 4).Value = -1,則結果會變成 -2。
  21.         '  是故改成如下方式,直接賦予一次之 A.Offset(, 4).Value 值,則結果便會變成 -1 (初始值設定)。
  22.         dic(txt) = dic(txt) + A.Offset(, 4).Value       '  次
  23.         dic2(txt) = dic2(txt) + A.Offset(, 2).Value     '  量
  24.     Next
  25.    
  26.     [M3].Resize(UBound(dic.Keys) + 1) = Application.Transpose(dic.Keys)                '  索引值就是 Keys
  27.     [N3].Resize(UBound(dic.Keys) + 1) = Application.Transpose(dic.Items)               '  資料內容就是 Items
  28.     [O3].Resize(UBound(dic2.Keys) + 1) = Application.Transpose(dic2.Items)               '  資料內容就是 Items
  29.    
  30.     With [M3].Resize(UBound(dic.Keys) + 1, 3)        '  Range("M3:M" & [M3].End(xlDown).Row)
  31.         .Cells.Sort Key1:=.Cells(1), Order1:=xlDescending, Header:=xlNo    '  xlAscending
  32.     End With
  33.    
  34.     For Each A In Range([M3], [M3].End(xlDown))
  35.         sp = Split(A, ",")
  36.         A.Offset(, -1) = sp(0)
  37.         A = sp(1)
  38.     Next
  39. End Sub
複製代碼

TOP

回復 38# 藍天麗池
那你用我目前上傳的檔案來做測試看看。
測試完後告訴我一聲結果。
我先把准提部林版大分享的功能改為 統計A(),
先不予執行,而去執行我增加之測試模組
統計() ->dicStatics 你觀察看看進行順暢否?
明細變動記錄.rar (192.18 KB)

TOP

回復 37# c_c_lai


    測試C大的檔案後,發現可能執行太多東西,DDE都不太會跳動了,之前1秒跳7-8次,現在2-3秒跳動一次

TOP

回復 36# 藍天麗池
最近有點事耽擱了。
你在 #10 裡的說明,要的是?

TOP

        靜思自在 : 修行要繫緣修心,藉事練心,隨處養心。
返回列表 上一主題