Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


81 / 2272 ツリー ←次へ | 前へ→

【13091】お手数をおかけします。VBAについて みとこんどりあ 16/10/21(金) 10:57 質問[未読]
【13092】Re:お手数をおかけします。VBAについて みとこんどりあ 16/10/21(金) 11:55 質問[未読]
【13093】Re:お手数をおかけします。VBAについて 亀マスター 16/10/21(金) 19:28 回答[未読]

【13091】お手数をおかけします。VBAについて
質問  みとこんどりあ  - 16/10/21(金) 10:57 -

引用なし
パスワード
   現在、access勉強中です。
現職の会社にデータベースを依頼されたのですが、なかなかうまくいきません。
もしよろしければどこんにちは。VBAで分からない点があるので教えてください。

下記なのですが、負割が[200]の時、[点数]×3 の答えが200を越えたら[負担金]フィールドの答えが[200]で固定。
答えが[199]か[199]以下の場合、そのまま四捨五入。
これができません。

[負割]が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
なたかお知恵を授けてください。

【13092】Re:お手数をおかけします。VBAについて
質問  みとこんどりあ  - 16/10/21(金) 11:55 -

引用なし
パスワード
   わかりにくいとおもったので追記します。


関係するフィールドは

[点数] [負割] [入金] [負担金] なのですが

[点数]*[負割]=負担金(四捨五入)

が主な式です。

例外が[負割]が200の時で

200の時のみ、[点数]×3 という式にしたいのです
これに出た数は 200以上の場合   例 600(点数)×3=1800
答えは1800ですが、強制的に200にしたいんです。
200以下の場合  45(点数)×3=135(第一位四捨五入で140)
としたいのです。

例外200の場合がうまくいかないので、お分かりになる方お知恵をお貸しください。お願いします。

【13093】Re:お手数をおかけします。VBAについて
回答  亀マスター  - 16/10/21(金) 19:28 -

引用なし
パスワード
   >  If [点数] * 3 > 200 = X Then
ここがまずおかしいですね。200で上手くいかない場合の直接的な原因はここでしょう。「= X」が余計です。

>If [負割] = 200 Then
>If [負割] < 199 Then
これらに対するEnd Ifがないように思えますが、転記漏れでしょうか?
そのままだと、[負割]が200かどうか以前に、エラーで止まると思いますが。
あと、
Private Sub 負担金_BeforeUpdate(Cancel As Integer)
に対するEnd Subもありませんね。

>If [負割] < 199 Then
>  If [点数] * [負割] Then
>  Else
(上記のEnd If漏れがなかったとして)これだと[負割]が199のときのパターンが含まれなくなるので、期待した結果が得られませんよ。
あと、わざわざ[負割]が199以下かどうかを判定しているようですが、説明を見ると、200とそれ以外のパターンしかないのではないでしょうか。だったら、199以下かどうかを改めて判定するのではなく、200の場合とそれ以外の場合という形での判定がスマートです。
(例)
If [負割] = 200 Then
  <-- 200丁度の場合の処理 -->
Else
  <-- それ以外の場合の処理 -->
End If

X という変数は最終的に [負担金] = X とでもしているのでしょうか。
でしたら構わないのですが、このままだと[負担金]が何も変化しないように思えました。それに、わざわざ X という変数を挟まなくても、直接[負担金]を操作すればいいのではないでしょうか。

>Public Function Rounds
せっかく四捨五入をするための関数を用意しているのに、それを使わずに別途四捨五入のための処理をしているのが気になります。

81 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078186
(SS)C-BOARD v3.8 is Free