Ich mochte DGM die Verwendung der IIF-Anweisung und Davids Verwendung der For/Next-Schleife, also kombiniere ich sie zusammen.
Da VBA im Zugriff keine strenge Typprüfung hat, verwende ich varients, um alle numerischen Werte zu erhalten, ganzzahlig und dezimal, und gebe den Rückgabewert neu ein.
Kudos zu HansUP für das Abfangen meiner Parameterüberprüfung :)
Kommentare hinzugefügt, um Code freundlicher zu machen.
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
Der einzige Unterschied zwischen den 2-Funktionen ist die Reihenfolge der vVal und vNumeric in der Anweisung IIF.
Die for eachle-Klausel verwendet interne VBA-Logik, um die Schleifen- und Arraygrenzenprüfung zu verarbeiten, während "Base 0" den Arrayindex bei 0 startet.
Das ist nützlicher als Down-Stimmen ein Jahr nach der Frage. :) – DGM
Ich bin überrascht, dass es früher keine Antwort bekommen hat, wenn man bedenkt, wie trivial das Problem ist.Vielleicht liegt es daran, dass die Frage konfrontativ war (d. H. Schlechtes Access), so dass die Leute, die die Antwort kannten, zu sehr ausgeschaltet waren, um jemanden zu helfen, der etwas von einem Chip auf seiner Schulter zu haben scheint. –
Sie verstehen, warum ein Datenbankentwicklungswerkzeug keine solche Funktion eingebaut hat, oder? Es gibt viel größere Lücken, die datenbankbezogen sind als eine Funktion wie diese. –