プロが教えるわが家の防犯対策術!

MicrsoftAccess2000「見積請求納品システム」を使用しています。
取引先の消費税の計算方法を四捨五入と切り捨てに区別したいです。
以前にも同じ質問をしたのですが、難しい為諦めました・・・。
ですが、やはりシステムの変更が必要なので教えてください!

Module1に以下の式があります。
Public Function funcSG(xCy As Currency) As Currency
If xCy > 0 Then
xCy = Int(xCy + 0.55)
Else
xCy = Int(xCy - 0.55)
End If
funcSG = xCy
End Function

請求書コマンドマクロは以下のようになっています。
マクロ名 計算
アクション 値の代入

アイテム [Forms]![請新フォーム]![消費税額]
式 funcSG([Forms]![請新フォーム]![税抜金額]*0.05)

アイテム [Forms]![請修フォーム]![消費税額]
式 funcSG([Forms]![請修フォーム]![税抜金額]*0.05)

今は全て四捨五入されるようになっていると思うので、切り捨てもできるようにしたいです。
得意先テーブルに消費税区分を設けて区別したいです!
宜しくお願い致します!

A 回答 (24件中1~10件)

消費税の1円未満は切り捨てです四捨五入ではありません

この回答への補足

debukuroさんご指摘ありがとうございます!
現在は以下のようになっているので全て切り捨てです・・・

アイテム [Forms]![請新フォーム]![消費税額]
式 Int(CCur([Forms]![請新フォーム]![税抜金額]*0.05))

アイテム [Forms]![請修フォーム]![消費税額]
式 Int(CCur([Forms]![請修フォーム]![税抜金額]*0.05))

こちらを得意先によって切捨てと四捨五入に振り分ける式にしたいです!

補足日時:2010/04/13 16:59
    • good
    • 0

前のご質問で、どう発展され解決されたのでしょうか。

判断できません。
http://oshiete1.goo.ne.jp/qa5792370.html

他のご質問も同様で、判断できません。

そもそも、今回作ろうとしているものの消費税部分は、0.05 の定数(即値)を使うのでしょうか。

今回作ったものを何年使おうとしていますか?

その間に消費税は変わらないのですか?
変わったとして、過去履歴を見る際に当時の消費税換算のものを見たい等要求は無視しますか?

消費税が変わるまで・・・でOKとしますか?

変わる可能性のある定数は浮かしておくものと、私は考えます。
以下参考になると思います。(消費税率の例になりますが)
ただ、データを整数、実数で持つ、は考え方だと思います

参考QA
http://www.accessclub.jp/bbs/0198/beginers61905. …

この回答への補足

30246kikuさんありがとうございます!!

http://oshiete1.goo.ne.jp/qa5792370.html
上記の質問後には取引先テーブルの項目に「加算」を追加して進める
つもりでしたが、上司と相談した結果、0.5で操作するのは
データ管理や引継ぎなど何かと不安なので、やはり四捨五入を
しているということが分かりやすいやり方で進めようという話に
なっての再度の質問です・・・

今回作ったものはこれからずっと使う予定です。
消費税も変わると思いますし、まだまだ手直しの必要な
システムなので他にも変更箇所が出てくると思います。
変わった際には当時の消費税換算のものを見たいです。

まず参考QAをもとにやってみようと思います!

補足日時:2010/04/13 17:16
    • good
    • 0
この回答へのお礼

アクション 値の代入
アイテム [Forms]![請新フォーム]![消費税額]
式 Int(CCur([Forms]![請新フォーム]![税抜金額]*DLookUp("税率","消費税率","適用日付=#" & DMax("適用日付","消費税率","適用日付<=#" & [Forms]![請新フォーム]![日付] & "#") & "#")))

上記で消費税率テーブルを作り、それと関係させることには成功しました!!
次は客先によって消費税の計算方法(切捨て、四捨五入)を区別したいです!
30246kikuさんありがとうございました!

お礼日時:2010/04/14 16:01

お尋ねしたいこと。



(1)
返品とかの場合はマイナス伝票を
発行されますか。その場合は
現在どのようにされていますか。

(2)
切り上げは考えておられますか。
切り上げが必要な場合があるならば、
切り上げの場合、端数の切り上げ位置は
どこでしますか。
例えば小数点第一で行なうか、あるいは
小数点第二で行なうか、など。

この回答への補足

piroin654さんありがとうございます!!

(1)マイナス伝票は発行しないです!

(2)現在は切り上げの取引先は無いので、端数の切り上げ位置をどこでするかなどは未定です・・・
計算方法などは取引先に決めていただいてるのでどうしたらよろしいでしょうか?

補足日時:2010/04/13 17:26
    • good
    • 0

#2です



頑張っていますね。

関数を用意しても、それを使う/使わない、の判別が必要になりますよね。
この判別が邪魔かな?って思ったので、前回の回答になってました。

> 得意先テーブルに消費税区分を設けて区別したいです
これに従って考えてみると、以下に例)

