• 締切済み

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

みんなの回答

回答No.2

負担金=[点数]*[負割] という式を、負割が200の時は[点数]×3に!  ↓ 負担金=[点数]*IIF([負割]=200, 3, [負割]) ということ? なお、Rounds()は Option Compare Database Option Explicit Public Const 四捨五入 = 0 Public Const 切り捨て = 1 Public Const 切り上げ = 2 と記号定数を利用すると ? Rounds(0.5, 四捨五入) 1 ? Rounds(0.5, 切り捨て) 0 と読みやすく書く事ができます。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは 良く理解出来ていないですが、   If [負割] = 200 Then     X = [点数] * 3     If X > 200 Then       X = 200     Else       If (X Mod 10) < 5 Then         X = X - (X Mod 10)       Else         X = X - (X Mod 10) + 10       End If     End If   ElseIf [負割] < 200 Then  '[負割が200より大きいケースは無い?     X = [点数] * [負割]     If (X Mod 10) < 5 Then       X = X - (X Mod 10)     Else       X = X - (X Mod 10) + 10     End If   End If こういう事でしょうか?

関連するQ&A

  • 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

  • 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))) このように導き出したのですが、関数が正しくありません。 間違っているのがわかる方、いらっしゃったら教えてください。お願いします。

  • [VBA] IFと絶対値の組み合わせ

    テキストボックスを利用して計算する時にIF文を利用しているのですが、以下の条件での計算が上手くいきません。 ・テキストボックスは3つ。オブジェクト名はD1、D2、D ・D1とD2に数値が入力されると同時に計算する(Changeイベント) ・D1は正の値のみを持つ ・D2は正、0、負の値を持つ 上手くいかない部分 ・条件:D2が負の値を取る時、絶対値がD1より大きい場合は計算する。                         D1より小さい場合は計算しない。 構文は下記の通りです。 Private Sub D1_Change() Dim R1 As Single Dim R2 As Single Dim R As Single If IsNumeric(D1) And D1 > 0 And D1 <> "" Then R1 = D1 / 2 Else D = "" Exit Sub End If If IsNumeric(D2) Then Else D = "" Exit Sub End If If D2 = 0 Then R = R1 ElseIf D2 > 0 Then R2 = D2 / 2 R = 1 / (1 / R1 + 1 / R2) ElseIf D2 < 0 Then If Abs(D2) > D1 Then R2 = D2 / 2 R = 1 / (1 / R1 + 1 / R2) Else D = "" Exit Sub End If Else D = "" Exit Sub End If D = Format(R * 2, "##.###") End Sub これで計算すると、D2が負の値で且つ絶対値がD1より大きい時、 If Abs(D2) > D1 Then R2 = D2 / 2 R = 1 / (1 / R1 + 1 / R2) Else D = "" Exit Sub End If の部分でElseの方で計算が進んでしまいます。 (Abs(D2)>D1でなく、D2>D1として計算している?) 何かよい構文はありませんでしょうか?

  • 素数の計算について教えてください

    「2以上の整数を入力すると、入力した数まで素数をすべて表示する。」 どこが間違っているか教えてください!! 5行目あたりからだと思うのですが・・・。 お願いします!! Dim Number As Long If Long.TryParse(TextBox1.Text, Number) AndAlso Number >= 2 Then For i As Integer = 2 To Number Step 1 Dim d As Long = 2 Do Until Number Mod d = 0 d = d + 1 Loop If d = Number Then Label1.Text = " " & i Else Label1.Text = "2以上の整数を入力してください" End If Next End If End Sub

  • Accessレポートで1行おきに色を変える

    Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) FontCount = FontCount + 1 If FontCount Mod 2 = 1 Then Me.Section(0).BackColor = 16777215 Else Me.Section(0).BackColor = 16777164 End If End Sub としてみました。 ですが何らかわりなく… 試しに Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) FontCount = FontCount + 1 If FontCount Mod 2 = 1 Then Me.Section(0).BackColor = 16777215 Else Me.Section(0).BackColor = 16777164 End If MsgBox FontCount End Sub としてみたところずーっと「1」が表示され、変数がかわってないようです。 いったいどこがダメなのでしょうか? 確か以前できたはずなのに…(><)

  • ▲ExcelのVBA▼困っています

    何度もVBAで質問させてもらい助けてもらっています。 懲りずにまた質問ですが… 下のプログラムは"●"が跳ね返るものなのですが… ●の後を■と▲が追うようなプログラムにするには なにを追加すればいいのでしょうか…?; どなたか教えて下さい;;お願いします;; Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim maru As String, yoko As String, tate As String Sub 描画() Cells(X, Y).Value = maru End Sub Sub 削除() Cells(X, Y).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() If yoko = "右" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 30 Then yoko = "左" ElseIf Y = 1 Then yoko = "右" End If If tate = "上" Then X = X + 1 Else X = X - 1 End If If X = 20 Then tate = "下" ElseIf X = 1 Then tate = "上" End If End Sub Sub main() maru = "●" X = 1 Y = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub

  • このVBAソースのどこが間違ってるか教えてください

    Dim csp As Integer 'ストップ Dim css As Integer 'ストップorスタート Sub Quest2() If css = 0 Then css = 1 Quest2a Else cstp = 1 css = 0 End If End Sub Sub Quest2a() Sheets("Sheet1").Select Range("B1:J10").Select Selection.Interior.ColorIndex = x1None Range("a1").Select cstp = 0 Do r = 1: c = 5 For i = 0 To 15 If i < 9 Then Cells(r, c).Interior.ColorIndex = x1None r = r + 1 If i < 5 Then c = c + 1 Else c = c - 1 End If Cells(r, c).Interior.ColorIndex = 3 Else Cells(r, c).Interior.ColorIndex = x1None r = r - 1 If i < 13 Then c = c - 1 Else c = c + 1 End If Cells().Interior.ColorIndex = 3 End If 'タイミング For tm1 = 1 To 1000: For tm2 = 1 To 100: Next If cstp = 1 Then Exit For End If Next DoEvents If cstp = 1 Then Exit For End If If r = 3 And c = 5 Then Cells(r, c).Interior.ColorIndex = x1None End If Next DoEvents If cstp = 1 Then Exit Do End If Loop Cells(10, 9) = Cells(r, c) Cells(10, 9).Interior.ColorIndex = 8 End Sub

  • VBA マイナス表記にも対応するには

    現段階で正の数表記にしていますが 負の数表記にも対応が出来たらと思っております。 どう変更したらよろしいでしょうか? Public Function isAcceptNum(ByVal tgtTxb As MSForms.TextBox) As Boolean '## 数値チェック If tgtTxb.Value = "" Then '空白だったら isAcceptNum = True Exit Function End If Dim chkText As String '文字列型の変数宣言 If IsNumeric(tgtTxb.Value) Then '数値だったら If CDbl(tgtTxb.Value) < 0 Then '負の数値だったら chkText = "正の数値" ElseIf CDbl(tgtTxb.Value) <> Int(tgtTxb.Value) Then '整数じゃなければ chkText = "整数" End If Else '数値じゃなければ chkText = "数値" End If If chkText <> "" Then 'チェックワードがあれば chkText = "'" & tgtTxb.Tag & "'には" & chkText & "を入力してください" 'メッセージを成形 MsgBox chkText, vbOKOnly + vbExclamation, "注意" 'メッセージボックスを出力 Else '正の整数だったら isAcceptNum = True End If End Function

  • ●Excel VBA 配列●教えて下さい

    a~tの文字が順々に文字を追っていくプログラムにしたいと思い 配列を使用したのですが…プログラムが稼動しません、 下記のプログラムでは何が足りないのでしょうか わかる方いたら教えて下さい; 配列の使い方についてアドバイスがあれば そちらも教えていただきたいです…。 '――ここから―― Dim time1 As Integer, time2 As Integer, n As String Dim X As Integer, Y As Integer Dim yoko As String, tate As String Dim suuji (19) As String Sub 描画() Cells(X, Y).Value = suuji End Sub Sub 削除() Cells(X, Y).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() If yoko = "右" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 30 Then yoko = "左" ElseIf Y = 1 Then yoko = "右" End If If tate = "上" Then X = X + 1 Else X = X - 1 End If If X = 20 Then tate = "下" ElseIf X = 1 Then tate = "上" End If End Sub Sub main() suuji (0) = a suuji (1) = b suuji (2) = c suuji (3) = d suuji (4) = e suuji (5) = f suuji (6) = g suuji (7) = h suuji (8) = i suuji (9) = j suuji (10) = k suuji (11) = l suuji (12) = m suuji (13) = n suuji (14) = o suuji (15) = p suuji (16) = q suuji (17) = r suuji (18) = s suuji (19) = t For n = 0 To 19 Cells(X,Y).Value = suuji (n) Next X = 1 Y = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub '――ここまでです―― 何度も同じような質問をさせてもらってすみません;

  • ※VBA配列

    http://oshiete1.goo.ne.jp/qa5196795.htmlで 質問させてもらった者です。質問不足だったため 質問の内容を追加したかったのですが、追加の方法がわからず またこちらで質問させていただきました Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim X1 As Integer, Y1 As Integer Dim X2 As Integer, Y2 As Integer Dim maru As String, yoko As String, tate As String Dim sankaku As String, shikaku As String Sub 描画() Cells(Y2, X2).Value = shikaku Cells(Y1, X1).Value = sankaku Cells(Y, X).Value = maru End Sub Sub 削除() Cells(Y2, X2).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() X2 = X1 Y2 = Y1 X1 = X Y1 = Y If yoko = "右" Then X = X + 1 Else X = X - 1 End If If X = 30 Then yoko = "左" ElseIf X = 1 Then yoko = "右" End If If tate = "上" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 20 Then tate = "下" ElseIf Y = 1 Then tate = "上" End If End Sub Sub main() maru = "●" sankaku = "▲" shikaku = "■" X = 1 Y = 1 X1 = 1 Y1 = 1 X2 = 1 Y2 = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub a~tの文字が、上記のような動きをする プログラムを作成するにはどのように配列を活かせばいいですか? 配列がよくわかっておらず勉強したのですが…使えずにいます;;