Я пытаюсь просмотреть каждое значение массива, сгенерированного моей функцией, и поместить его в ячейку, если значение равно <> 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
В какой строке ошибка и что она говорит? Где вы определили vals0
? Он основан на 0 или на 1? (т. е. vals0(0 to 99)
или vals0(1 to 100)
— найдите функции ubound
и lbound
) Является ли он одномерным или более? (например, vals0(1 to 100)``vals0(1 to 100, 1 to 2)
)
Сейчас я это закомментировал, но "If Vals0(looop0) <> 0 Then" дает мне ошибку несоответствия типа, это Vals0(от 1 до 30)
Что такое vals0(looop0)
в тот момент, когда вы получаете ошибку времени выполнения? Странное у вас соглашение об именах, кстати...
Это двойник. например 18.747474382282 или что-то в этом роде. 13 знаков после запятой, я думаю. Необходимо соглашение об именах, у меня есть куча этих структур от 0 до 9, обозначающих имена оборудования.
Когда вы обнаружите, что добавляете числовой суффикс к переменной, чтобы отделить ее от других переменных того же типа, но с аналогичной функцией, обычно это признак того, что вам следует использовать массивы или какую-либо другую структуру.
Двойник не вызовет несоответствие типов. Должно быть что-то другое.
возможно, я программировал всего месяц, поэтому я не знаю «правильного» способа что-либо сделать.
@FunThomas Он говорит «Вариант / Двойной», затем, когда я захожу в массив в локальном окне, двойное значение отображается как vals0 (1) (1) = 18,2738746824382, и оно помещается в ячейку таким же образом, как вы можете см. в коде выше. это просто ошибки, когда я пытаюсь сравнить его с 0
Если локальное окно показывает два индекса для значений в vals0
, то это означает, что vals0
является двумерным массивом, и сравнение с нулем выполняется с массивом, а не с числом.
Когда я использую Vals0(loops0,1), отладка говорит, что Vals0 — это одномерный массив. Он также объявлен как одномерный массив. Независимо от того, как я могу сравнить значение массива с 0?
Вы написали «Он говорит 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 - это ситуация с черным ящиком, поэтому я не знаю, всегда ли это будет массив.
Вероятно, вам следует опубликовать больше кода. Какие ошибки в строке?