2009-08-31 16 views
9

Access用VBAには、2つ以上の値の数学的最大値を見つける簡単な関数がありません。私はperl/php/ruby​​/pythonなどの他の言語から来たベースAPIにこのような機能を既に持っていることに慣れています。IIf(x > y, x,y)私はそれができることを知っています:IIf(x > y, x,y)。他の解決策がありますか?Accessでmax(x、y)関数がありません

答えて

7

私が読んで質問を解釈します:

どのようにして数字の配列の最大/最小を返すAccessで機能を実装していますか?ここで私が使用したコードは、(式IIf、すなわち、「即時もし」/「即時マックス」から類推して、「IMAX」という名前)です:アクセスはそれを実装しないだろう理由として

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 

、それは非常に一般的ではありません必要なことは私のように思える。あまり「databasy」ではありません。あなたはすでに、ドメインと行のセットでMax/Minを見つけるのに必要なすべての機能を持っています。また、実装が非常に難しいことでもなく、必要なときにワンタイム比較としてコーディングするだけでもあります。

多分上記は誰かを助けるでしょう。

+1

それは、質問の1年後に投票を下回るよりも便利です。 :) – DGM

+2

私はそれが問題がどれほど些細なことかを考えれば、早く答えを得られなかったことに驚いています。おそらく、質問が対立していた(アクセスが悪かったため)回答を知っていた人々が、チップの何かを肩に持っているような人を助けようとするのをやめさせてしまったからです。 –

+1

データベース開発ツールにこのような関数が組み込まれていないのはなぜですか?このような関数よりもデータベース関連の漏れがはるかに多くあります。 –

1

おそらく、あなたはDMAXとDMINまたはSQL MAXを使用し、アクセスでデータベースを操作するだけだと思っていたでしょうか?

私はまた、理由について興味があります。それは一時テーブルを作成してテーブルにフォーム値を追加し、結果を得るためにテーブル上でDMAXまたはMAX-クエリを実行する必要があります。

+0

はい、私が使用している値はデータベースにありますが、同じ行の2つの列にあります。これは単に集計Maxではなく、単純な数学Maxです。 – DGM

1

私は小さなprojMax()関数を作成してこれに対処することが知られていました。 VBAはおそらく強化されているわけではありませんが、適切なMax(およびMin)関数を追加するだけの場合は、自分の関数と競合しません。ところで、元のポスターはIIFを行うことを示唆しています...それはうまくいきますが、私の機能では、ヌルが関数を破壊するのを防ぐためにNz()を2回投げます。

1

DGMのIIFステートメントの使用とDavidの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つの関数の唯一の違いは、IIFステートメントのvValとvNumericの順番です。
各句のforループは内部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()を行うことができます。お役に立てれば。

関連する問題