Excel VBA: неограниченный диапазон входов с универсальностью (?)
Может ли кто-нибудь помочь мне создать функцию, которая будет обрабатывать неограниченное количество разнообразных диапазонов? Я пробовал "Paramarray variable () как Variant" и "variable as Range" в моем списке аргументов, но ни один из них не обеспечивает универсальность, которую я ищу.
Главное, чтобы я хотел, чтобы моя функция могла одновременно обрабатывать такие вещи, как "MyFunc(A1:A10, B1)" или "MyFunc(A1, B1:10, C11)". Проблема, которую я обнаружил, состоит в том, что ParamArray может обрабатывать только разделенные запятыми входы, а переменная как Range может обрабатывать только разделенные запятыми входы.
По сути, я хочу иметь ту же функциональность, что и функция SUM(). Где SUM может обрабатывать бесконечное количество входов независимо от того, разделены они запятыми или находятся в диапазоне.
Как и просили, вот мой код:
Function COMMA_DELIMITER(inputs as Range)
' this function basically concatenates a consecutive set of cells and places commas between values
For Each j in Inputs
stringy = stringy & j.value & chr(44)
Next
stringy = Left(stringy, Len(stringy) - 1)
COMMA_DELIMITER = stringy
End Function
или же
Function COMMA_DELIMITER_A(ParamArray others())
'this is the same function, only the cells don't have to be consecutive
For i = 1 to UBound(others) + 1
stringy = stringy & others(i-1) & chr(44)
Next
COMMA_DELIMIERTER_A = Left(stringy, Len(stringy) - 1)
End Function
Я очень хочу создать функцию, которая будет гибко обрабатывать как последовательные ячейки, так и / или непоследовательные ячейки. Входы будут выглядеть так: "=MyFunc(A1, B1:B10, C11, D12:D44)".
Может ли кто-нибудь помочь мне создать функцию, которая может обрабатывать что-то вроде этого, "MyFunc(A1, B1:B10, C11, D12:D44)"?
Спасибо,
Элиас
2 ответа
На самом деле это можно сделать, и код от chris neilsen почти там.
Function MyFunc1(ParamArray r()) As Variant
Dim rng As Range
Dim i As Long
Dim j As Variant
Dim s As String
For i = LBound(r) To UBound(r)
For each j in r(i)
s = s & " " & j.Address
Next
Next
MyFunc1 = s
End Function
Увидеть? Вам нужно только поставить еще один цикл, поэтому, если у вас есть диапазон, например, [A1:A4], он тоже будет включен в этот цикл. Один цикл вернет другой ParamArray, поэтому вы должны выполнить цикл дважды. И если у вас есть только [A1], это тоже не проблема, двойной цикл не вызовет проблем.
Я думаю, что есть два вопроса с вашим подходом
,
а такжеUnion
а такжеIntersect
операторы для диапазонов- Чтобы передать диапазон нескольких областей в один параметр, его необходимо заключить в
( )
Показывать
ParamArray
версия
Циклическая переменная массива для доступа к отдельным диапазонам
Function MyFunc1(ParamArray r()) As Variant
Dim rng As Range
Dim i As Long
Dim s As String
For i = LBound(r) To UBound(r)
s = s & " " & r(i).Address
Next
MyFunc1 = s
End Function
Range
версия
Итерация диапазона Areas
Коллекция для доступа к отдельным диапазонам
Function MyFunc2(r As Range) As Variant
Dim rng As Range
Dim i As Long
Dim s As String
For Each rng In r.Areas
s = s & " " & rng.Address
Next
MyFunc2 = s
End Function
И то и другое=MyFunc1(B5:D5 C4:C6,B10:E10,D13:D16)
а также=MyFunc2((B5:D5 C4:C6,B10:E10,D13:D16))
вернусь$C$5 $B$10:$E$10 $D$13:$D$16
(обратите внимание, что пересечение B5:D5
а также C4:C6
является C5
)