Как использовать условие If / then для значения Variant / double array? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь посмотреть каждое значение массива, сгенерированного моей функцией, и поместить его в ячейку, если значение <> 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

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

1 Ответ

1 голос
/ 10 апреля 2019

Вы написали "Это говорит вариант / двойник, затем, когда я вхожу в массив в локальном окне, двойное значение указывается как vals0 (1) (1) = 18.2738746824382" . Итак, очевидно, что vals0(1) не является двойным, это массив двойных.

К сожалению, вы ничего не говорите нам о PIAdvCalcVal. vals0 объявляется как (одномерный) массив с 30 (?) Элементами типа Variant. Это означает, что у вас есть 30 вариантов. Каждый вариант может содержать что угодно , двойное число, строку, объект или также Array чего угодно. Последнее, кажется, имеет место, 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). Что бы вы сделали, если бы оно содержало более одного значения?

...