返回列表 上一主題 發帖

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

本帖最後由 c_c_lai 於 2016-1-26 20:00 編輯

回復 1# 藍天麗池
在 shtRTD (RTD) 表單內 RecordPrice()
加入 STSumifs WR, WR, 如下:
  1. Option Explicit

  2. Sub RecordPrice()
  3.     Dim WR As Long
  4.     Dim I As Byte

  5.     If Range("P2") < 1 Then Exit Sub

  6.     WR = Range("A1").End(xlDown).Row + 1
  7.     '  ActiveWindow.ScrollRow = WR - 5     '  只顯示最新幾筆資料
  8.     If (WR = 3) Or _
  9.             (Range("F" & WR - 1) <> Range("F2")) Then   '  總量有異動時才記錄
  10.         For I = 1 To 6
  11.             Cells(WR, I) = Cells(2, I)
  12.         Next 'I
  13.         
  14.         STSumifs WR, WR                         '  資料同步將數值寫入到 R,S,T 三欄內
  15.     End If
  16.     '  With ActiveWindow
  17.         '  If Intersect(Cells(WR, "B"), .VisibleRange) Is Nothing Then .SmallScroll 5
  18.     '  End With
  19. End Sub

  20. Private Function STSumifs(ByVal endST As Long, Optional startST As Long = 3)
  21.     Dim cts As Long
  22.     Dim btm As Long
  23.    
  24.     btm = Range("A1").End(xlDown).Row
  25.    
  26.     For cts = startST To endST
  27.         Cells(cts, "R") = IIf(cts = 2, "", IIf(cts = 3, "=MAX(B3:B" & btm & ")", "=R" & (cts - 1) & "-1"))
  28.         Cells(cts, "R") = Cells(cts, "R").Value
  29.         Cells(cts, "S") = "=IF(SUMIFS($E3:$E" & btm & ",$D3:$D" & btm & ",S$1,$B3:$B" & btm & ",$R" & (cts - 1) & ")=0," & Chr(34) & Chr(34) & ",SUMIFS($E3:$E" & btm & ",$D3:$D" & btm & ",S$1,$B3:$B" & btm & ",$R" & (cts - 1) & "))"
  30.         Cells(cts, "S") = Cells(cts, "S").Value
  31.         Cells(cts, "T") = "=IF(SUMIFS($E3:$E" & btm & ",$D3:$D" & btm & ",T$1,$B3:$B" & btm & ",$R" & (cts - 1) & ")=0," & Chr(34) & Chr(34) & ",SUMIFS($E3:$E" & btm & ",$D3:$D" & btm & ",T$1,$B3:$B" & btm & ",$R" & (cts - 1) & "))"
  32.         Cells(cts, "T") = Cells(cts, "T").Value
  33.     Next cts
  34. End Function

  35. Sub Test()
  36.     Dim WR As Long
  37.    
  38.     WR = Range("A1").End(xlDown).Row
  39.     STSumifs WR
  40. End Sub
複製代碼
最後面之 Test() 是可讓你一次自動執行更換 第 3 行 ~ 第 4903 行
R,S,T 三欄的資料值。如果不異動的話,就不需執行它。
其它程式部分均保留原貌。因我無券商連線無法測知狀況。

TOP

TOP

回復 6# 藍天麗池
說真的,我不太懂 SUMIFS 的用意,只是依樣畫葫。
如你有時間的話,稍稍說明一下它的使用方式與你的想法,
如此會更明瞭其作用,謝謝。

TOP

本帖最後由 c_c_lai 於 2016-1-27 15:31 編輯

回復 12# 藍天麗池
這是你原本的定義:
  1. S3
  2. =IF(SUMIFS($E:$E,$D:$D,S$1,$B:$B,$R2)=0,"",SUMIFS($E:$E,$D:$D,S$1,$B:$B,$R2))
  3. T3
  4. =IF(SUMIFS($E:$E,$D:$D,T$1,$B:$B,$R2)=0,"",SUMIFS($E:$E,$D:$D,T$1,$B:$B,$R2))
