Я застрял в преобразовании из диапазона в вариант.
Для функции процентного уровня я хочу удалить элементы, равные 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
xRange
иyRange
потенциально не являются смежными диапазонами. (Я предполагаю, что именно поэтому вы используетеUnion
?) Если это так, это будет означать, чтоxVariant
иyVariant
устанавливаются только в значения первыхArea
в каждом из этих несмежных диапазонов. - person YowE3K   schedule 02.09.2017#VALUE
заключается в том, что UDF возвращает его сразу после сбоя. (Из-за ограничения в 5 тегов я удалил [type-conversion], так как это был наименее применимый тег, так как на самом деле вы не конвертируете типы, а просто присваиваетеVariant
значения изRange
массивуVariant
.) - person YowE3K   schedule 02.09.2017?percentageAbove(2, 4, Range("A1:J1"), Range("A2:J2"))
(не уверен, какие значения вы обычно передаете, поэтому я просто придумал некоторые). Если функции не запускаются как UDF, они на самом деле будут падать, а не просто выскакивать без объяснения причин. - person YowE3K   schedule 02.09.2017