VBA — преобразовать диапазон в вариант

Я застрял в преобразовании из диапазона в вариант.

Для функции процентного уровня я хочу удалить элементы, равные 0, а затем использовать входные данные в процентном уровне помощника. Например, если

xВведите 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

yВведите 5, 0, 0, 2, 3, 4, 0, 4, 5, 0

Я хочу, чтобы входные данные, переданные в процентAboveHelper, были бы

xВвод: 1, 4, 5, 6, 8, 9

YВвод: 5, 2, 3, 4, 4, 5

Для функции процентаAboveHelper она отлично работает сама по себе. Но если я передал варианты из процента выше, я получаю #value!

Я попытался проверить, какая строка вызывает #value!. Итак, я пишу msgbox «1» и msgbox «2» в процентах над помощником. Я вижу, что если я использую только процентAboveHelper, я могу видеть сообщения 1 и 2. Но если я использую процентAbove, я могу видеть только сообщение 1.

Из этого сообщения переключение с диапазона на массив и Вернувшись в функцию VBA, я вижу, что преобразование можно просто выполнить с помощью variant = range.value. Но это не работает в моем случае. Есть предложения?

Function percentageAbove(above As Double, x As Double, xInput As Excel.Range, yInput As Excel.Range)
    Dim xRange As Excel.Range, yRange As Excel.Range
    For index = 1 To xInput.count
        If Not yInput.Item(index) = 0 Then
            If Not yRange Is Nothing Then
                Set xRange = Union(xRange, xInput.Item(index))
                Set yRange = Union(yRange, yInput.Item(index))
            Else
                Set xRange = xInput.Item(index)
                Set yRange = yInput.Item(index)
            End If
        End If
    Next index
    ' I do check the xRange and yRange. Both contain elements
    Dim xVariant As Variant, yVariant As Variant
    xVariant = xRange.Value
    yVariant = yRange.Value
    percentageAbove = percentageAboveHelper(above, x, xVariant, yVariant)
End Function

Function percentageAboveHelper(above As Double, x As Double, xVariant As Variant, yVariant As Variant)
    Dim n As Integer, df As Integer, meanOfX As Double, expectedY As Double, sste As Double, ssx As Double, se As Double
    n = Application.count(xVariant)
    df = n - 2
    meanOfX = Application.Average(xVariant)
    MsgBox "1"
    expectedY = Application.Forecast(x, yVariant, xVariant)
    MsgBox "2"
    sste = Application.StEyx(yVariant, xVariant)
    ssx = Application.DevSq(xVariant)
    se = sste * Sqr(1 / n + (x - meanOfX) ^ 2 / ssx)
    Dim tValue As Double, oneTailConf As Double
    tValue = (expectedY - above) / se
    oneTailConf = Application.TDist(Abs(tValue), df, 1)
    If tValue > 0 Then
        percentageAboveHelper = 1 - oneTailConf
    Else
        percentageAboveHelper = oneTailConf
    End If
End Function

person Pak Ho Cheung    schedule 02.09.2017    source источник
comment
Где (в какой строке кода) возникает ошибка? Что за ошибка (точно)?   -  person Daniel Dušek    schedule 02.09.2017
comment
(а) Но это не работает, в моем случае это не очень информативно. (b) Ваши xRange и yRange потенциально не являются смежными диапазонами. (Я предполагаю, что именно поэтому вы используете Union?) Если это так, это будет означать, что xVariant и yVariant устанавливаются только в значения первых Area в каждом из этих несмежных диапазонов.   -  person YowE3K    schedule 02.09.2017
comment
Привет @dee, я имею в виду #value! не ошибка. Пожалуйста, смотрите мое редактирование. Я добавил немного информации. Спасибо.   -  person Pak Ho Cheung    schedule 02.09.2017
comment
Привет @ YowE3K Да, ты прав. Я добавил немного информации. Пожалуйста, смотрите мое редактирование. Спасибо.   -  person Pak Ho Cheung    schedule 02.09.2017
comment
Попробуйте использовать эта функция, которая работает с областями и получает значения всех областей диапазона.   -  person Daniel Dušek    schedule 02.09.2017
comment
Примечание. Я только что добавил тег [excel-udf], потому что причина #VALUE заключается в том, что UDF возвращает его сразу после сбоя. (Из-за ограничения в 5 тегов я удалил [type-conversion], так как это был наименее применимый тег, так как на самом деле вы не конвертируете типы, а просто присваиваете Variant значения из Range массиву Variant.)   -  person YowE3K    schedule 02.09.2017
comment
При отладке UDF обычно лучше всего перейти в окно Immediate Window VBE и запустить их оттуда, например. возможно, используйте ?percentageAbove(2, 4, Range("A1:J1"), Range("A2:J2")) (не уверен, какие значения вы обычно передаете, поэтому я просто придумал некоторые). Если функции не запускаются как UDF, они на самом деле будут падать, а не просто выскакивать без объяснения причин.   -  person YowE3K    schedule 02.09.2017
comment
Спасибо, парни. Я решил вопрос, создав еще один xArray и yArray, чтобы я мог поместить массивы в функции приложения.   -  person Pak Ho Cheung    schedule 03.09.2017