Как написано, ваша функция принимает только два диапазона в качестве аргументов.
Чтобы включить переменное количество диапазонов, используемых в функции, вам необходимо объявить массив вариантов 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)
Или это может быть «охранник» аргумент, который отделяет Сессия колеблется от диапазонов клиентов. Затем ваш код должен будет проверить каждый аргумент, чтобы убедиться, что это был защитник. Функция будет выглядеть следующим образом:
Function calculateIt(ParamArray Args() As Variant)
Возможно, с вызовом что-то вроде:
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
В качестве альтернативы ParamArray, может назначить определенное имя для вашего набора непересекающихся клеток и передать имя. –