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)

Другие вопросы по тегам