複製代碼
這是程式碼解析的結果:
  1. S3
  2. =IF(SUMIFS($E3:$E4903,$D3:$D4903,S$1,$B3:$B4903,$R2)=0,"",SUMIFS($E3:$E4903,$D3:$4903,S$1,$B3:$B4903,$R2))
  3. T3
  4. =IF(SUMIFS($E3:$E4903,$D3:$D4903,T$1,$B3:$B4903,$R2)=0,"",SUMIFS($E3:$E4903,$D3:$D4903,T$1,$B3:$B4903,$R2))
複製代碼
然後再轉為數值表示。

TOP

本帖最後由 c_c_lai 於 2016-1-27 16:15 編輯

回復 14# 藍天麗池
Function STSumifs(ByVal endST As Long, Optional startST As Long = 3)
1.  Optional startST As Long = 3 的用意,事先賦予預設值;
    例如:
    Sub Test()
        Dim WR As Long
   
        WR = Range("A1").End(xlDown).Row   '  最後一筆資料列
        STSumifs WR
    End Sub
    在 STSumifs 的函式中:
        For cts = startST To endST
    startST 等於 3, endST  等於 WR (4903)
    此時 STSumifs WR = STSumifs WR, 3 之意,
    Optional  的變數宣告,如未帶入值,則以其
   設定的預設值 (3) 為參數值。
    ***  這是一次就處理 3 ~ 4903 完畢。
     
2.  假設帶入值為:
    WR = Range("A1").End(xlDown).Row + 1 '  最後一筆資料列 + 1
    STSumifs WR, WR
    startST 等於 WR, endST  等於 WR (4094)
    ***  這是將資料寫入到資料錄的最後列。

TOP

本帖最後由 c_c_lai 於 2016-1-28 10:48 編輯

回復 20# 藍天麗池
你說的 "昨天7樓的附件經測試後無法記錄價格",
7樓 那來的附件?
你指的是?
  1. Sub RecordPrice()
  2.     Dim WR As Long
  3.    Dim I As Byte

  4.    If Range("P2") < 1 Then Exit Sub
  5.     WR = Range("A1").End(xlDown).Row + 1
  6.    '  ActiveWindow.ScrollRow = WR - 5     '  只顯示最新幾筆資料
  7.     If (WR = 3) Or _
  8.            (Range("F" & WR - 1) <> Range("F2")) Then   '  總量有異動時才記錄

  9. .        For I = 1 To 6
  10.             Cells(WR, I) = Cells(2, I)
  11.        Next 'I
  12.         STSumifs WR, WR                         '  資料同步將數值寫入到 R,S,T 三欄內
  13.   End If
  14.    '  With ActiveWindow
  15.         '  If Intersect(Cells(WR, "B"), .VisibleRange) Is Nothing Then .SmallScroll 5
  16.     '  End With
  17. End Sub
複製代碼
你的程式碼中有加入這一行嗎?
  1. STSumifs WR, WR                         '  資料同步將數值寫入到 R,S,T 三欄內
複製代碼
你的原始碼是在 Workbook_Calculate() 裡執行的,
請檢查一下。
准提部林版大的分享亦值得你研究參考,你想要的答案
是不是那樣?
我的程式碼 STSumifs() 只是將你本來之公式 (Formula) 以程式模式與資料同步寫入
而已,沒做任何之延伸創意。因為我不懂你公式的作用。看了准提部林版大的分享
才稍稍明瞭你要的結果可能會是如此,還是另有想法?

TOP

回復 22# 藍天麗池

TOP

回復 24# 藍天麗池
你把你目前的Excel檔案壓縮上傳,
眼見為憑!

TOP

回復 26# 藍天麗池
你說 "可以記錄,但卻不是我原本設定的變動才紀錄"
此話怎說?
你開啟檔案後,它會從 DDE 匯入即時數據,接著它便自動判斷
總量有異動時才記錄,這個過程不對嗎?"不是你原本設定的變動才紀錄"
是甚麼情形,因我沒券商的軟體所以無從得知差異在那裏。

TOP

回復 28# 藍天麗池
那你再觀察一下 F2 欄的數據有沒有一直在變動?
如沒,則你必須重新再次啟動券商的軟體。

TOP

        靜思自在 : 有智慧才能分辨善惡邪正;有謙虛才能建立美滿人生。
返回列表 上一主題