• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:取引先の消費税の計算方法を四捨五入と切り捨てに区別)

取引先の消費税の計算方法を四捨五入と切り捨てに区別

このQ&Aのポイント
  • MicrsoftAccess2000「見積請求納品システム」を使用しています。取引先の消費税の計算方法を四捨五入と切り捨てに区別したいです。
  • Module1には四捨五入するための式がありますが、切り捨てもできるようにしたいです。
  • 請求書コマンドマクロでは消費税額を計算していますが、得意先テーブルに消費税区分を設けて区別したいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.12

#10です 以下2つの関数を標準モジュールに用意したとします。 Public Function TaxInterPre(iNum As Variant, cVal As Variant) As Currency   On Error Resume Next   TaxInterPre = 0   If (IsNull(iNum) Or IsNull(cVal)) Then Exit Function   Select Case iNum     Case 1         TaxInterPre = Int(cVal)     Case 2         TaxInterPre = funcSG(cVal)   End Select End Function Public Function funcSG(ByVal xCy As Currency) As Currency   If xCy > 0 Then     xCy = Int(xCy + 0.5)   Else     xCy = Int(xCy - 0.5)   End If   funcSG = xCy End Function 使い方は、式のところに、TaxInterPre(消費税区分, 消費税額) を記述します。 TaxInterPre(Null, 1234.56) や TaxInterPre(1, Null) の時には、0 が返ります。 TaxInterPre(1, 1234.56) の場合は、1234 が返ります。 TaxInterPre(2, 1234.56) の場合は、1235 が返ります。 さて、ここからですが、 TaxInterPre(消費税区分, 消費税額) を利用する時に、 何を参照して何を使って利用できるか・・・を考えていきます。 【消費税区分】 ・フォームに参照できるものがあったとき  それを参照するようにします。   例えば、フォーム「F_親」に「税区分」名のテキストボックスがあったら、   TaxInterPre([Forms]![F_親]![税区分], 消費税額) ・フォームに参照するものが無く、得意先名しかわからないとき  その得意先名の税区分を DLookup 等で求めます。  消費税率の様なテーブル構成ではなく、単に得意先名テーブルに項目を追加しただけであれば、   DLookup("税区分","得意先名テーブル","得意先名='" & [Forms]![F_親]![得意先名] & "'")   この DLookup の記述を ※1 とした場合、   TaxInterPre(※1, 消費税額)   フォーム上に参照できるものがあれば、・・・・と思います。 【消費税額】 ・参照されるものがあるようですので、それを記述します。  TaxInterPre(消費税区分, [Forms]![請新フォーム]![税抜金額]*0.05)   0.05 即値を使った例ですが。 後は、状況に応じて、何を参照して、何を使って・・・・を考えられればと思います。 関数名は適宜変更してください。

noname#137913
質問者

お礼

