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

Vin*_*ite 0 excel vba

我在以下代码中收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

它在调用 isStringInFirstColumnOfMultiDimensionArray 函数时发生。

这是函数:

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
Run Code Online (Sandbox Code Playgroud)

Fun*_*mas 5

正如评论中提到的:您显示的代码存在几个问题。

该代码根本无法编译,因为您缺少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
Run Code Online (Sandbox Code Playgroud)

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