Пытаясь вернуть диапазон как вывод функции, получите несоответствие типов? - PullRequest
1 голос
/ 13 января 2012

Следующая функция возвращает «несоответствие типов». Я не понимаю, поскольку обратил внимание на использование инструкции «Set» для возврата моего результирующего диапазона.

Я отладил функцию, получаю правильный диапазон для возврата, поэтому проблема в другом месте .. Хмммм ...

Function getVals(column As String) As Range
    Dim col As Variant
    col = Application.Match(column, ThisWorkbook.ActiveSheet.Range("1:1"), 0)
    Dim rng As Range
    Set rng = ThisWorkbook.ActiveSheet.Cells(1, col)
    Set rng = rng.Offset(1, 0)
    Set rng = Range(rng, rng.End(xlDown))
    Set getVals = rng
End Function

Заранее спасибо, ребята, за любую помощь:)

ОБНОВЛЕНИЕ: я смотрю, как отправить результаты в виде массива. Я пробовал сочетания функций, возвращающих тип "option" / "variable ()" и передававших в качестве результата rng.value2, но безуспешно.

Ответы [ 4 ]

1 голос
/ 19 января 2012

Чтобы вернуть результаты в виде массива значений, просто измените тип возвращаемого значения на Variant и верните rng.Value. Приведенный ниже код работает для меня, пока переданная строка column существует в ThisWorkbook.ActiveSheet.Range("1:1").

Function getVals(column As String) As Variant
    Dim col As Variant
    col = Application.Match(column, ThisWorkbook.ActiveSheet.Range("1:1"), 0)
    Dim rng As Range
    Set rng = ThisWorkbook.ActiveSheet.Cells(1, col)
    Set rng = rng.Offset(1, 0)
    Set rng = Range(rng, rng.End(xlDown))
    getVals = rng.Value
End Function

Sub TestingGetVals()
   Dim v As Variant, i As Integer
   v = getVals("a")  ' returns a 2-D array
   For i = 1 To UBound(v)
      Debug.Print v(i, 1)
   Next i
End Sub
0 голосов
/ 13 января 2012

Во-первых, я не понимаю, что вы делаете.У вас есть параметр column, но вы ищете ячейку в строке 1, которая содержит это значение.Например, если столбец = 23, а P1 содержит 23, Match должен вернуть 16.

Ваша процедура завершится неудачно, потому что, если Match не удается, col устанавливается на Error 2042.Вы должны проверить col прежде, чем использовать его как число.

В моем тесте я установил в строке 1 числа в случайной последовательности.Мое совпадение не удалось, поскольку ячейка P1 содержала число 23, а переменная колонка содержит строку «23»Когда я переклассифицировал столбец как Long, Match сработал.

Я недоволен использованием Сиддхартом On Error.Я не люблю использовать On Error для ошибок, которые я ожидаю.Я бы проверил col как числовое после матча.

0 голосов
/ 13 января 2012

Другие люди пишут быстрее, чем я.:-) Есть еще одна возможность, которая еще не была упомянута.

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

Если вы явно указали, ошибка исчезнет?

col = Application.Match(column, ThisWorkbook.Sheet(1).Range("1:1"), 0)
0 голосов
/ 13 января 2012

Вы получаете эту ошибку, потому что Match не может найти то, что вы хотите, и, следовательно, ваш rng оценивает "ничто":)

Рассмотрим этот код

Option Explicit

Sub Sample()
     Dim Ret As Range

     If Not getVals("Value To Match") Is Nothing Then
        Set Ret = getVals("Value To Match")
        MsgBox Ret.Address
     Else
        MsgBox "Value To Match - Not Found"
     End If
End Sub

Function getVals(column As String) As Range
    Dim col As Variant
    Dim rng As Range

    On Error GoTo Whoa

    col = Application.Match(column, ThisWorkbook.ActiveSheet.Range("1:1"), 0)

    Set rng = ThisWorkbook.ActiveSheet.Cells(1, col)

    Set rng = rng.Offset(1, 0)
    Set rng = Range(rng, rng.End(xlDown))
    Set getVals = rng

    Exit Function
Whoa:
    Set getVals = Nothing
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...