2016-08-11 102 views
2

我有一個自定義函數用於計算或求和我有多少個彩色單元格。這是函數:快速定製Excel VBA功能

Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean) 

    Application.Volatile (True) 

    Dim rCell As Range 
    Dim lCol As Long 
    Dim vResult 

    lCol = rColor.Interior.ColorIndex 

    If SUM = True Then 
     For Each rCell In rRange 
      If rCell.Interior.ColorIndex = lCol Then 
       vResult = WorksheetFunction.SUM(rCell, vResult) 
      End If 
     Next rCell 
    Else 
     For Each rCell In rRange 
      If rCell.Interior.ColorIndex = lCol Then 
       vResult = 1 + vResult 
      End If 
     Next rCell 
    End If 

ColorFunction = vResult 

End Function 

它是通過輸入下面的函數調用:

=colorfunction($A$1,A2:C2,FALSE) 

=colorfunction($A$1,A2:C2,TRUE) 

其中:

  • A1 =與背景色的細胞進行檢查
  • A2:C2 =範圍要被計數
  • FALSE/TRUE =計數或薩姆

我的問題是:有什麼我可以做到VBA加快這個功能?

我試圖用WorksheetFunction部分進行實驗,但無法找到有效的語法。任何其他想法?

+2

似乎Q可以更好地適合於[代碼審查(http://codereview.stackexchange.com/help/on-topic )。 – pnuts

+0

因爲你的函數不穩定,刪除'Application.Volatile'。使所有參數'ByVal'。用'vResult + rCell.Value'替換'WorksheetFunction.SUM(rCell,vResult)',除非您使用'SUM'靜默地忽略非數字值。 – GSerg

+0

@Gserg感謝您的提示。如果我刪除了'Application.Volatile',那麼除非強制它,否則該函數不會計算。你的'WorksheetFunction ...'似乎已經產生了一些影響。你能解釋你的'ByVal'評論嗎?謝謝 – redditor

回答

0

試試:

Function ColorFunction2(rColor As Range, rRange As Range, _ 
         Optional pSUM As Boolean) As Variant 
Dim rCell As Range 
Dim lCol As Long 
Dim vResult As Variant, vTmp As Variant ' for intermediate calcs, _ 
              for clear vision of logic, _ 
              for not doubling code 
    Application.Volatile (True) 

    lCol = rColor.Interior.ColorIndex 

    For Each rCell In rRange.Cells ' expicit .Cells 
     If rCell.Interior.ColorIndex = lCol Then 
      Select Case pSUM ' SUM is reserved word 
       Case True: vTmp = rCell.Value ' out of sheet functions calling 
       Case False: vTmp = 1 
     ' change True-False sequence according to real probability they occures 
      End Select 
     End If 
     vResult = vResult + vTmp 
    Next ' rCell ' No need 

    ColorFunction2 = vResult 
End Function 

新增expicit 「爲Variant」

+2

SUM不是保留字。顯式'As Variant'是編碼風格的問題,對性能沒有影響。在循環內移動「select case」會使條件每次都會評估,而不是提前一次。總而言之,這使得代碼可以打印而不是更好地執行。 – GSerg

+0

> _SUM不是保留字_ 是的:)但是,讓我們假設它。它經常使用。 > _移動選擇案例... _ 是的。我懂了。這是我的疏忽。我很忙於自己的事業,我只是半睜着眼睛看,而W-Sheet SUM只看着我的眼睛。我會檢查這個減速度。 – user6698332