-1

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

4

1 回答 1

2

你写了“它说 Variant/Double,然后当我进入本地窗口中的数组时,double 值被列为 vals0(1)(1) =18.2738746824382”。所以,显然vals0(1)不是双精度,而是双精度数组。

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

所以首先要做的事情是:Debug.Print looop0, VarType(vals0(looop0))在你的Run-statement 之后放置一个语句。查看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
...

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

于 2019-04-10T13:45:15.510 回答