2016-02-26 74 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