VBA for Access缺少簡單的Max(x,y)
函數來查找兩個或更多值的數學最大值。我習慣於在其他語言如perl/php/ruby/python等基礎API中已經具有這樣的功能。Access中沒有max(x,y)函數
我知道可以這樣做:IIf(x > y, x,y)
。還有其他解決方案嗎?
VBA for Access缺少簡單的Max(x,y)
函數來查找兩個或更多值的數學最大值。我習慣於在其他語言如perl/php/ruby/python等基礎API中已經具有這樣的功能。Access中沒有max(x,y)函數
我知道可以這樣做:IIf(x > y, x,y)
。還有其他解決方案嗎?
我會解釋這個問題爲:
怎樣才能實現訪問函數返回數字數組的最大/最小?下面是我使用的代碼(名爲「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
至於爲什麼訪問將不執行它,它不是一個很常見在我看來,需要的東西。這也不是很「數據易」。您已經擁有了在域和行集中查找最大值/最小值所需的全部功能。這也不是很難實現,或者只是在您需要時作爲一次性比較進行編碼。
也許上述將有助於某人。
因爲他們可能認爲你會使用DMAX和DMIN或sql MAX並且只能在訪問數據庫時使用?
我也很好奇爲什麼..它似乎是一個矯枉過正的創建一個臨時表,並將表格值添加到表中,然後在表上運行DMAX或MAX查詢來獲得結果...
是的,我使用的值是在數據庫中,但在同一行的兩列。這不僅僅是一個最大值,而是一個簡單的數學最大值。 – DGM
我已經知道創建一個小projMax()函數來處理這些。不是說VBA可能會被增強,但是爲了防止它們添加適當的Max(和Min)函數,它不會與我的函數衝突。順便說一句,原來的海報建議做IIF ......這是有效的,但在我的功能中,我通常會拋出幾個Nz()來防止null損壞該函數。
我喜歡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.
這兩個函數都有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
你可以訪問VBA內做Worksheetfunction.max()
或worksheetfunction.min()
。希望這可以幫助。
這比問題後一年的倒票更有用。 :) – DGM
我很驚訝,它沒有得到答案越快,給出了多麼微不足道的問題。也許這是因爲這個問題是對抗性的(即,惡意訪問),這樣那些知道答案的人就會被關掉,懶得去幫助某個似乎在他肩膀上有一些東西的人。 –
你明白爲什麼數據庫開發工具不會內置這樣的功能,對吧?與此類功能相比,有更多的數據庫相關的遺漏。 –