Как использовать условие If/then для значения массива Variant/double?

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

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

Вероятно, вам следует опубликовать больше кода. Какие ошибки в строке?

SJR 10.04.2019 14:55

В какой строке ошибка и что она говорит? Где вы определили vals0? Он основан на 0 или на 1? (т. е. vals0(0 to 99) или vals0(1 to 100) — найдите функции ubound и lbound) Является ли он одномерным или более? (например, vals0(1 to 100)``vals0(1 to 100, 1 to 2))

Chronocidal 10.04.2019 14:55

Сейчас я это закомментировал, но "If Vals0(looop0) <> 0 Then" дает мне ошибку несоответствия типа, это Vals0(от 1 до 30)

Steven Vitale 10.04.2019 14:56

Что такое vals0(looop0) в тот момент, когда вы получаете ошибку времени выполнения? Странное у вас соглашение об именах, кстати...

FunThomas 10.04.2019 15:03

Это двойник. например 18.747474382282 или что-то в этом роде. 13 знаков после запятой, я думаю. Необходимо соглашение об именах, у меня есть куча этих структур от 0 до 9, обозначающих имена оборудования.

Steven Vitale 10.04.2019 15:04

Когда вы обнаружите, что добавляете числовой суффикс к переменной, чтобы отделить ее от других переменных того же типа, но с аналогичной функцией, обычно это признак того, что вам следует использовать массивы или какую-либо другую структуру.

jsheeran 10.04.2019 15:09

Двойник не вызовет несоответствие типов. Должно быть что-то другое.

FunThomas 10.04.2019 15:09

возможно, я программировал всего месяц, поэтому я не знаю «правильного» способа что-либо сделать.

Steven Vitale 10.04.2019 15:12

@FunThomas Он говорит «Вариант / Двойной», затем, когда я захожу в массив в локальном окне, двойное значение отображается как vals0 (1) (1) = 18,2738746824382, и оно помещается в ячейку таким же образом, как вы можете см. в коде выше. это просто ошибки, когда я пытаюсь сравнить его с 0

Steven Vitale 10.04.2019 15:14

Если локальное окно показывает два индекса для значений в vals0, то это означает, что vals0 является двумерным массивом, и сравнение с нулем выполняется с массивом, а не с числом.

Mistella 10.04.2019 15:36

Когда я использую Vals0(loops0,1), отладка говорит, что Vals0 — это одномерный массив. Он также объявлен как одномерный массив. Независимо от того, как я могу сравнить значение массива с 0?

Steven Vitale 10.04.2019 15:38
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
11
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Спасибо, я действительно новичок в этом, поэтому прошу прощения за неправильное использование терминологии. Я ценю, что вы помогаете мне решить эту проблему. piadvcalcval - это ситуация с черным ящиком, поэтому я не знаю, всегда ли это будет массив.

Steven Vitale 10.04.2019 15:54

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