2016-04-28 50 views
1

所以我一直在試圖創建一個函數來將VBA中的分貝加在一起。我試過使用ParamArray,但我在處理信息時遇到了麻煩。理想情況下,它可以像SUM()一樣工作,只需要把所有的投入都投入公式和繁榮。參數輸入的參數陣列問題

現在,我有:

Function DBADD3(ParamArray nums()) As Double 
Dim DBPrTot As Variant 
'this will be input into the log function at the end 

DBPrTot = 0 
'initializing value for use in for loop 
For i = LBound(nums) To UBound(nums) 
    DBPrTot = DBPrTot + 10^(nums(i)/10) 
    'all of the values gathered from ParamArray are being input into this running total 

Next i 

DBADD3 = 10 * WorksheetFunction.Log10(DBPrTot) 
'throwing the DBPrTot running value into our end equation 

End Function 

我想它採取像DBADD3(A1:A3,A5,A7)的輸入,仍然生產的東西。有人可以幫忙嗎?

回答

4

因此,您需要了解正在傳入的信息的類型。在之前的其他帖子的示例中,數字被直接傳入,因此可以輕鬆訪問它們的值。在這種情況下,您傳入一組範圍(範圍和單個單元格組)。所以你必須循環遍歷每個數組以拉取範圍組,然後循環遍歷範圍以獲取單個值。

請參閱以下基本SUM風格函數的例子:

Function ReturnValues(ParamArray args()) As Double 
    Dim dRunningTotal As Double 

    dRunningTotal = 0 

    For i = LBound(args) To UBound(args) 
     For Each cel In args(i) 
      dRunningTotal = dRunningTotal + cel.Value 
     Next cel 
    Next i 

    ReturnValues = dRunningTotal 
End Function 

編輯補充: 可以測試參數的類型,這樣就可以防止引發錯誤,並且還要處理情況下,您可能有兩個範圍和值的參數,即=ReturnValues(A1:A10, 7, 9, B1:B4)

Function ReturnValues(ParamArray args()) As Double 
    Dim dRunningTotal As Double 

    dRunningTotal = 0 

    For i = LBound(args) To UBound(args) 
     If TypeName(args(i)) = "Range" Then 
      For Each cel In args(i) 
       dRunningTotal = dRunningTotal + cel.Value 
      Next cel 
     Else 
      dRunningTotal = dRunningTotal + args(i) 
     End If 
    Next i 

    ReturnValues = dRunningTotal 
End Function 
+0

請使用'對於每個VARG在args'循環,而不是用一個簡單的計時器'For'循環,聲明變量'cel' ,使用'TypeOf args(i)是Range'替代'TypeName'並在添加到'dRunningTotal'之前測試'IsNumeric(cel.Value)'。否則,這是一個很好的答案,+1。 – Leviathan

+0

嘿@ user3561813我有另一個附錄。這個效果很好,但是當值爲0時,它會變得很奇怪。我想跳過包含0的所有迭代,使用if語句或其他東西。你怎麼看?我認爲沿着 的行如果args(i)= 0那麼 dRunningTotal = dRunningTotal –

+0

@ T.Heng將自己的業務邏輯添加到代碼沒有任何問題。它可能看起來像這樣:'如果cel.Value <> 0那麼''dRunningTotal = dRunningTotal + cel.Value' – user3561813