2016-04-28 23 views
1

私はVBAでデシベルを一緒に追加する関数を作成しようとしていました。 ParamArrayを使用しようとしましたが、情報の処理に問題があります。理想的には、SUM()として機能し、すべての入力を取り込み、数式とブームに投げ込むだけです。Param Arrayで入力が発生する

は今、私が持っている:と、まだ何かを作り出す:

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(A3、A5、A7 A1)のような入力を取るしたいと思います。助けてもらえますか?

答えて

4

したがって、渡される情報のタイプを認識する必要があります。他の投稿の前の例では、数字が直接渡されていたため、値に簡単にアクセスできました。この場合、範囲の配列(範囲と個々のセルの両方のグループ)を渡しています。したがって、各配列をループして範囲グループを取得し、その範囲をループして個々の値を取得する必要があります。

は、基本的なSUM形式の関数の例については以下を参照してください:

追加するEDITED
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

変数 'cel'を宣言し、args'ループの代わりに、カウンターで簡単な' For'ループでは '各VARGについてを使用してください、 'TypeOf args(i)Is Range'を使用します。 'TypeName'の代わりに' dRunningTotal'に追加する前に 'IsNumeric(cel.Value)'をテストしてください。さもなければこれはよい答え、+1です。 – Leviathan

+0

ちょっと@ user3561813私は別の補遺を持っています。これはうまくいきますが、値が0のときは奇妙になります。 if文などを使って0を含むすべての反復をスキップしたいと思います。どう思いますか? args(i)= 0の場合 dRunningTotal = dRunningTotal –

+0

@ T.Heng自分のビジネスロジックをコードに追加することは何も問題はありません。 'cel.Value <> 0 Then' 'dRunningTotal = dRunningTotal + cel.Value'のようになります。 – user3561813

関連する問題