• 締切済み

Microsoftのaccessのクエリ関数につい

「負割」というフィールドがあり、0、1、2、3、200という数字が1つ選択できます。これを選択すると、「点数」というフィールドの数字と掛算されます。この合計額が「負担金」というフィールドに表示されるのですが、 ・0,1,2,3のどれかを選択した場合、 IIf(([点数]*[負割] Mod 10)<5,[点数]*[負割]-([点数]*[負割] Mod 10),[点数]*[負割]-([点数]*[負割] Mod 10)+10)) で四捨五入されます。 ・200という数字が選択されると、「点数」×「3」の合計が199まではそのまま計算された数字で表示されますが、200や200を超えても「200」にしかならない。という式を作りたいと思っています。 できないことはこの「200」という数字が選択されたときの関数で IIf([負割]>199,(IIf([点数]*3)>200,200,(IIf(([点数]*3 Mod 10)<5,[点数]*3-([点数]*3 Mod 10),[点数]*3-([点数]*3 Mod 10)+10))),(IIf(([点数]*[負割] Mod 10)<5,[点数]*[負割]-([点数]*[負割] Mod 10),[点数]*[負割]-([点数]*[負割] Mod 10)+10))) このように導き出したのですが、関数が正しくありません。 間違っているのがわかる方、いらっしゃったら教えてください。お願いします。

みんなの回答

回答No.3

そんな複雑な式にしなくても、一の位を 四捨五入は、下記の式で可能です。 Int(([点数]*[負割]+5)/10)*10 > ・200という数字が選択されると、「点数」×「3」の合計が199まではそのまま計算された数字で表示されますが、200や200を超えても「200」にしかならない。 下記の式になります。 Int((IIf([負割]>199,IIf([点数]*3>200,200,[点数]*3),[点数]*[負割])+5)/10)*10) このぐらいなら、VBAにするまでもないかな。

tsukushino
質問者

お礼

遅くなりまして申し訳ありません!おしえていただいた方法でできることができました。 ありがとうございます!! VBAにするまでもないですね…!

回答No.2

If [負割]>199 THEN   If [点数]*3 >200 Then     X=200   Else     If ([点数]*3 Mod 10)<5 Then       X=[点数]*3-([点数]*3 Mod 10)     Else       X=[点数]*3-([点数]*3 Mod 10)+10     End If   (IIf(([点数]*[負割] Mod 10)<5,[点数]*[負割]-([点数]*[負割] Mod 10),[点数]*[負割]-([点数]*[負割] Mod 10)+10))) とここで作業中止。理由は、Rounds()が不足しているから。 Public Function Rounds(ByVal M As Currency, _             ByVal A As Integer, _             Optional D As Integer = 0) As Variant   Dim R As Currency      Select Case A     Case 0 ' 四捨五入       R = Fix(M * 10 ^ D + 0.5@)     Case 1 '切り捨て       R = Fix(M * 10 ^ D)     Case 2 ' 切り上げ       R = Rounds(M * 10 ^ D + 0.4@, 0)   End Select   Rounds = Sgn(M) * (R / 10 ^ D) End Function Rounds()を用いれば簡略化できますよ。加えて、論理式で書くことも検討。

tsukushino
質問者

お礼

ありがとうございます!! f_a_007さんの方法ですとエラーが少なそうでうれしいです。 無事、できることができました。 どうもありがとうございます!

  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.1

なぜこのような複雑な計算をVBAに関数を作らないのでしょうか? 解析すると以下のような意味ではないのですか?ごちゃごちゃで分からないですけど。 でもこれだと200以下も計算されますよね。どうしたいのかを自分でもアレンジしやすいはず。 Public Function X(負割 As Long, 点数 As Long) As Double If 負割 > 199 Then If (点数 * 3) > 200 Then X = 200 Else If (点数 * 3 Mod 10) < 5 Then X = 点数 * 3 - (点数 * 3 Mod 10) Else X = 点数 * 3 - (点数 * 3 Mod 10) + 10 End If End If Else If (点数 * 負割 Mod 10) < 5 Then X = 点数 * 負割 - (点数 * 負割 Mod 10) Else X = 点数 * 負割 - (点数 * 負割 Mod 10) + 10 End If End If End Function

tsukushino
質問者

お礼

VBA不勉強で申訳ありません!!アレンジしやすい内容を教えていただき、とてもうれしく思います。 どうもありがとうございます!!