• 締切済み

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

関連するQ&A

  • Accessのクエリーで関数を使用したい。

    Accessのクエリーで、フィールドに入っている値に対して、0.18を掛け算して、少数点第2位を四捨五入し、小数点1位の値にし、文字列として少数点第1位の数字として、表示したいと考えています。 作り方が解らないので宜しくお願い致します。

  • MicrosoftaccessVBAの計算

    こんにちは。VBAで分からない点があるので教えてください。 下記なのですが、負割が[200]の時、[点数]×3で200を越えたら[負担金]フィールドの答えが200 それ以下は×3して四捨五入した数にしたいです。 それがどうしてもできません。 [負割]が200以外の場合は、[点数]×[負割]の出た数を四捨五入した答えを負担金フィールドに表示したいです。 お手数ですがどなたか教えてください。 Private Sub 負担金_BeforeUpdate(Cancel As Integer) If [負割] = 200 Then If [点数] * 3 > 200 = X Then X = 200 Else If ([点数] * 3 Mod 10) < 5 Then X = [点数] * 3 - ([点数] * 3 Mod 10) Else X = [点数] * 3 - ([点数] * 3 Mod 10) + 10 End If If [負割] < 199 Then If [点数] * [負割] Then Else If ([点数] * [負割] Mod 10) < 5 Then X = [点数] * [負割] - ([点数] * [負割] Mod 10) Else X = [点数] * [負割] - ([点数] * [負割] Mod 10) + 10 End If 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

  • access VBA 計算について

    すいません。 http://qa.itmedia.co.jp/qa9245657.html で質問したのですがわかりにくいこのこの上ないと思うので、画像を添付させていただきました。 まるでかこった部分でできないものです。 関係するのは 点数 負割 入金 負担金 値引き なのですが [点数]*[負割]=負担金(四捨五入) が主な式で、これに負担金-入金=値引き という式はできています。 例外が負割が200の時で 200の時のみ、[点数]×3 という式にしたいのです これに出た数は 200以上の場合   例 600(点数)×3=1800 答えは1800ですが、強制的に200にしたいんです。 200以下の場合  45(点数)×3=135(第一位四捨五入で140) としたいのです。 例外200の場合がうまくいかないので、お分かりになる方お知恵をお貸しください。お願いします。 私が考案して間違えている式は以下になります。 Private Sub 負担金_BeforeUpdate(Cancel As Integer) If [負割] = 200 Then   If [点数] * 3 > 200 = X Then     X = 200   Else     If ([点数] * 3 Mod 10) < 5 Then       X = [点数] * 3 - ([点数] * 3 Mod 10)     Else       X = [点数] * 3 - ([点数] * 3 Mod 10) + 10     End If      If [負割] < 199 Then   If [点数] * [負割] Then   Else     If ([点数] * [負割] Mod 10) < 5 Then       X = [点数] * [負割] - ([点数] * [負割] Mod 10)     Else       X = [点数] * [負割] - ([点数] * [負割] Mod 10) + 10     End If 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

  • アクセス クエリ DSum関数

    testテーブル 日付     金額 2009/04/30  1 2009/05/01  2 2009/05/02  3 2009/06/30  4 このデータを元にクエリを作成して 4/1~5/30までの合計を新フィールドに表示させたいです。 日付     金額   4,5月合計 2009/04/30  1      6 2009/05/01  2      6 2009/05/02  3      6 2009/06/30  4    (表示なし) としたいのですが 4,5月合計: DSum("[金額] ","test",[日付]>=#2009/04/01# And [日付]<=#2009/05/30#) とすると 日付     金額  4,5月合計 2009/04/30  1     10 2009/05/01  2     10 2009/05/02  3     10 2009/06/30  4   (表示なし) となってしまいます。 「2009/4/1~2009/5/30のレコードに金額の合計を表示させる」のではく、 「2009/4/1~2009/5/30の金額の合計を表示させる」 にはどうすればいいですか? 表示についてはIIF関数で対応できると思っています。 よろしくお願いします。

  • Access2003 クロス集計で集計値を四捨五入

    ☆以下のようなテーブルで、フィールド[ID]~[点数]があり、文字および数字のデータが混在しています。   ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓ =========================================== (テーブル(1)) [ID]  [クラス]  [科目]  [点数]     1     A     英語    11    2     B     英語    22    3     C     数学    33    4     A     国語    44   5     B     数学    55    6     C     国語    66    7     B     国語    77   8     C     英語    88     9     A     数学    99     =========================================== ☆上記のテーブルをクロス集計クエリで集計する ・フィールド[クラス]を行見出しに設定、 ・フィールド[科目]を列見出しに設定、 ・フィールド[点数]を集計する項目にし主計方法を「合計」に設定する。 =========================================== [クロス集計結果]   合計   英語  国語  数学       A  154   11    44    99        B  154   22    88    55     C  187   99    77    33  =========================================== [課題] クロス集計クエリで、集計値を四捨五入する (1) フィールド[クラス]を行見出しに設定、    フィールド[科目]を列見出しに設定、    フィールド[点数]を集計する項目にし主計方法を「合計」に設定する。 (2) クロス集計の値を、下1桁で四捨五入した値を表示する。   (3) 「合計」の値を、下1桁で四捨五入した値を表示する。 ※ クロス集計した合計値を、四捨五入した値を表示する   ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓ =========================================== [クロス集計結果]   合計   英語  国語  数学     A  150   10    40   100        B  150   20    80    60     C  190   90    70    30  ===========================================   ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑    上記のように、クロス集計クエリでの集計値を四捨五入して 表示させたいのですが、どうすればよろしいでしょうか? また、クエリだけでは出来ない場合は、SQLで教えていただければ 幸いでございます。 お手数お掛けしますが、何とぞ宜しくお願い致します。

  • 窓口負担金の計算方法について

    医療事務に詳しい方質問お願いします。 私は歯科医院に勤めているのですが窓口負担金の計算方法に不安があります。 例えば合計点数が641点の場合、3割負担の方は1923点で1の位は四捨五入のため1920円が負担金になりますよね?残りの7割分は4487点で1の位四捨五入のため4490円分をレセプトで保険先に請求して、6410円分全てが請求出来たことになりますよね? 問題は1の位が5となった場合。例えば合計点数が1005点この場合全額であれば10050円です。3割負担で3015点、四捨五入で3020円が負担金です。残り7割は7035点、四捨五入で7040円をレセプトで請求します。ここで両方を足すと10060円になってしまい、合計が合いません。 1の位が5になった場合どのようになるのでしょうか?

  • ACCESSのRound関数について

    お世話になっております。 ACCESSのクエリでRound関数を使い、小数点以下を四捨五入した値を表示させようと思いましたが、なぜか 1876.5→1876 と表示されてしまいます。 同じ列のほかのセルはちゃんと四捨五入した値が表示され、5389.5 も 5390 のように表示されます。 どなたか思い当たる方原因を教えていただけますでしょうか。 よろしくお願いします。

  • 四捨五入して計算をする方法で謎があるんですが?

    足し算だと12+8を片方の数字を四捨五入して12+10=22 22-2=20にというふうになるじゃないですか。 *12+8=12+10-2=20 引き算だと52-7を片方の数字を四捨五入して52-10=42 42+3=45 *52-7=52-10+3=45 といった通りに四捨五入計算すれば簡単に計算できるじゃないですか。 もしかして掛け算と割り算も四捨五入計算できるのですか? 掛け算と割り算は四捨五入計算で答えを出せるのかがわかりません? もしできるんだったら計算式も詳しく教えてください!

  • ACCESSの数字の操作

    宜しくお願いします。 ACCESSにて実年齢を表示している列があります。 その実年齢を17歳だったら"10代"とし、49歳だったら"40代"などとしたいです。区切りたい年齢はその時々で違うので、四捨五入ではなく任意で指定したいです。 excelでは、IIF関数で<=などを使用するイメージなのですが。。 宜しくお願いいたします。

  • エクセルの関数を複数使いたい

    こんにちは、教えてください エクセルの関数を同時に複数使いたいときはどうしたらよいのでしょうか? 具体的には A1とA2を掛けて1000で割りたものをC1に表示させたいのです。 ただし、 (1)計算をしていないときにはC1に何も表示させたくない。 (2)小数点以下2桁で四捨五入したいのです。 (3)計算式をいったん別のところに表示させず、直接C1にだしたい。 以上の条件をかなえたいのですが、掛け算・割り算の式や、表示の条件を変えるのにIFを使用したり、四捨五入をするのはROUNDを使うのは発想できたのですが、組み合わせ方が分かりません。(表示形式で設定してしまうと、0.20などの際に0.2とはならないので・・・関数を使いたいのです) よろしくお願いします