将数组传递给返回数组中最小值的函数

时间:2016-02-26 19:35:13

标签: excel-vba vba excel

注意:1)我不想使用Application.Worksheetfunction.Min; 2)我想拒绝不是vbDouble的数组元素; 3)我不知道传递的数组中有多少元素

Public Function getArrayMin(ByRef passedArray() As Double) As Double
'return min of valid numbers in an array

Dim element As Variant
Dim i As Integer

getArrayMin = 1E+25

i = 0
For Each element In passedArray
    If VarType(element) = vbDouble Then
        i = i + 1
        If element < passedArray(i) Then
            getArrayMin = passedArray(i)
        End If
    End If
Next

End Function

JNevill的编辑版本,但仍然不起作用:

Function getArrayMin(passedArray() As Double) As Double
Dim minVal As Double
Dim element As Variant

minVal = 1E+25

For Each element In passedArray
    If element < minVal Or element = passedArray(0) Then
        minVal = element
    End If
Next element

getArrayMin = minVal
End Function

2 个答案:

答案 0 :(得分:1)

i = 0
For Each element In passedArray
    If VarType(element) = vbDouble Then
        i = i + 1
        If cell < passedArray(i) Then
            passedArray(i) = element
        End If
    End If
Next

这看起来很奇怪。您循环遍历数组中的元素,测试它以查看下一个元素是否更大,如果下一个元素更大,则将下一个元素设置为当前元素。然后你再做一次。

所以...在这次运行之后,&#34; min&#34;理论上应该在passedArray(ubound(passedArray))

我想这会起作用,但它感觉很奇怪,因为它会吹掉你的数组并用中间垃圾填充它,除了第一个和最后一个元素。

问题在于,一旦击中阵列的uBound,你就没有下一个元素。最后一个元素会导致问题,但是你不需要分析它,因为它已经包含了min。要解决此错误,您可以将if语句更改为:

 If VarType(element) = vbDouble and i < uBound(passedArray) Then

在函数结束时,请坚持以下内容,以便函数返回一个值。

 getArrayMin=passedArray(uBound(passedArray)). 

你可能也没有返回任何东西,因为你使用byRef,但这意味着你调用这个函数后,你需要得到最后一个元素,所以看起来像:

getArrayMin(myArray)
minOFArray=myArray(Ubound(myArray))

请记住,您正在使用byRef并且您传递给该函数的原始数组将被重写所有元素的函数吹走。就个人而言,我会使用byVal并确保函数返回min。

作为一个完全重写,我会做这样的事情:

Function getArrayMin(passedArray AS Double) as Double
    Dim minVal as double
    Dim element as variant

    For each element in passedArray
        if element < minVal or element = passedArray(0) Then minVal = element
    Next element

    getArrayMin = minVal
End Function

它更加简洁,你的阵列没有怪人。由于passedarray参数已被声明为double,因此我没有检查double。它不应该允许字符串或其他元素通过。

最后,如果您的逻辑需要变得更复杂,上面的重写将为您提供一个跳跃点。但是,最简单的方法就是使用Application.Min():

getArrayMin = Application.Min(passedArray)

答案 1 :(得分:0)

想出来:

Public Function getArrayMin(passedRange As range) As Double
'return min of valid numbers in an array

Dim myarray() As Variant
Dim cell As Variant
Dim i As Integer

myarray = passedRange.value

getArrayMin = 1E+25

For Each cell In passedRange
    If VarType(cell) = vbDouble Then
        If getArrayMin > cell Then
            getArrayMin = cell
        End If
    End If
Next

End Function