如何在变体/双精度数组值上使用 If/then 条件?



我正在尝试查看我的函数生成的数组的每个值,如果值<> 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 循环的几次迭代的局部变量窗口

你写了"它说变体/双精度,然后当我进入本地窗口中的数组时,双精度值被列为 vals0(1)(1) =18.2738746824382"。所以,显然vals0(1)不是双精度,它是一个双精度数组。

不幸的是,您没有告诉我们有关PIAdvCalcVal的任何信息.vals0被声明为具有 30(?) 元素的类型为Variant的(一维)数组。这意味着您有 30 种变体。每个变体都可以容纳任何东西,一个双精度,一个字符串,一个对象,或者任何事物的数组。后者似乎是这种情况,PIAdvCalcVal返回了一个双精度值数组(即使数组可能只有一个值)。

所以首先要做的是:在你的Run语句之后放一个语句Debug.Print looop0, VarType(vals0(looop0))。查看 https://learn.microsoft.com/en-us/office/vba/Language/Reference/user-interface-help/vartype-function 以了解表示变量类型的数字。如果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
...

最后,您必须检查返回的数组有多大(检查LBoundUBound)。如果它包含多个值,您会怎么做?

最新更新