Нет функции max (x, y) в Access - PullRequest
       53

Нет функции max (x, y) в Access

13 голосов
/ 31 августа 2009

В VBA для доступа отсутствует простая функция Max(x,y) для поиска математического максимума двух или более значений. Я привык, что такая функция уже есть в базовом API из других языков, таких как perl / php / ruby ​​/ python и т. Д.

Я знаю, что это можно сделать: IIf(x > y, x,y). Есть ли другие доступные решения?

Ответы [ 7 ]

7 голосов
/ 10 июля 2011

Я интерпретирую вопрос следующим образом:

Как реализовать функцию в Access, которая возвращает Max / Min массива чисел? Вот код, который я использую (названный «iMax» по аналогии с IIf, то есть «Немедленный If» / «Немедленный Макс»):

  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

Что касается того, почему Access не реализовал это, мне кажется, что это не очень распространенная вещь. Это не очень "база данных", либо. У вас уже есть все функции, необходимые для нахождения Max / Min в домене и в наборах строк. Это также не очень сложно реализовать или просто кодировать как одноразовое сравнение, когда вам это нужно.

Возможно, вышеизложенное кому-нибудь поможет.

2 голосов
/ 14 ноября 2018

Вызов функций Excel VBA из MS Access 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,1 с), но последующие вызовы гораздо более разумны (<0,002 с для меня). </p>


Ссылаясь на Excel как объект

Если в вашей процедуре используется множество функций Excel, вы можете улучшить производительность, используя объект Application для прямой ссылки на Excel.

Например, эта процедура повторяет набор записей, многократно используя MAX в Excel для байтового массива, чтобы определить «самый высокий» 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
1 голос
/ 22 марта 2016

Обе функции имеют проблемы с нулем. Я думаю, что это будет лучше.

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
1 голос
/ 25 сентября 2013

Мне понравилось использование 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

Единственное различие между двумя функциями - это порядок vVal и vNumeric в операторе IIF.
Для каждого предложения используется внутренняя логика VBA для обработки циклов и проверки границ массива, в то время как «Base 0» запускает массив индекс при 0.

1 голос
/ 31 августа 2009

Мне известно, что я создал небольшую функцию projMax (), чтобы справиться с этим. Не то чтобы VBA, вероятно, когда-либо будет улучшен, но на случай, если они когда-нибудь добавят правильную функцию Max (и Min), это не будет конфликтовать с моими функциями. Кстати, оригинальный постер предлагает сделать IIF ... Это работает, но в своей функции я обычно выбрасываю пару Nz (), чтобы предотвратить разрушение функции нулевым значением.

1 голос
/ 31 августа 2009

Потому что они, вероятно, думали, что вы будете использовать DMAX и DMIN или sql MAX и работать только с базой данных в доступе?

Мне также любопытно, почему ... Это кажется излишним, когда приходится создавать временную таблицу и добавлять значения форм в таблицу, а затем выполнять DMAX или MAX-запрос к таблице, чтобы получить результат ...

0 голосов
/ 20 ноября 2017

Вы можете сделать Worksheetfunction.max() или worksheetfunction.min() в Access VBA. Надеюсь это поможет.

...