2009-08-31 121 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()。希望这可以帮助。

相关问题