返回列表 上一主題 發帖

[發問] 如何提高多條件加總效率 SUMIFS vs SUMPRODUCT vs VBA

回復 1# sunnyso

有意思的比較,我測試結果和你的不同

1.662109375        SUMIF
9.76953125        AutoFilter
4.728515625        VBA CODE
10.07226563        SUMPRODUCT
0.654296875        超版Hsieh
0.3359375        c_c_lai

SUMPRODUCT最慢。公式裡COUNTIF及SUMPRODUCT都是慢郎中函數

.xlsb 開啟時並沒有通知巨集安全的通知,開啟後也可以執行巨集,這是.xlsb 的特性嗎?
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 9# sunnyso

這是辦公室電腦 CPU: i5-760 2.8GHz / RAM 4G / WIN7-32 / EXCEL 2007
測試資料52993筆,就是你的檔案我再將超版Hsieh及c_c_lai  VBAC CODE複製進來及執行
1.223         SUMIF
8.074         AutoFilter
4.148         VBA CODE
6.652         SUMPRODUCT
0.574         超版Hsieh
0.418         c_c_lai

c_c_lai 的時間好像差異很大

XLSB開啟有VBA安全性確認(上次在家裡測試沒有出現,)


這是我執行的檔案
兩個條件的加總 - Sonny.rar (505.49 KB)
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 13# sunnyso


    不只快很多,0.312秒,是最快的
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 13# sunnyso
  1. j = -1
  2. Do
  3. j = j + 1
  4. Loop Until Month(DataArea(m, 2)) = (j + 1)
  5. 改為下式
  6. j = Month(DataArea(m, 2)) - 1
  7. 會更快
複製代碼
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 16# sunnyso

A CODE 修改為 B CODE,執行時間由 0.257秒變慢為1.304秒,變得很慢
在VBA內用活頁簿函數會增加很多時間
不知VBA內有無其他可取代MATCH函數

' *** A CODE ***
i = -1
Do
i = i + 1
Loop Until DataArea(m, 1) = AllType(i)

' *** B CODE ***
i = Application.Match(DataArea(m, 1), AllType, 0) - 1
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 22# sunnyso

以前都是直接利用儲存格運算存取,經過這次比較才了解不同的方式差異那麼大,真得滿有收穫的。
所以要做查詢運算還是要全部先讀至變數陣列,全部計算好了再將變數陣列一次性指向給儲存格。

執行時間差很多,執行test2後會死當6分鐘,剛好可以喝一杯咖啡。
test1 1.4秒
test2 299.3秒
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 22# sunnyso

如何在Sheet3執行巨集test1,資料寫至Sheet1
我加了紅色字結果執行錯誤,幫忙看看錯在哪裡,
在Sheet1執行巨集test1就正確

    Sub test1()
    Dim i%, j%
    Dim Ar(1000, 1000) As Double
    For i = 0 To 1000
        For j = 0 To 1000
            Ar(i, j) = i * 4 + j
        Next j
    Next i
    Sheets("Sheet1").Range(Cells(1, 1), Cells(1001, 1001)) = Ar
End Sub

VBA 變數陣列與儲存格計算批次讀寫比較.rar (9.47 KB)
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 27# sunnyso

各式的執行時間並無太大差異
Range(Cells(1,1),Cells(1001,1001)) 應該是等於 Range("A1:ALL1000"),可是不能執行無法理解,只好記下來。



下式執行錯誤
Sheets("Sheet1").Range(Cells(1,1),Cells(1001,1001))=Ar

下式執行OK-1.5秒
WithSheets("Sheet1")
.Range(.Cells(1,1),.Cells(1000,1000))=Ar
EndWith

下式執行OK-1.5秒
Sheets("Sheet1").Range("A1").Resize(1000,1000)=Ar

下式執行OK-1.5秒
Sheet1.[A1].Resize(1000,1000)=Ar

下式執行OK-1.5秒
Sheet1.[A1:ALL1000]=Ar

下式執行OK-1.5秒
Sheet1.Range("A1:ALL1000")=Ar
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 28# sunnyso

Scripting.Dictionary 沒有直接用迴圈比較來的快
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 30# sunnyso

感謝!受教
你的解釋我懂了
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

        靜思自在 : 為自己找藉口的人永遠不會進步。
返回列表 上一主題