30246kikuさんありがとうございます! 得意先名テーブルに消費税区分フィールドを作りデータ型は数値型(整数型)にしました。 その後以下のようにモジュールを作りました。 Public Function TaxInterPre(DLookup("消費税区分","得意先名テーブル","得意先名='" & [Forms]![請修フォーム]![得意先名] & "'") As Variant, [Forms]![請修フォーム]![税抜金額]*0.05 As Variant) As Currency On Error Resume Next TaxInterPre = 0 If (IsNull(DLookup("消費税区分", "得意先名テーブル", "得意先名='" & [Forms]![請修フォーム]![得意先名] & "'")) Or IsNull([Forms]![請修フォーム]![税抜金額] * 0.05)) Then Exit Function Select Case DLookup("消費税区分", "得意先名テーブル", "得意先名='" & [Forms]![請修フォーム]![得意先名] & "'") Case 1 TaxInterPre = Int([Forms]![請修フォーム]![税抜金額] * 0.05) Case 2 TaxInterPre = funcSG([Forms]![請修フォーム]![税抜金額] * 0.05) End Select End Function Public Function TaxInterPre(DLookup("消費税区分","得意先名テーブル","得意先名='" & [Forms]![請新フォーム]![得意先名] & "'") As Variant, [Forms]![請新フォーム]![税抜金額]*0.05 As Variant) As Currency On Error Resume Next TaxInterPre = 0 If (IsNull(DLookup("消費税区分", "得意先名テーブル", "得意先名='" & [Forms]![請新フォーム]![得意先名] & "'")) Or IsNull([Forms]![請新フォーム]![税抜金額] * 0.05)) Then Exit Function Select Case DLookup("消費税区分", "得意先名テーブル", "得意先名='" & [Forms]![請新フォーム]![得意先名] & "'") Case 1 TaxInterPre = Int([Forms]![請新フォーム]![税抜金額] * 0.05) Case 2 TaxInterPre = funcSG([Forms]![請新フォーム]![税抜金額] * 0.05) End Select End Function Public Function funcSG(ByVal xCy As Currency) As Currency If xCy > 0 Then xCy = Int(xCy + 0.5) Else xCy = Int(xCy - 0.5) End If funcSG = xCy End Function そうすると Public Function TaxInterPre(DLookup("消費税区分","得意先名テーブル","得意先名='" & [Forms]![請修フォーム]![得意先名] & "'") As Variant, [Forms]![請修フォーム]![税抜金額]*0.05 As Variant) As Currency と Public Function TaxInterPre(DLookup("消費税区分","得意先名テーブル","得意先名='" & [Forms]![請新フォーム]![得意先名] & "'") As Variant, [Forms]![請新フォーム]![税抜金額]*0.05 As Variant) As Currency の部分が赤くなり両方とも "消費税区分" の部分が反転し、 コンパイルエラー: 修正候補:) となります。請修・請新フォームに消費税区分テキストボックスを追加できずに上記の方法にしました! 宜しくお願いします!

その他の回答 (23)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.14

piroin654さん お疲れ様です。 今現在(4/23 21:25)、教えて!goo では回答13を見ることはできません。 OKWave からだと、18:15:14 の投稿(回答)があったとわかります。 質問者さんは、コピペで動くものを欲していると思われ・・・ 消費税率のテーブルはどうなった。 消費税区分情報を、 どこに、 どう持った か・・・を聞き出さないことには先に進まないような気がします。 フォームの構成についてもしかりです。 ※ 提案の階層こそ違いますが、私も勉強させてもらってます。 ただ、途中で Exit するのなら、以前で OpenRecordset は意味無いような気がします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.13

遅れてすみません。 補足ありがとうございます。提案したプログラムは あくまでも得意先テーブルを参照する構造になって いるのでフォームに税区分のフィールドを追加する 必要はありません。フォームに必要なのは得意先 テーブルに登録されている得意先コードです。 この得意先コードをたよりに得意先テーブルを 検索する構造になっています。税区分のデータは 得意先テーブルに登録されているからです。 ※得意先と請求先の区別について 販売管理の現場ではときには得意先から注文を 受け取り、請求先は得意先ではなく別の請求先 にしてくれ、ということはあります。たとえば、 支社から注文を受け取り、請求は本社へ、その 場合、受注確認は支社名と本社名2通、請求書は 本社名で、というようなことはあります。一概に 得意先と請求先を区別したということは間違いでは ありません。 このような場合は既存の得意先テーブルに得意先と 同じレコードに請求先を登録し、請求先は同じ 得意先テーブルに登録し、得意先と請求先が 同じ場合は請求先コードのフィールドに同じ 得意先コードを登録する。 あるいは同じレコードに別請求先というフィールドを作り、 有り、無しを登録し、有りならば別請求先テーブルに 得意先コードに対し複数の請求先が存在するならば そのように登録するテーブル設計にし、運用する というような方法もあります。 ただ、必ず得意先コードと請求先コードが関連付け られるようにしておきます。 いずれにしろ得意先と請求先を作ったことは いいのですが、今回の場合はそのことを残して 改良するか、あるいは請求先コードを 得意先コードに一元化するかのどちらかです。 いただいた補足をもとにいろいろシュミレーションを してみました。シュミレーションの内容をすべて 書くと混乱するので、まず一つだけします。 その前に、以下を確認をさせてください。 (1) 請求先コードは請求テーブルのみにあるのでしょうか。 (2) 得意先コードと請求先コードが一緒に書かれている テーブルはありますか。たとえば請求明細をつくる とき、請求明細の請求先は得意先コードから 得意先名を割り出し、それを請求先名にしているのか。 あるいは名前そのものを比べているのか。 (3) (2)がない場合、請求先と得意先を結びつける のはどのようにしておられますか。 たとえば、請求先コードと得意先コードを何処で 結び付けてるのか。 たとえば請求明細をつくるとき、請求明細の 請求先は得意先コードから得意先名を割り出し、 それを請求先名にしているのか。 あるいは名前そのものを比べているのか。 請求先コードから得意先コードをたどる方法は ありますか。 (4) 請求明細は納品明細を兼ねているのでしょうか。 請求明細は一時的にデータを格納するものですか。 前回の質問と重複すかもしれませんが、 以上を確認させてください。

