如何在 Variant/double 数组值上使用 If/then 条件?
How to use an If/then condition on a Variant/double array value?
我试图查看我的函数生成的数组的每个值,如果该值是 <> 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
您写了"It Says Variant/Double, then when I go into the array in the local window, the double value is listed as vals0(1)(1) =18.2738746824382"。所以,显然 vals0(1)
不是 double,它是一个 double 的数组。
很遗憾,您没有告诉我们任何有关 PIAdvCalcVal
的信息。 vals0
被声明为具有 30(?) 个类型 Variant
元素的(一维)数组。这意味着您有 30 个变体。每个变体都可以包含 任何东西、双精度数、字符串、对象,或者任何东西的 数组。后者似乎是这种情况,PIAdvCalcVal
返回了一个双精度值数组(即使该数组可能只有一个值)。
所以首先要做的事情是:在你的 Run
语句之后添加一个语句 Debug.Print looop0, VarType(vals0(looop0))
。查看 https://docs.microsoft.com/en-us/office/vba/Language/Reference/user-interface-help/vartype-function 以了解代表 vartype 的数字。如果 vartype 大于 8192,则您有一个数组,这可以解释 类型不匹配 错误 - 您无法将数组与数字进行比较。
如果 PIAdvCalcVal
总是 returns 一个数组,解决方案可能是简单地写 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
)。如果它包含多个值,你会怎么做?
我试图查看我的函数生成的数组的每个值,如果该值是 <> 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
您写了"It Says Variant/Double, then when I go into the array in the local window, the double value is listed as vals0(1)(1) =18.2738746824382"。所以,显然 vals0(1)
不是 double,它是一个 double 的数组。
很遗憾,您没有告诉我们任何有关 PIAdvCalcVal
的信息。 vals0
被声明为具有 30(?) 个类型 Variant
元素的(一维)数组。这意味着您有 30 个变体。每个变体都可以包含 任何东西、双精度数、字符串、对象,或者任何东西的 数组。后者似乎是这种情况,PIAdvCalcVal
返回了一个双精度值数组(即使该数组可能只有一个值)。
所以首先要做的事情是:在你的 Run
语句之后添加一个语句 Debug.Print looop0, VarType(vals0(looop0))
。查看 https://docs.microsoft.com/en-us/office/vba/Language/Reference/user-interface-help/vartype-function 以了解代表 vartype 的数字。如果 vartype 大于 8192,则您有一个数组,这可以解释 类型不匹配 错误 - 您无法将数组与数字进行比较。
如果 PIAdvCalcVal
总是 returns 一个数组,解决方案可能是简单地写 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
)。如果它包含多个值,你会怎么做?