Как передать диапазон ячеек в качестве аргумента? - PullRequest
0 голосов
/ 19 июня 2020

Как я могу создать функцию в VBA, чтобы я мог передать диапазон ячеек в качестве аргумента?

Например, я хочу вызвать функцию в электронной таблице в случайной ячейке, написав

=function_name(A2:A7) 

Мой код дает мне ошибку? NAME #, когда я вызываю его в электронной таблице.

Public Function xyz ( ByRef x() As Variant, sizeOfSelection As Integer )
xyz=x(0);
End Function

Он закодирован в модуле, и мои макросы включены.

Ответы [ 4 ]

0 голосов
/ 19 июня 2020

В следующем коде мы просто оцениваем аргумент, который, если Range вызовет свой член по умолчанию, который равен .Value, который для Range из более чем одной ячейки вернет вариантный массив. И наоборот, заключение массива вариантов в квадратные скобки ничего не делает, поэтому это не влияет на него. 1005 * Я также проверил это на листе.

0 голосов
/ 19 июня 2020

Диапазон UDF

Попробуйте что-то вроде этого:

Option Explicit

Function xyz(CountRange As Range) As Long
    xyz = Application.WorksheetFunction.Count(CountRange)
End Function

Function xyzSum(SumRange As Range) As Long
    xyzSum = Application.WorksheetFunction.Sum(SumRange)
End Function

Function xyzIf(CountRange As Range, Criteria as long) As Long
    xyzIf = Application.WorksheetFunction.CountIf(CountRange, Criteria)
End Function
0 голосов
/ 19 июня 2020

Поскольку вы не предоставили много информации о том, что вы хотите делать с функцией, я исправил ваш пример кода следующим образом

Public Function xyz(ByRef x As Variant, Optional sizeOfSelection As Integer)

On Error GoTo EH:

   'Get the value of the first cell in the range
    xyz = x.Item(1).Value  

    Exit Function

EH:
   ' In case x is not a range you will get an error
    xyz = CVErr(9999)  ' user defined error
End Function
0 голосов
/ 19 июня 2020

Попробуйте следующий подход, пожалуйста:

Public Function xyz (rng as Range) As String
    dim arr as variant
    arr = rng.value
    if rng.cells.count>1 then
        Debug.print arr(1, 1), arr(1, ubound(arr,2))
        xyz = rng.Address & " - " & arr(1, 1)
    Else
        xyz = rng.value
    End if
End Function

Это только пример? Что бы вы хотели сделать / вернуть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...