noname#137913
質問者

補足

piroin654さんありがとうございます! (1) 請求先コードは請求明細テーブルのみにあります。 (2) 得意先コードと請求先コードが一緒に書かれているテーブルはありません。 請新(請求書新規作成)フォームと請修(請求書修正)フォームで 操作する時は得意先名テーブルから選び請求明細テーブルにレコードが保存されます。 以下のようになっていました。 コントロールソース:請求先コード 値集合ソース:得意先名テーブル (3) (2)の答えで大丈夫ですか? (4) 納品明細テーブルは他にあります。 請求明細はデータを格納していますが、一時的にとはどうゆうことでしょうか (><) 的を得た答えでなかったら申し訳ありません。 宜しくお願いします!

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.11

ボタンクリックの機能はしているようなのですが、 テーブルの指定、得意先コード、請求先コード のコンビネーションが取れていないようなので それを解消すればと思います。もう、ちょいと のところまで来ているのですが。 えーっと、請新フォームと請修フォームの違いは よくわからないのですが、請新フォームと請修フォーム のレコードソースはそれぞれ違うようで、少し 教えてください。 (1) 請新フォームのレコードソース(テーブル名ORクエリのそれぞれの内容) と、そのレコードソースに税区分のフィールドの有無。 請新フォームにあるのは得意先IDまたは請求先ID? 請新フォームの役割は? (2) 同じく、請修フォームについて。 (3) ボタンを請新フォームに取り付けコードを貼り付け、 税計算_Click()のコードの一部を修正するとき、 >Set rs = db.OpenRecordset("T得意先", dbOpenDynaset) >If IsNull([Forms]![請修フォーム]![得意先ID]) Then >MsgBox ("得意先IDが入力されていません") >rs.FindFirst "得意先ID=" & [Forms]![請修フォーム]![得意先ID] などの、T得意先、得意先ID、請修フォームは、得意先テーブル、得意先コード 請新フォームなどに変更しますが、そのとき請新フォームには得意先コード が表示されていればOKです。そして、得意先テーブルに税区分フィールドが あれば機能するはずです。 (4) ボタンを請修フォームに取り付けコードを貼り付け、 税計算_Click()のコードの一部を修正するとき、 >Set rs = db.OpenRecordset("T得意先", dbOpenDynaset) >If IsNull([Forms]![請修フォーム]![得意先ID]) Then >MsgBox ("得意先IDが入力されていません") >rs.FindFirst "得意先ID=" & [Forms]![請修フォーム]![得意先ID] などの、T得意先、得意先IDは得意先テーブル、得意先コードにすれば いいのですが、もし請修フォームのレコードソースが得意先テーブル ではなく、請求先テーブル(あるいは別名)になっていて請修フォーム には得意先コードではなく請求先コードがあるのならばフォームを変更 するのは大変なので、請求先テーブルに税区分フィールドを作り、同じように 四捨五入と切捨てを入れると同じように機能します。 その場合は、コードはT得意先が請求先テーブル、得意先IDは請求先コードに 変更します。この状況はあくまで推測なのでフォームのレコードソース 、フォームのテキストボックスなどの状況により変更することになります。 得意先テーブルと請求先テーブル(あるいは別名)の関係とそれぞれの フィールド(特に得意先コード、請求先コードがそれぞれのテーブルに どのように配置されているか)が判ればフォームを手直しするか、 あるいはテーブルに税区分を追加するかで対応ができます。 将来を見据えれば、あまり小手先の変更は禍根を残すので、 そのあたりはよく考えます。 それと、 (5) 四捨五入、切捨てのデータはどのフォーム、 で出すのがいいのでしょうか。 請新フォーム、請修フォームそれぞれで必要? あるいはどちらかで四捨五入、切捨ての データが取得できればいい?

