書かれているように、関数は引数として2つの範囲しか受け入れません。
可変数の範囲を関数で使用できるようにするには、引数リストにParamArrayバリアント配列を宣言する必要があります。次に、配列内の各範囲を順番に処理することができます。例えば
、
Function myAdd(Arg1 As Range, ParamArray Args2() As Variant) As Double
Dim elem As Variant
Dim i As Long
For Each elem In Arg1
myAdd = myAdd + elem.Value
Next elem
For i = LBound(Args2) To UBound(Args2)
For Each elem In Args2(i)
myAdd = myAdd + elem.Value
Next elem
Next i
End Function
この機能は、複数の範囲を追加するためのワークシートで使用することができます。あなたの関数のために
、範囲(またはセル)のの質問があり、関数に渡されたことができるのセッション 'とどれが「お客様」であります。
最も簡単なケースは、最初の範囲がセッションであり、後続の範囲が顧客であると判断した場合です。
Function calculateIt(Sessions As Range, ParamArray Customers() As Variant) As Double
'This function accepts a single Sessions range and one or more Customers
'ranges
Dim i As Long
Dim sessElem As Variant
Dim custElem As Variant
For Each sessElem In Sessions
'do something with sessElem.Value, the value of each
'cell in the single range Sessions
Debug.Print "sessElem: " & sessElem.Value
Next sessElem
'loop through each of the one or more ranges in Customers()
For i = LBound(Customers) To UBound(Customers)
'loop through the cells in the range Customers(i)
For Each custElem In Customers(i)
'do something with custElem.Value, the value of
'each cell in the range Customers(i)
Debug.Print "custElem: " & custElem.Value
Next custElem
Next i
End Function
あなたは、任意の数のセッションを含めたい場合は範囲やお客様の任意の数の範囲は、その後、あなたはそれがセッションが及ぶお客様の範囲切り離すことができるように機能を教えてくれるの引数を含める必要があります。
この引数は、次の引数の数がセッション範囲で、残りの引数が暗黙的に得意先範囲であることを識別する関数の最初の数値引数として設定できます。関数のシグネチャは、
Function calculateIt(numOfSessionRanges, ParamAray Args() As Variant)
となります。また、「セッション」の範囲をCustomersの範囲から区切る「ガード」引数にすることもできます。次に、あなたのコードは、それがガードかどうかを調べるために各引数をテストする必要があります。プログラム・ロジックは、その後の線に沿ってあるかもしれない
calculateIt(sessRange1,sessRange2,...,"|",custRange1,custRange2,...)
:
Function calculateIt(ParamArray Args() As Variant) As Double
...
'loop through Args
IsSessionArg = True
For i = lbound(Args) to UBound(Args)
'only need to check for the type of the argument
If TypeName(Args(i)) = "String" Then
IsSessionArg = False
ElseIf IsSessionArg Then
'process Args(i) as Session range
Else
'process Args(i) as Customer range
End if
Next i
calculateIt = <somevalue>
End Function
を助けばらばらの細胞のあなたのセットに定義名を割り当て、名前を渡すことができますことを願っています。 –