2016-02-26 39 views
0

注:1)我不想使用Application.Worksheetfunction.Min; 2)我想拒绝不是vbDouble的数组元素; 3)我不知道提前很多元素是如何传递的数组中传递数组到函数返回最小值在Array

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

你没有任何回报。另外,虽然'cell'在技术上很好,但可以尝试像'element'这样的东西吗? – findwindow

回答

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 
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 

这似乎很奇怪。您是通过数组中的元素循环,测试它,看看下一个元素较大,如果下一个元素是较大的您设置为当前元素的下一个元素。然后你再做一次。

所以......这个运行之后,“MIN”理论上应该是在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并确保函数返回最小值。


由于完全重写,我会做这样的事情,而不是:

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参数已被声明为双精度型,所以没有检查双精度。它不应该允许通过字符串或其他元素。


最后,如果你的逻辑需要变得更复杂,上面的重写将给你一个跳跃点。但最简单的方法做你做的是只用Application.Min()什么:

getArrayMin = Application.Min(passedArray) 
+0

我是个白痴。请参阅上面的修改代码。但是,我的修改仍然无效。 – jmaz

+1

你的修改不起作用,因为你抓住了下一个元素,但你的比较说“如果我现在的元素不到我的下一个元素那么......我的下一个元素是minElement ??”这并不成功。检查我的答案底部的全部重写。它更简洁,应该提供一个更清洁的开始。 – JNevill

+0

仍然不起作用。直到我在函数标题中添加()之前,您的代码才会编译。我也初始化minVal。仍然没有运气。注意:我的函数调用是= getArrayMin(“I26:I28”),其中I26:I28包含双打。另请注意:数组必须始终由Ref传递,如果未指定,则为默认值。 – jmaz