noname#137913
質問者

お礼

piroin654さんありがとうございます! 以下のことを確認しましたのでご協力お願いします。 (1)請新フォーム    レコードソース 請求書明細クエリー 税区分フィールドを追加しました。 請求先コードがあります。 役割 請求書新規作成 (2)請修フォーム    レコードソース 請求書指定明細クエリー 税区分フィールドを追加しました。 請求先コードがあります。 役割 請求書修正 (3)T得意先→得意先名テーブル 得意先ID→請求先コード    請新フォームに得意先コードは表示されていません。    得意先テーブルには税区分フィールドがあります。 (4)請求先コードがある請求明細テーブルの主キーが請求書番号なので税区分フィールドを作っても 会社ごとに区別することができません。 請求書明細クエリーと請求書指定明細クエリーの中身は(振込先名テーブル、 得意先名テーブル、請求明細テーブル、担当者名テーブル、請求内容テーブル) 得意先コードは得意先名テーブルの中にあります。 請求先コードは請求明細テーブルの中にあります。 (5)データはそれぞれのフォームで必要です。 初心者なので請求先コードをどうして作ったのかわかりません。 宜しくお願いします!!!!

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.10

#4です 標準モジュールに Public Function で関数作れば、 クエリ、VBA、マクロから呼び出して利用することができます。 特にクエリから使う場合は、動き切ることを私は考えます。(MsgBox等は書かない) 今回の場合の基本形は以下の様になると思います。 Public Function XXXXXX(p1, p2) As Variant   On Error Resume Next   XXXXXX = Null   If (IsNull(p1) Or IsNull(p2)) Then Exit Function   Select Case p1     Case 1         XXXXXX = p2     Case 2         XXXXXX = funcSG(p2)   End Select End Function p1 が区分、p2 が金額。 Select Case が Choose の代わりになります。 【p1区分】 クエリ等から呼ばれる時、不一致クエリなどにより NULL が考えられるのであれば、 引数の型は Variant になると思いますし、長整数しかない、、であれば Long で 【p2金額】 これも同様になります。(通貨しかない、、であれば Currency) 【戻り値】 必ず通貨を返す、、なら、As Currency に変更します。 NULL を返す様にするなら、呼ぶ側でも Int(Nz(XXXXXX(yy,zz),0)) のように NULL 対策が必要になります。 両方とも NULL はない、とすると基本形(変数名は変えてください)は、 Public Function XXXXXX(iNum As Long, cVal As Currency) As Currency   On Error Resume Next   Select Case iNum     Case 2         XXXXXX = funcSG(cVal)     Case Else         XXXXXX = cVal   End Select End Function Select Case の書き方を変えてみましたが、後者は iNum = 2 のみを特別扱い。 iNum が 1 でも 3 でも処理しない値を返すものです。 ただ、この書き方は潜在的バグを作るものにもなります。 iNum が 1, 2 しかない時に、3 でも 1 として動くので、 新しく iNum = 3 の処理を追加した際、従来の様には動かなくなります。 前者の例では、 iNum = 3 の時には NULL が返ります。 Public Function XXXXXX(iNum As Long, cVal As Currency) As Currency   On Error Resume Next   Select Case iNum     Case 1         XXXXXX = cVal     Case 2         XXXXXX = funcSG(cVal)     Case Else         XXXXXX = 0   End Select End Function とかにしておいた方が、潜在的バグは減ると思います。 (iNum が範囲外なら 0 にするかは、仕様になると思います) 発展形)呼ぶ側で必ず Int しているのなら、Int 後の値を返せば・・・ Public Function YYYYYY(iNum As Long, cVal As Currency) As Long   Dim cTmp As Currency   On Error Resume Next   Select Case iNum     Case 1         cTmp = cVal     Case 2         cTmp = funcSG(cVal)     Case Else         cTmp = 0   End Select   YYYYYY = Int(cTmp) End Function とか Public Function ZZZZZZ(iNum As Long, cVal As Currency) As Long   On Error Resume Next   ZZZZZZ = Int(XXXXXX(iNum, cVal)) End Function とか 蛇足) Public Function funcSG(xCy As Currency) As Currency     xCy = Int(xCy + 0.5)     ・・・・ のような記述(引数の変数名を中間処理に使用)すると、 呼び出した側の xCy の内容が書き変わります。 書き換えないようにするには、 Public Function funcSG(ByVal xCy As Currency) As Currency のように、ByVal を宣言しておきます。 x = 1234.56 y = funcSG(x) Debug.Print x & vbTab & y として、ByVal のありなしでの結果を確認してみてください。 funcSG 部分を展開して、XXXXXX = Int(cVal + 0.5) 等の処理を記述しても良いと思います。 記述する処理内容は、客先提示ということみたいなので、それに従ってください。 これで回答になったでしょうか。

