Как использовать условие If/then для значения Variant/double array?
Я пытаюсь просмотреть каждое значение массива, сгенерированного моей функцией, и поместить его в ячейку, если значение <> 0, но на этом этапе я всегда получаю ошибку несоответствия типов. Код поместит значение в ячейки так, как оно написано, но я хочу очистить 0 значений из набора и заменить на "-".
Vals0 (от 1 до 30)
Do While (Now - 1) > fdate0
looop0 = 1
Start = DateAdd("n", 450, PT.Range("P2").Value)
Endd = DateAdd("d", 1, Start)
E0.Cells((counter0), 1).Value = fdate0
For looop0 = 1 To 30
vals0(looop0) = Application.Run("PIAdvCalcVal", E0Tags(looop0), Start, Endd, "average (time-weighted)", "time-weighted", "0", "1", "0")
' If Vals0(looop0) <> 0 Then
E0.Cells(counter0, (looop0 + 1)).Value = vals0(looop0)
'Else
' E0.Cells(counter0, (looop0 + 1)).Value = "-"
'End If
Next looop0
counter0 = counter0 + 1
PT.Range("P2").Value = (PT.Range("P2").Value + 1)
fdate0 = PT.Range("P2").Value
Loop
1 ответ
Вы написали "Это говорит вариант /Double, затем, когда я вхожу в массив в локальном окне, значение double указывается как vals0 (1) (1) = 18.2738746824382". Итак, очевидно vals0(1)
не является двойным, это массив двойных.
К сожалению, вы ничего не говорите нам о PIAdvCalcVal
, vals0
объявляется как (одномерный) массив с 30(?) элементом типа Variant
, Это означает, что у вас есть 30 вариантов. Каждый вариант может содержать что угодно, двойник, строку, объект или также массив из чего угодно. Последнее, кажется, имеет место, PIAdvCalcVal
вернул массив двойных значений (даже если массив содержит, может быть, только одно значение).
Итак, обо всем по порядку: поставьте заявление Debug.Print looop0, VarType(vals0(looop0))
после вашего Run
-заявление. Просмотрите https://docs.microsoft.com/en-us/office/vba/Language/Reference/user-interface-help/vartype-function чтобы получить представление о числах, представляющих тип vartype. Если vartype что-то> 8192, у вас есть массив чего-то, и это объясняет ошибку несоответствия типов - вы не можете сравнить массив с числом.
Если PIAdvCalcVal
всегда возвращает массив, решение может быть просто написать If Vals0(looop0)(1) <> 0
(Обратите внимание, что Vals0(looop0, 1)
не будет работать как Vals0
не является двумерным массивом).
Более надежное решение может быть
Var x
If IsArray(Vals0(looop0)) Then
x = Vals0(looop0)(1)
Else
x = Vals0(looop0)
End If
If x <> 0 Then
...
Наконец, вы должны проверить размер возвращаемого массива (проверьте LBound
а также UBound
). Что бы вы сделали, если бы он содержал более одного значения?