我正在尝试查看我的函数生成的数组的每个值,如果值<> 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
...
最后,您必须检查返回的数组有多大(检查LBound
和UBound
)。如果它包含多个值,您会怎么做?