noname#137913
質問者

お礼

30246kikuさんありがとうございます! 以下のようにしました。 アクション 値の代入 アイテム [Forms]![請新フォーム]![消費税額] 式 CCur([Forms]![請新フォーム]![税抜金額]*0.05) 得意先テーブル 消費税区分 整数型 Public Function XXXXXX([得意先名テーブル]![消費税区分] , [forms]![請新フォーム]![消費税額]) As Variant On Error Resume Next XXXXXX Null If (IsNull([得意先名テーブル]![消費税区分]) Or IsNull([Forms]![請新フォーム]![消費税額])) Then Exit Function Select Case [得意先名テーブル]![消費税区分] Case 1 XXXXXX = Int([Forms]![請新フォーム]![消費税額]) Case 2 XXXXXX = funcSG([Forms]![請新フォーム]![消費税額]) End Select End Function Public Function funcSG(ByVal sCy As Currency) As Currency If xCy > 0 Then xCy = Int(xCy + 0.5) Else xCy = Int(xCy - 0.5) End If funcSG = xCy End Function こうすると"Public Function XXXXXX([得意先名テーブル]![消費税区分] , [forms]![請新フォーム]![消費税額]) As Variant"の部分が赤くなり"[得意先名テーブル]"が反転して コンパイル エラー: 修正候補:識別子 となります。 p1p2とXXXXXXのとらえ方が間違っていますか?

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

大事なことを書き忘れていました。 コード表を表示し、ツールバーのツールから 参照設定を選択し、Microsoft DAO の最上位に チェックをいれてください。入っていれば そのままでいいです。 もし、Microsoft ActiveX Data Objects 2x Library にチェックが入っていたらはずしてください。 2xは2.1とか2.いくらの数値でAccessのバージョンに よって違います。 それから、回答が二重に登録されてしまいました。 すみません。

noname#137913
質問者

お礼

piroin654さんありがとうございます! 現在得意先名テーブルと請新フォームは以下のようになっています。 得意先名テーブル 得意先コード テキスト型 得意先名 テキスト型 略称 テキスト型 郵便番号 テキスト型 住所1 テキスト型 住所2 テキスト型 電話番号 テキスト型 振込先コード テキスト型 税区分 テキスト型 (税区分には切捨てか四捨五入が必ず入っています。) 請新フォーム レコードソース:請求書明細クエリー(税区分あり) コマンドボタン:税計算 コード Private Sub 税計算_Click() Dim x As Currency Dim db As Database Dim rs As Recordset Dim kubun As String Set db = CurrentDb Set rs = db.OpenRecordset("得意先名テーブル", dbOpenDynaset) '請新フォームに所定のデータがあるか確認 If IsNull([Forms]![請新フォーム]![請求先コード]) Then MsgBox ("請求先コードが入力されていません") '計算中止 Exit Sub End If If IsNull([Forms]![請新フォーム]![税抜金額]) Then MsgBox ("税抜金額が入力されていません") '計算中止 Exit Sub End If '請新フォームの請求先コードと一致するテーブルのレコードを検索 rs.FindFirst "請求先コード=" & [Forms]![請新フォーム]![請求先コード] '見つかった場合 If Not rs.NoMatch Then If Not IsNull(rs!税区分) Then Select Case rs!税区分 Case "四捨五入" '消費税率は0.05としています。消費税率が変われば変更してください。 x = funcSG([Forms]![請新フォーム]![税抜金額] * 0.05) Case "切捨て" '消費税率は0.05としています。消費税率が変われば変更してください。 x = funcKS([Forms]![請新フォーム]![税抜金額] * 0.05) Case Else MsgBox ("税区分の区別が正しくありません") GoTo ER_HA End Select Else MsgBox ("税区分に入力がありません") GoTo ER_HA End If '見つからなかった場合 Else MsgBox ("指定の請求先コードが見つかりません") End If [Forms]![請新フォーム]![消費税額] = x ER_HA: rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub '切捨て Public Function funcKS(xCy As Currency) As Currency '正数の場合は切り捨て If xCy > 0 Then xCy = Int(xCy) '負数の場合は切り上げ。切捨てにすると会社が損します。 '相手先にマイナス伝票の場合は切り上げとすることを交渉。 'これが普通 Else xCy = Fix(xCy) End If funcKS = xCy End Function '四捨五入 Public Function funcSG(xCy As Currency) As Currency '正数の場合 If xCy > 0 Then xCy = Int(xCy + 0.5) '負数の場合 Else xCy = Int(xCy - 0.5) End If funcSG = xCy End Function 税計算ボタンをクリックすると以下のエラーになります。 実行時エラー’3070’: ’請求先コード’を有効なフィールド名、または式として認識できません。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.8

