Может ли функция VBA в Excel возвращать диапазон?
Кажется, я получаю ошибку несоответствия типа при попытке сделать что-то вроде этого:
В новой книге:
A1 B1
5 4
Function Test1() As Integer
Dim rg As Range
Set rg = Test2()
Test1 = rg.Cells(1, 1).Value
End Function
Function Test2() As Range
Dim rg As Range
Set rg = Range("A1:B1")
Test2 = rg
End Function
Добавление = Test1() должно возвращать 5, но код, кажется, заканчивается при возврате диапазона из test2(). Можно ли вернуть диапазон?
Ответы
Ответ 1
Диапазон - это объект. Назначение объектов требует использования ключевого слова SET и похоже, что вы забыли его в своей тестовой функции:
Function Test1() As Integer
Dim rg As Range
Set rg = Test2()
Test1 = rg.Cells(1, 1).Value
End Function
Function Test2() As Range
Dim rg As Range
Set rg = Range("A1:B1")
Set Test2 = rg '<-- Don't forget the SET here'
End Function
Ответ 2
Вы также можете вернуть Variant()
, который представляет массив значений. Ниже приведен пример функции, которая меняет значения из диапазона на новый диапазон:
Public Function ReverseValues(ByRef r_values As Range) As Variant()
Dim i As Integer, j As Integer, N As Integer, M As Integer
Dim y() As Variant
N = r_values.Rows.Count
M = r_values.Columns.Count
y = r_values.value 'copy values from sheet into an array
'y now is a Variant(1 to N, 1 to M)
Dim t as Variant
For i = 1 To N / 2
For j = 1 To M
t = y(i, j)
y(i, j) = y(N - i + 1, j)
y(N - i + 1, j) = t
Next j
Next i
ReverseValues = y
End Function
В листе вы должны применить эту функцию как формулу массива (с Ctrl
- Shift
- Enter
) с соответствующим количеством выбранных ячеек. Детали функции Swap() здесь не важны.
Примечание, что для многих строк это очень эффективно. Выполнение операций x = Range.Value
и Range.Value = x
, когда x
является массивом, а диапазон содержит несколько столбцов строк, во много раз быстрее, чем выполнение операций по одному непосредственно на ячейках.
Ответ 3
Изменить последнюю строку в Test2 на:
Set Test2 = rg
Ответ 4
Это также работает
Function Test2(Rng As Range) As Range
Set Test2 = Rng
End Function