在Access没有MAX(X,Y)的功能(No max(x,y) function in Acces

2019-08-03 04:23发布

VBA的访问缺少一个简单的Max(x,y)函数找到两个或多个值的数学最大。 我习惯了基本的API中已经有这样的功能,从其他语言如Perl / PHP /拼音/ Python等来了

我知道这是可以做到: IIf(x > y, x,y) 是否有任何其他的解决方案可用?

Answer 1:

我要解释的问题如下:

怎样才能实现访问函数返回数字数组的最大/最小? 下面是我使用的代码(名为“IMAX”通过与I如果比喻,即“即时如果” /“立即更新MAX”):

  Public Function iMax(ParamArray p()) As Variant
  ' Idea from Trevor Best in Usenet MessageID rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
    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 rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
    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

至于为什么访问将不执行它,它并不需要一个很平常的事,在我看来。 这不是很“databasy”,无论是。 你已经得到了你需要跨越域和行集发现最大/最小的所有功能。 它也并不难实现,或者只是代码作为一次比较,当你需要它。

也许上面会帮助别人。



Answer 2:

从MS Access VBA调用Excel VBA函数

如果您添加到Excel 的引用ToolsReferencesMicrosoft Excel x.xx Object Library ),那么你可以使用WorksheetFunction调用最Excel工作表功能,包括MAX (这也可以在阵列中使用)。

例子:

MsgBox WorksheetFunction.Max(42, 1999, 888)

要么,

Dim arr(1 To 3) As Long
arr(1) = 42
arr(2) = 1999
arr(3) = 888
MsgBox WorksheetFunction.Max(arr)

第一次调用需要一秒钟来(对我来说其实1.1sec)作出回应,但随后的调用是更合理的(<0.002sec每个对我来说)。


参照Excel作为一个对象

如果你使用你的程序有很多的Excel函数,您可以通过使用进一步提高性能Application对象直接引用到Excel。

例如,此过程遍历一组记录,反复使用Excel的MAX上的字节数组,以确定每个记录的“最高”的ASCII字符。

Option Compare Text
Option Explicit
'requires reference to "Microsoft Excel x.xx Object Library"
Public excel As New excel.Application 

Sub demo_ListMaxChars()
    'list the character with the highest ASCII code for each of the first 100 records
    Dim rs As Recordset, mx
    Set rs = CurrentDb.OpenRecordset("select myField from tblMyTable")
    With rs
        .MoveFirst
            Do
                mx = maxChar(!myField)
                Debug.Print !myField, mx & "(" & ChrW(mx) & ")"  '(Hit CTRL+G to view)
                .MoveNext
            Loop Until .EOF
        .Close
    End With
    Set rs = Nothing     'always clean up your objects when finished with them!
    Set excel = Nothing  
End Sub

Function maxChar(st As String)
    Dim b() As Byte                             'declare Byte Array
    ReDim b(1 To Len(st))                       'resize Byte Array
    b = StrConv(st, vbFromUnicode)              'convert String to Bytes
    maxChar = excel.WorksheetFunction.Max(b)    'find maximum Byte (with Excel function)
End Function


Answer 3:

因为他们可能以为你会用DMAX和DMIN或SQL MAX,只有在访问数据库的工作?

进出口也很好奇,为什么..它似乎是一个矫枉过正必须创建一个临时表,并添加表单值表,然后在表上运行DMAX或MAX查询得到的结果...



Answer 4:

我已经知道创建一个小的projMax()函数只是为了应付这些。 这并不是说VBA将可能是有史以来得到加强,但为了以防万一,他们曾经也添加适当的最大(和最小)功能,它不会与我的职责相冲突的。 顺便说一句,楼主建议做IIF ......这样的作品,但在我的功能,我通常扔一对夫妇NZ()的,以防止空的破坏作用。



Answer 5:

这两个函数与空的问题。 我认为这将是更好的。

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


Answer 6:

我喜欢DGM的使用IIF语句和大卫的使用FOR / NEXT循环的,所以我他们结合在一起。

由于VBA在访问没有严格的类型检查,我会用一些变体保留所有数字,整数和小数,并重新键入返回值。

荣誉对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个功能之间的唯一区别是VVAL和vNumeric在IIF语句的顺序。
的每个子句使用内部VBA逻辑来处理循环和数组边界检查,而“基0”从0开始的数组索引。



Answer 7:

你可以做Worksheetfunction.max()worksheetfunction.min()访问VBA内。 希望这可以帮助。



文章来源: No max(x,y) function in Access