第二のコードの中の説明文が入れ替わっていました。 訂正しておきます。 '切捨て Public Function funcKS(xCy As Currency) As Currency '正数の場合は切り捨て If xCy > 0 Then xCy = Int(xCy) '負数の場合は切り上げ。切捨てにすると会社が損します。 '相手先にマイナス伝票の場合は切り上げとすることを交渉。 'これが普通 Else xCy = Fix(xCy) End If funcKS = xCy End Function '四捨五入 Public Function funcSG(xCy As Currency) As Currency '正数の場合 If xCy > 0 Then xCy = Int(xCy + 0.5) '負数の場合 Else xCy = Int(xCy - 0.5) End If funcSG = xCy End Function

noname#137913
質問者

お礼

回答番号:No.9の続きです。 請修フォーム レコードソース:請求書指定明細クエリー(税区分あり) コマンドボタン:税計算 コード Private Sub 税計算_Click() Dim x As Currency Dim db As Database Dim rs As Recordset Dim kubun As String Set db = CurrentDb Set rs = db.OpenRecordset("得意先名テーブル", dbOpenDynaset) '請修フォームに所定のデータがあるか確認 If IsNull([Forms]![請修フォーム]![請求先コード]) Then MsgBox ("請求先コードが入力されていません") '計算中止 Exit Sub End If If IsNull([Forms]![請修フォーム]![税抜金額]) Then MsgBox ("税抜金額が入力されていません") '計算中止 Exit Sub End If '請修フォームの請求先コードと一致するテーブルのレコードを検索 rs.FindFirst "請求先コード=" & [Forms]![請修フォーム]![請求先コード] '見つかった場合 If Not rs.NoMatch Then If Not IsNull(rs!税区分) Then Select Case rs!税区分 Case "四捨五入" '消費税率は0.05としています。消費税率が変われば変更してください。 x = funcSG([Forms]![請修フォーム]![税抜金額] * 0.05) Case "切捨て" '消費税率は0.05としています。消費税率が変われば変更してください。 x = funcKS([Forms]![請修フォーム]![税抜金額] * 0.05) Case Else MsgBox ("税区分の区別が正しくありません") GoTo ER_HA End Select Else MsgBox ("税区分に入力がありません") GoTo ER_HA End If '見つからなかった場合 Else MsgBox ("指定の請求先コードが見つかりません") End If [Forms]![請修フォーム]![消費税額] = x ER_HA: rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub '切捨て Public Function funcKS(xCy As Currency) As Currency '正数の場合は切り捨て If xCy > 0 Then xCy = Int(xCy) '負数の場合は切り上げ。切捨てにすると会社が損します。 '相手先にマイナス伝票の場合は切り上げとすることを交渉。 'これが普通 Else xCy = Fix(xCy) End If funcKS = xCy End Function '四捨五入 Public Function funcSG(xCy As Currency) As Currency '正数の場合 If xCy > 0 Then xCy = Int(xCy + 0.5) '負数の場合 Else xCy = Int(xCy - 0.5) End If funcSG = xCy End Function コマンドボタンをクリックすると以下のエラーになります。 実行時エラー’3070’: ’請求先コード’を有効なフィールド名、または式として認識できません。 宜しくお願い致します!!!!

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.7

