注意: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
答案 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