我试图查看由函数生成的数组的每个值,如果值<> 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
Here is the locals window for a few iterations of the for loop
答案 0 :(得分:1)
您写了“它说Variant / Double,然后当我进入本地窗口中的数组时,double值被列为vals0(1)(1)= 18.2738746824382” 。因此,显然vals0(1)
不是double,而是double的数组。
很遗憾,您没有告诉我们有关PIAdvCalcVal
的任何信息。 vals0
被声明为具有Variant
类型的30(?)元素的(一维)数组。这意味着您有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是大于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
)。如果它包含多个值,您将怎么办?