excel 赋值左侧的函数调用在使用函数计算if语句时必须返回Variant或Object

webghufk  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(101)

我在下面的代码中得到了这个错误:

Dim posOfProdInArray As Integer
If isStringInFirstColumnOfMultidimensionalArray(firstCellOfRowTBRead.Offset(0, 2).Value, aggregatedProdsAndTheirData, posOfProdInArray) Then
    sumOfActualDay = sumOfActualDay + firstCellOfRowTBRead.Offset(0, 4).Value * aggregatedProdsAndTheirData(posOfProdInArray, 2)
End If

调用isStringInFirstColumnOfMultidimensionalArray函数时发生。
函数如下:

Public Function isStringInFirstColumnOfMultidimensionalArray( _
      stringToBeFound As String, arr As Variant, _
      Optional ByRef varToReceivePositionOfString As Integer) As Boolean
Dim i
For i = LBound(arr) To UBound(arr)
    If arr(i, 1) = stringToBeFound Then
        isStringInArray = True
        If IsMissing(varToReceivePositionOfString) Then
        Else
            varToReceivePositionOfString = i
        Exit Function
    End If
Next i
isStringInArray = False
End Function
ljo96ir5

ljo96ir51#

正如评论中提到的:您显示的代码存在几个问题。
代码根本无法编译,因为您缺少一个End If
下一个问题是你什么都不回。在VBA中,需要将返回值赋给函数本身(就像函数是一个变量一样)。你的函数名是isStringInFirstColumnOfMultidimensionalArray,因此你需要写isStringInFirstColumnOfMultidimensionalArray = True
它看起来就像是从另一个名为isStringInArray的函数中复制了该函数,并且在分配返回值时没有调整名称。假设你的代码中仍然存在一个函数isStringInArray,这就可以解释你在标题中显示的错误消息:isStringInArray = False在VBA中看起来就像你在给那个函数赋值一样,这是不允许的(也是没有意义的)。
小事:正如Tim Williams已经提到的,isMissing不能在Variant以外的可选参数上工作。但是,这并不重要,您可以完全删除该检查。
您的函数可能类似于

Public Function isStringInFirstColumnOfMultidimensionalArray(stringToBeFound As String, arr As Variant, Optional ByRef varToReceivePositionOfString As Integer) As Boolean
    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        If arr(i, 1) = stringToBeFound Then
            isStringInFirstColumnOfMultidimensionalArray = True
            varToReceivePositionOfString = i
            Exit Function
        End If
    Next i
    isStringInFirstColumnOfMultidimensionalArray = False
End Function

指定False作为返回值也可以删除(因为它是布尔值的默认值),我保留它只是为了更好的可读性。

mrfwxfqh

mrfwxfqh2#

如果你想使用IsMissing来确定一个参数是否传递给了一个标记为Optional的参数,那么这个参数需要声明为Variant
https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/ismissing-function
返回一个布尔值,该值指示是否已将可选的Variant参数传递给过程。

相关问题