2009-08-31 122 views
9

VBA for Access缺少簡單的Max(x,y)函數來查找兩個或更多值的數學最大值。我習慣於在其他語言如perl/php/ruby​​/python等基礎API中已經具有這樣的功能。Access中沒有max(x,y)函數

我知道可以這樣做:IIf(x > y, x,y)。還有其他解決方案嗎?

回答

7

我會解釋這個問題爲:

怎樣才能實現訪問函數返回數字數組的最大/最小?下面是我使用的代碼(名爲「IMAX」類比I如果,即「即時如果」 /「立即更新MAX」):

Public Function iMax(ParamArray p()) As Variant 
    ' Idea from Trevor Best in Usenet MessageID [email protected] 
    Dim i As Long 
    Dim v As Variant 

    v = p(LBound(p)) 
    For i = LBound(p) + 1 To UBound(p) 
     If v < p(i) Then 
     v = p(i) 
     End If 
    Next 
    iMax = v 
    End Function 

    Public Function iMin(ParamArray p()) As Variant 
    ' Idea from Trevor Best in Usenet MessageID [email protected] 
    Dim i As Long 
    Dim v As Variant 

    v = p(LBound(p)) 
    For i = LBound(p) + 1 To UBound(p) 
     If v > p(i) Then 
     v = p(i) 
     End If 
    Next 
    iMin = v 
    End Function 

至於爲什麼訪問將不執行它,它不是一個很常見在我看來,需要的東西。這也不是很「數據易」。您已經擁有了在域和行集中查找最大值/最小值所需的全部功能。這也不是很難實現,或者只是在您需要時作爲一次性比較進行編碼。

也許上述將有助於某人。

+1

這比問題後一年的倒票更有用。 :) – DGM

+2

我很驚訝,它沒有得到答案越快,給出了多麼微不足道的問題。也許這是因爲這個問題是對抗性的(即,惡意訪問),這樣那些知道答案的人就會被關掉,懶得去幫助某個似乎在他肩膀上有一些東西的人。 –

+1

你明白爲什麼數據庫開發工具不會內置這樣的功能,對吧?與此類功能相比,有更多的數據庫相關的遺漏。 –

1

因爲他們可能認爲你會使用DMAX和DMIN或sql MAX並且只能在訪問數據庫時使用?

我也很好奇爲什麼..它似乎是一個矯枉過正的創建一個臨時表,並將表格值添加到表中,然後在表上運行DMAX或MAX查詢來獲得結果...

+0

是的,我使用的值是在數據庫中,但在同一行的兩列。這不僅僅是一個最大值,而是一個簡單的數學最大值。 – DGM

1

我已經知道創建一個小projMax()函數來處理這些。不是說VBA可能會被增強,但是爲了防止它們添加適當的Max(和Min)函數,它不會與我的函數衝突。順便說一句,原來的海報建議做IIF ......這是有效的,但在我的功能中,我通常會拋出幾個Nz()來防止null損壞該函數。

1

我喜歡DGM使用IIF語句和David使用For/Next循環,所以我將它們組合在一起。

由於訪問中的VBA沒有嚴格的類型檢查,因此我將使用varients來保留所有數字,整數和小數,並重新鍵入返回值。

HansUP的榮譽,用於捕捉我的參數驗證:)
添加評論以使代碼更友好。

Option Compare Database 
Option Base 0 
Option Explicit 

Function f_var_Min(ParamArray NumericItems()) As Variant 
If UBound(NumericItems) = -1 Then Exit Function ' No parameters 
Dim vVal As Variant, vNumeric As Variant 
vVal = NumericItems(0) 
For Each vNumeric In NumericItems 
    vVal = IIf(vNumeric < vVal, vNumeric, vVal) ' Keep smaller of 2 values 
Next 
f_var_Min = vVal ' Return final value 
End Function 

Function f_var_Max(ParamArray NumericItems()) As Variant 
If UBound(NumericItems) = -1 Then Exit Function ' No parameters 
Dim vVal As Variant, vNumeric As Variant 
vVal = NumericItems(0) 
For Each vNumeric In NumericItems 
    vVal = IIf(vNumeric < vVal, vVal, vNumeric) ' Keep larger of 2 values 
Next 
f_var_Max = vVal ' Return final value 
End Function 

2個函數之間的唯一區別是IIF語句中vVal和vNumeric的順序。
for each子句使用內部VBA邏輯來處理循環和數組邊界檢查,而「Base 0」啓動數組索引爲0.

+1

'IsNull(NumericItems)'永遠不會是'True'。如果你打算在沒有參數的情況下退出函數,請嘗試檢查'UBound(NumericItems)= -1' – HansUp

+0

好眼睛,在一些示例數據上使用了你的建議,它像廣告一樣工作,保持它! – CoveGeek

0

這兩個函數都有Null問題。我認爲這會更好。

Public Function iMin(ParamArray p()) As Variant 
    Dim vVal As Variant, vMinVal As Variant 

    vMinVal = Null 
    For Each vVal In p 
    If Not IsNull(vVal) And (IsNull(vMinVal) Or (vVal < vMinVal)) Then _ 
     vMinVal = vVal 
    Next 

    iMin = vMinVal 
End Function 
0

你可以訪問VBA內做Worksheetfunction.max()worksheetfunction.min()。希望這可以幫助。

相關問題