第二のコードの中の説明文が入れ替わっていました。 訂正しておきます。 切捨て Public Function funcKS(xCy As Currency) As Currency '正数の場合は切り捨て If xCy > 0 Then xCy = Int(xCy) '負数の場合は切り上げ。切捨てにすると会社が損します。 '相手先にマイナス伝票の場合は切り上げとすることを交渉。 'これが普通 Else xCy = Fix(xCy) End If funcKS = xCy End Function '四捨五入 Public Function funcSG(xCy As Currency) As Currency '正数の場合 If xCy > 0 Then xCy = Int(xCy + 0.5) '負数の場合 Else xCy = Int(xCy - 0.5) End If funcSG = xCy End Function

noname#137913
質問者

補足

piroin654さん 税計算ボタンを押すのを忘れていたので申し訳ございません。 税計算ボタンを押したところ以下のエラーが出ました。 実行時エラー'3070': '請求先コード'を有効なフィールド名、または式として認識できません。 やはり請求先コードがいけないようなので、得意先コードに変更したところ以下のエラーがでました。 実行時エラー'2465': 指定した式で参照されている'得意先コード'フィールドが見つかりません。 フォームを変える必要があるのでしょうか??

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

[第二] つぎに、以下のコードを標準モジュールに はりつけ保存してください。前回は四捨五入 の位置を少数第二位にしていましたが、 少数第一に変更しておきます。したがって、 0.55が0.5になっています。 '切捨て Public Function funcKS(xCy As Currency) As Currency '正数の場合は切り捨て If xCy > 0 Then xCy = Int(xCy) '負数の場合は切り上げ Else xCy = Fix(xCy) End If funcKS = xCy End Function '四捨五入 Public Function funcSG(xCy As Currency) As Currency '正数の場合 If xCy > 0 Then xCy = Int(xCy + 0.5) '負数の場合は切り上げ。切捨てにすると会社が損します。 '相手先にマイナス伝票の場合は切り上げとすることを交渉。 'これが普通 Else xCy = Int(xCy - 0.5) End If funcSG = xCy End Function 現状を考え、一応これで税区分に対応できます。 本来は、顧客IDにより自動計算するのが一番ですが、 それはこれで対応しておいて、ゆっくりシステムを 練り直しをしたら、と思います。 そのときには、当然ながら関数のあり方や税区分の 参照の仕方などは変更するのが当たり前です。 日進月歩、このやり方も踏み台にして前に進んで ください。 人が何と言おうと自分の考えでやってください。 ということで、これで役に立つか先に確認を。

noname#137913
質問者

補足

piroin654さんありがとうございます! 以下のように変更して進めました。 T得意先を得意先名テーブル 得意先IDを請求先コード 請修フォームには得意先コードはなく、得意先コードとリレーションシップ?で繋がっている請求先コード(請求明細テーブル)がありました。 得意先テーブルで該当得意先に四捨五入を入力して請修フォームを開き値を代入しましたが切り捨ての値が出ました。 切捨ての得意先の場合は今までどおり切捨てで計算されます。 請求先コードで対応したのがいけないのでしょうか??

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

