Как использовать условие 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

Вот локальное окно для нескольких итераций цикла for

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). Что бы вы сделали, если бы он содержал более одного значения?

Другие вопросы по тегам