得意先テーブルに新設する消費税区分(整数型)に
1 : 切り捨て
2 : 四捨五入
3 : ・・・・
という値で意味付けしておきます。(1~の連番にします)

計算したいフィールド名が「金額」だとした場合、

Int(Choose([消費税区分],[金額],funcSG([金額]),XXXXXXX))

XXXXXXX 部分は、消費税区分に3以上があったら記述を追加していきます。


消費税区分を1~の連番にしたのは、Choose を使いたかったから。
ヘルプで機能を見てください。

検証していませんが、こんな感じだったと思います。


また、funcSG の様に関数にしても良いと思います。
その時の引数は、消費税区分、金額 になるのでしょうか。
関数にするのなら、Choose にこだわる必要はありません。


※※
ただ単に、得意先テーブルに消費税区分フィールドを追加しただけでは、
消費税率の様な履歴を見ることができません。
(現時点での適用しかわかりません)
厳密にするのなら、消費税率のように
適用日、得意先ID、消費税区分 などの項目をもったテーブルが必要になると思います。

前回の回答では、この点を考慮したものにはなっていませんでした。
失礼しました。

この回答への補足

30246kikuさんありがとうございます!

得意先テーブルに消費税区分を設けると区別できると他で調べたのでその方法しかないと思っていました・・・
ので「funcSG の様に関数にしても良いと思います。」というような方法があれば教えていただきたいです。

請求書コマンドマクロ
アクション 値の代入
アイテム [forms]![請新フォーム]![消費税額]
式 Int(Choose([消費税区分],CCur([Forms]![請新フォーム]![税抜金額]*0.05),funcSG([Forms]![請新フォーム]![税抜金額]*0.05)))

上記のように変更して請求書を新規作成したところ「このオブジェクトにはオートメーションオブジェクト'消費税区分’は含まれません」というエラーになります。
引数は、消費税区分だと考えて進めているつもりです・・・

宜しくお願いします!!!

補足日時:2010/04/15 17:23
    • good
    • 0

[第一]



お待ちしておりました。ではさっそく。

一応、使うか使わないかは別としてマイナス伝票にも
対応できるようになっています。

テーブルを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

'######ここまで#######

字数制限になったので、分けます。
[第二]へ続く。
    • good
    • 0

[第二]



つぎに、以下のコードを標準モジュールに
はりつけ保存してください。前回は四捨五入
の位置を少数第二位にしていましたが、
少数第一に変更しておきます。したがって、
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により自動計算するのが一番ですが、
それはこれで対応しておいて、ゆっくりシステムを
練り直しをしたら、と思います。
そのときには、当然ながら関数のあり方や税区分の
参照の仕方などは変更するのが当たり前です。
日進月歩、このやり方も踏み台にして前に進んで
ください。

人が何と言おうと自分の考えでやってください。

ということで、これで役に立つか先に確認を。

この回答への補足

piroin654さんありがとうございます!

以下のように変更して進めました。

T得意先を得意先名テーブル
得意先IDを請求先コード

請修フォームには得意先コードはなく、得意先コードとリレーションシップ?で繋がっている請求先コード(請求明細テーブル)がありました。

得意先テーブルで該当得意先に四捨五入を入力して請修フォームを開き値を代入しましたが切り捨ての値が出ました。
切捨ての得意先の場合は今までどおり切捨てで計算されます。
請求先コードで対応したのがいけないのでしょうか??

補足日時:2010/04/19 16:25
    • good
    • 0

第二のコードの中の説明文が入れ替わっていました。


訂正しておきます。

切捨て
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

この回答への補足

piroin654さん

税計算ボタンを押すのを忘れていたので申し訳ございません。
税計算ボタンを押したところ以下のエラーが出ました。

実行時エラー'3070':
'請求先コード'を有効なフィールド名、または式として認識できません。

やはり請求先コードがいけないようなので、得意先コードに変更したところ以下のエラーがでました。

実行時エラー'2465':
指定した式で参照されている'得意先コード'フィールドが見つかりません。

フォームを変える必要があるのでしょうか??

補足日時:2010/04/19 16:50
    • good
    • 0

第二のコードの中の説明文が入れ替わっていました。


訂正しておきます。

'切捨て
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
    • good
    • 0
この回答へのお礼

回答番号: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’:
’請求先コード’を有効なフィールド名、または式として認識できません。

宜しくお願い致します!!!!

お礼日時:2010/04/20 17:38

大事なことを書き忘れていました。


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

それから、回答が二重に登録されてしまいました。
すみません。
    • good
    • 0
この回答へのお礼

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’:
’請求先コード’を有効なフィールド名、または式として認識できません。

お礼日時:2010/04/20 17:16

#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) 等の処理を記述しても良いと思います。
記述する処理内容は、客先提示ということみたいなので、それに従ってください。


これで回答になったでしょうか。
    • good
    • 0
この回答へのお礼

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のとらえ方が間違っていますか?

お礼日時:2010/04/20 13:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!