VBA for Access には、Max(x,y)
2 つ以上の値の数学的最大値を見つける単純な関数がありません。私は、perl/php/ruby/python などの他の言語からのベース API に既にそのような関数を持っていることに慣れています。
私はそれができることを知っています: IIf(x > y, x,y)
. 他に利用可能なソリューションはありますか?
VBA for Access には、Max(x,y)
2 つ以上の値の数学的最大値を見つける単純な関数がありません。私は、perl/php/ruby/python などの他の言語からのベース API に既にそのような関数を持っていることに慣れています。
私はそれができることを知っています: IIf(x > y, x,y)
. 他に利用可能なソリューションはありますか?
質問を解釈して読みます:
数値配列の最大値/最小値を返す関数を Access に実装するにはどうすればよいですか? これが私が使用するコードです(IIfとの類推により「iMax」と名付けられました、つまり、「Immediate If」/「Immediate 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
Access がそれを実装しない理由については、あまり一般的ではないように思えます。それはあまり「データベース」でもありません。ドメイン全体および行のセットで最大/最小を見つけるために必要なすべての関数を既に取得しています。また、実装するのも、必要なときに 1 回限りの比較としてコーディングするのもそれほど難しくありません。
たぶん、上記は誰かを助けるでしょう。
彼らはおそらく、DMAXとDMIN、またはsql MAXを使用し、アクセス時にデータベースのみを操作すると考えていたのでしょうか。
理由についても興味があります。一時テーブルを作成し、テーブルにフォーム値を追加してから、テーブルでDMAXまたはMAXクエリを実行して結果を取得するのはやり過ぎのようです...
これらに対処するためだけに小さな projMax() 関数を作成することが知られています。VBA が強化されることはおそらくありませんが、適切な Max (および Min) 関数が追加された場合に備えて、私の関数と競合することはありません。ところで、元のポスターはIIFを行うことを提案しています...それはうまくいきますが、私の関数では、通常、nullが関数を台無しにするのを防ぐために、いくつかのNz()をスローします。
どちらの関数も 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