Может ли функция VBA в Excel возвращать диапазон? - PullRequest
24 голосов
/ 13 января 2009

Кажется, я получаю ошибку несоответствия типов при попытке сделать что-то вроде этого:

В новой рабочей тетради:

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

Ответы [ 4 ]

45 голосов
/ 13 января 2009

Диапазон - это объект. Присвоение объектов требует использования ключевого слова SET, и похоже, что вы забыли его в своей функции Test2:

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
8 голосов
/ 16 июля 2010

Вы также можете вернуть 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 является массивом, а диапазон содержит столбцы из нескольких строк, в много раз быстрее, чем выполнение операций одна за другой непосредственно в ячейках.

4 голосов
/ 13 января 2009

Изменить последнюю строку в Test2 на:

Set Test2 = rg
2 голосов
/ 01 марта 2014

Это также работает

Function Test2(Rng As Range) As Range
    Set Test2 = Rng
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...