Подтвердить что ты не робот

Может ли функция 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(). Можно ли вернуть диапазон?

4b9b3361

Ответ 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