在vba函数中设置返回值将调用函数本身

时间:2018-06-27 20:58:08

标签: excel-vba vba excel

我使用以下函数来获取数组中的唯一值。但是,在第二行中,UniqueArray(i)= TempArray(i),它将再次调用函数本身,而不是分配数组值。 感谢您的帮助。

Function UniqueArray(MyArray) As Variant

Dim TempArray As Variant
ReDim TempArray(0)
TempArray(0) = MyArray(LBound(MyArray))
For i = LBound(MyArray) To UBound(MyArray)
      If Not IsInArray(TempArray, MyArray(i)) Then
            ReDim Preserve TempArray(UBound(TempArray) + 1)
            TempArray(UBound(TempArray)) = MyArray(i)
      End If
Next i

ReDim MyArray(UBound(TempArray))
For i = LBound(TempArray) To UBound(TempArray)
    UniqueArray(i) = TempArray(i)
Next i

End Function

2 个答案:

答案 0 :(得分:1)

将TempArray数组作为一个整体传递回来。您不需要依靠“帮助器”功能来确定Excel的唯一性。应用程序具有多个选项。

Sub main()
    Dim arr As Variant

    arr = Array(1, 2, 2, 3, 4, 5, 5)

    Debug.Print Join(arr, ",")    '1,2,2,3,4,5,5

    arr = UniqueArray(arr)

    Debug.Print Join(arr, ",")    '1,2,3,4,5

End Sub

Function UniqueArray(MyArray) As Variant

    Dim i As Long, TempArray As Variant

    ReDim TempArray(0)
    TempArray(0) = MyArray(LBound(MyArray))

    For i = LBound(MyArray) + 1 To UBound(MyArray)
          If IsError(Application.Match(MyArray(i), TempArray, 0)) Then
                ReDim Preserve TempArray(UBound(TempArray) + 1)
                TempArray(UBound(TempArray)) = MyArray(i)
          End If
    Next i

    UniqueArray = TempArray

End Function

如果要在Excel之外使用该函数,则您可能希望保留IsInArray随行函数。

答案 1 :(得分:-1)

我相信您需要重新设置 UniqueArray 而不是 MyArray ,因为 MyArray 是该函数的输入。由于您尚未将其声明为数组。