[第一] お待ちしておりました。ではさっそく。 一応、使うか使わないかは別としてマイナス伝票にも 対応できるようになっています。 テーブルをT得意先とします。テーブルには得意先ID、 税区分があるとします。税区分は、 四捨五入、切捨て のどちらかが入力されているものとします。 請修フォームには名前が得意先IDと、税抜金額、 消費税額、三つのテキストボックスがあるものとします。 一応、請修フォームの名前が消費税額のテキストボックスに 税額を表示するという形をとります。 請修フォームにコマンドボタンを一つ作ります。その ボタンの名前を税計算とします。 請修フォームのデザインビューからツールバーのコード をクリックします。そのコード表に以下のコードを 貼り付け、保存してください。保存後、請修フォーム のデザインビューからボタンのプロパティを選択して、 クリック時の項にイベントプロシージャが登録されているか 確認してください。登録されていなければ、右端をクリックして コードを選択してください。これで登録されると 思います。 '###ここから############### Private Sub 税計算_Click() Dim x As Currency Dim db As Database Dim rs As Recordset Dim kubun As String Set db = CurrentDb Set rs = db.OpenRecordset("T得意先", dbOpenDynaset) '請修フォームに所定のデータがあるか確認 If IsNull([Forms]![請修フォーム]![得意先ID]) Then MsgBox ("得意先IDが入力されていません") '計算中止 Exit Sub End If If IsNull([Forms]![請修フォーム]![税抜金額]) Then MsgBox ("税抜金額が入力されていません") '計算中止 Exit Sub End If '請修フォームの得意先IDと一致するテーブルのレコードを検索 rs.FindFirst "得意先ID=" & [Forms]![請修フォーム]![得意先ID] '見つかった場合 If Not rs.NoMatch Then If Not IsNull(rs!税区分) Then Select Case rs!税区分 Case "四捨五入" '消費税率は0.05としています。消費税率が変われば変更してください。 x = funcSG([Forms]![請修フォーム]![税抜金額] * 0.05) Case "切捨て" '消費税率は0.05としています。消費税率が変われば変更してください。 x = funcKS([Forms]![請修フォーム]![税抜金額] * 0.05) Case Else MsgBox ("税区分の区別が正しくありません") GoTo ER_HA End Select Else MsgBox ("税区分に入力がありません") GoTo ER_HA End If '見つからなかった場合 Else MsgBox ("指定の得意先IDが見つかりません") End If [Forms]![請修フォーム]![消費税額] = x ER_HA: rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub '######ここまで####### 字数制限になったので、分けます。 [第二]へ続く。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#2です 頑張っていますね。 関数を用意しても、それを使う/使わない、の判別が必要になりますよね。 この判別が邪魔かな?って思ったので、前回の回答になってました。 > 得意先テーブルに消費税区分を設けて区別したいです これに従って考えてみると、以下に例) 得意先テーブルに新設する消費税区分(整数型)に 1 : 切り捨て 2 : 四捨五入 3 : ・・・・ という値で意味付けしておきます。(1~の連番にします) 計算したいフィールド名が「金額」だとした場合、 Int(Choose([消費税区分],[金額],funcSG([金額]),XXXXXXX)) XXXXXXX 部分は、消費税区分に3以上があったら記述を追加していきます。 ※ 消費税区分を1~の連番にしたのは、Choose を使いたかったから。 ヘルプで機能を見てください。 検証していませんが、こんな感じだったと思います。 また、funcSG の様に関数にしても良いと思います。 その時の引数は、消費税区分、金額 になるのでしょうか。 関数にするのなら、Choose にこだわる必要はありません。 ※※ ただ単に、得意先テーブルに消費税区分フィールドを追加しただけでは、 消費税率の様な履歴を見ることができません。 (現時点での適用しかわかりません) 厳密にするのなら、消費税率のように 適用日、得意先ID、消費税区分 などの項目をもったテーブルが必要になると思います。 前回の回答では、この点を考慮したものにはなっていませんでした。 失礼しました。

noname#137913
質問者

補足

30246kikuさんありがとうございます! 得意先テーブルに消費税区分を設けると区別できると他で調べたのでその方法しかないと思っていました・・・ ので「funcSG の様に関数にしても良いと思います。」というような方法があれば教えていただきたいです。 請求書コマンドマクロ アクション 値の代入 アイテム [forms]![請新フォーム]![消費税額] 式 Int(Choose([消費税区分],CCur([Forms]![請新フォーム]![税抜金額]*0.05),funcSG([Forms]![請新フォーム]![税抜金額]*0.05))) 上記のように変更して請求書を新規作成したところ「このオブジェクトにはオートメーションオブジェクト'消費税区分’は含まれません」というエラーになります。 引数は、消費税区分だと考えて進めているつもりです・・・ 宜しくお願いします!!!

関連するQ&A