メールマガジン【アクセスで作るシリーズ】


バックナンバー 【会計ソフト編】 Vol.34
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

    ACCESSで作るシリーズ  【会計ソフト編】

    発 行 : Yoshihisa Fukuda          2000.11.25 Vol.34

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------

今回は、青色申告決算書のフォーム作成の集計プログラム作成の続きです。

== ◇ 第3章 帳票       ====================

--------------------------------------
3-3 青色申告決算書
--------------------------------------
--------------------------------------
3-3-2 フォーム作成(続き)
--------------------------------------
前回は貸借対照表の集計サブルーチンを作成しました。

今回は損益計算書の集計サブルーチンを作成します。

1.青色申告決算書のフォームをデザインビューで開きます。
2.メニューの[表示]-[コード]を選択し、モジュールウィンドウを開きます。
3.カーソルをモジュールウィンドウの一番下(何もない所)まで移動し、以下の
  ように入力したらエンターキーを押します。
  Private Function PLCalc()
4.すると一行空いて、その下に End Function と自動的に表示されます。
5.このサブルーチン(Private Function PLCalc() と End Function の間)の
  中に以下のコードを記述します。

Dim ACC_DB As Database
Dim Base_T As Recordset
Dim Kamo_T As Recordset
Dim PL_T As Recordset
Dim KariTotal As Currency
Dim KasiTotal As Currency
Dim FindDate As String
Dim FindStr As String
Dim I As Integer
Dim FieldName As String

FindDate = "DenpyoDate >= #" & Me![StartDate] & "# AND DenpyoDate <= #" & _
      Me![EndDate] & "# AND "

Set ACC_DB = CurrentDb
Set Kamo_T = ACC_DB.OpenRecordset("KamokuTable")
Set Base_T = ACC_DB.OpenRecordset("BaseTable")
Set PL_T = ACC_DB.OpenRecordset("PLTable", dbOpenDynaset)

Base_T.MoveFirst
Kamo_T.MoveFirst

PL_T.AddNew

PL_T.Fields("Address1").Value = Base_T.Fields("Address1").Value
PL_T.Fields("Address2").Value = Base_T.Fields("Address2").Value
PL_T.Fields("Syozai1").Value = Base_T.Fields("Syozai1").Value
PL_T.Fields("Syozai2").Value = Base_T.Fields("Syozai2").Value
PL_T.Fields("Gyousyu").Value = Base_T.Fields("Gyousyu").Value
PL_T.Fields("Yagou").Value = Base_T.Fields("Yagou").Value
PL_T.Fields("Kana").Value = Base_T.Fields("Kana").Value
PL_T.Fields("Name").Value = Base_T.Fields("Name").Value
PL_T.Fields("Tel1").Value = Base_T.Fields("Tel").Value
PL_T.Fields("Tel2").Value = Base_T.Fields("Fax").Value
PL_T.Fields("StartDate").Value = Me![StartDate]
PL_T.Fields("EndDate").Value = Me![EndDate]

While Kamo_T.EOF = False
 FindStr = FindDate & "KasiKamoID <> 1 AND KariKamoID = " & _
      Kamo_T.Fields("KamokuID")
 KariTotal = Nz(DSum("KariAmount", "SiwakeTable", FindStr), 0)
 FindStr = FindDate & "KariKamoID <> 1 AND KasiKamoID = " & _
      Kamo_T.Fields("KamokuID")
 KasiTotal = Nz(DSum("KasiAmount", "SiwakeTable", FindStr), 0)
 If Kamo_T.Fields("KamokuKind") = 4 And _
   Kamo_T.Fields("BoxNo").Value <> 0 Then
'  収益科目集計
  I = Kamo_T.Fields("BoxNo").Value
  FieldName = "KamokuName" & I
  PL_T.Fields(FieldName).Value = Kamo_T.Fields("KamokuName").Value
  FieldName = "ZanDaka" & I
  PL_T.Fields(FieldName).Value = PL_T.Fields(FieldName).Value + _
  Nz(Kamo_T.Fields("ZanDaka").Value) - KariTotal + KasiTotal
 End If
 If Kamo_T.Fields("KamokuKind") = 5 And _
   Kamo_T.Fields("BoxNo").Value <> 0 Then
'  経費科目集計
  I = Kamo_T.Fields("BoxNo").Value
  FieldName = "KamokuName" & I
  PL_T.Fields(FieldName).Value = Kamo_T.Fields("KamokuName").Value
  FieldName = "ZanDaka" & I
  PL_T.Fields(FieldName).Value = PL_T.Fields(FieldName).Value + _
  Nz(Kamo_T.Fields("ZanDaka").Value) + KariTotal - KasiTotal
 End If
 Kamo_T.MoveNext
Wend

PL_T.Fields("ZanDaka44").Value = Base_T.Fields("Koujyo").Value

PL_T.Update

PL_T.Close
Kamo_T.Close
Base_T.Close
ACC_DB.Close

ここまでです。

6.[×]ボタンを押してモジュールウィンドウを閉じます。

これで、損益計算書の集計を行うプログラムのサブルーチンが出来上がりです。

--------------------------------------
次回は損益計算書のレポートを作成します。
______________________________________
◆◇ 解説コーナー ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

 前回のVol.33発行の後、以下のようなメールを戴きました。

 Vol.33のVBAをもう少し詳しく解説していただけるとありがたいのですが。
 特に12行目のFindDateのあたりをお願します。

 そこで、今回は、ワンポイントコーナーとQ&Aコーナーを合体して解説コーナー
 と言うことで、解説を行いたいと思います。
 取りあえず損益計算書で解説しますが、貸借対照表も、ほぼ同様なので解って
 頂けると思います。

 まず、最初に出てくるDim文は特に問題無いと思います。
 書式は Dim 変数名 as 変数の型 となります。

 次に、メールでご指摘がありました、FindDateですが、7行目のDim文で宣言して
 ある通りで、このFindDateと言うのは、ただの文字列型変数にしかすぎません。
 ですから、12行目のFindDate = ・・・の文では、"DenpyoDate >= #" &
 Me![StartDate] & "# AND DenpyoDate <= #" & Me![EndDate] & "# AND " という
 条件を書いた文字列がFindDateと言う変数に代入されます。
 この条件式の内容は
 DenpyoDate >= #" & Me![StartDate] & "# と
 DenpyoDate <= #" & Me![EndDate] & "# の2つの条件の論理積(AND条件で両方
 の条件を満たす時)という条件を表しています。

 詳しく見ると DenpyoDate >= #" & Me![StartDate] & "# は DenpyoDate(伝票
 日付)が Me![StartDate](青色申告決算書印刷指示画面の集計開始日付)より
 同じか大きい と言う条件と
 DenpyoDate <= #" & Me![EndDate] & "# は DenpyoDate(伝票日付)が
 Me![EndDate](青色申告決算書印刷指示画面の集計終了日付)より同じか小さい
 と言う条件を両方満たすもの、と言うことになる訳です。
 ここで、Me![StartDate]とMe![EndDate]を # の文字で挟んでいますが、これは
 日付を取り扱う時のルールで#で挟むと日付として認識してくれます。
 (詳しくはヘルプにも載っているので、そちらも読んでみて下さい)
 最後に、 AND が付いているのは、この後にまだ、条件式が追加されるためで、
 それが39行目と42行目のFindStr = ・・・ の所です。

 ここでは、FindStrという文字列型変数にFindDateと科目の条件を足した条件を
 代入しています。
 FindDateの条件を満たした上で、且つ科目の抽出条件を満たしたもの、という条件
 になる訳です。

 15行目に戻って、Set文ですが、これはデータベース及び、テーブルをオープン
 し、読み書き出来るようにするためで、これも特に問題無いと思います。

 20・21行目の Base_T.MoveFirst と Kamo_T.MoveFirst は基本情報テーブル
 と科目テーブルのカレントレコードをMoveFirstメソッドで先頭に移動している訳
 ですが、通常テーブルをオープンした時はカレントレコードは先頭にあるのですが
 私は、明示的に必ず、最初にカレントレコードをセットする様に意識しています。

 23行目の PL_T.AddNew はPLTableにレコードを追加するためで、AddNewメソッド
 を使用します。
 レコードを追加する際の手順はAddNewメソッドを行い、フィールドにデータを設定
 して、最後にUpdateメソッドで実際にレコードが作成されます。

 25~36行目は、PLTableに追加するレコードのフィールドにデータを代入して
 います。これも特に問題無いでしょう。

 38行目のWhile文は科目テーブルがEOF(ファイルの最後)になるまでWhile文の
 中を繰り返します。

 41・44行目のKariTotalとKasiTotalは、科目の借方金額、貸方金額の合計が
 計算されます。
 Dsum関数は指定したテーブルのあるフィールドの値を合計する関数ですが、合計
 するデータの抽出条件を指定する事ができます。
 DSum("KariAmount", "SiwakeTable", FindStr)はSiwakeTableのデータでFindStr
 の条件を満たすデータを抽出し、その中のKariAmountフィールドの値を合計する
 と言う意味です。
 FindDate及び、FindStrは、この仕訳データを集計する際の条件式を入れた変数
 です。
 ですから、変数を使わずにDsum関数の第3引数に直接FindStr変数の内容を書いて
 も構いませんが、プログラムとしてはあまり良いプログラムとは言えないでしょう。

 後は、集計結果をPLTableに書き込むだけですが、科目の科目種別により加減算が
 変わってきます。
 収益科目は借方がマイナス、貸方がプラスの科目で、経費科目は借方がプラスで
 貸方がマイナスになります。(本来、ここでは勘定科目設定にある貸借区分も関係
 してくるのですが、一度にやると少し複雑になるので、第5章 拡張機能にて追加
 しようと思います)
 そこで、45・46行目と55・56行目のIf文でそれぞれ、収益科目と経費科目
 を判断しています。(貸借対照表も資産、負債、資本を同様に判断しています)
 このIf文にAND条件で Kamo_T.Fields("BoxNo").Value <> 0 と言うのが付いていま
 すが、これは勘定科目設定の決算書枠番号が0のもの(即ち決算書に出力しない
 未使用の科目)を除く為の条件です。

 48・49行目と58・59行目の I = Kamo_T.Fields("BoxNo").Value と
 FieldName = "KamokuName" & I ですが、これはPLTableの書き込むフィールド名
 を設定しています。
 これで、FieldNameはKmaokuNameX(Xは決算書枠番号)となり、PLTableの
 KamokuName1~KmaokuName45までのフィールドに科目名を設定しています。
 51・61行目の FieldName = "ZanDaka" & I も同様で、これで ZanDaka1~
 ZanDaka45までのフィールドに集計した残高を設定しています。

 50・60行目の
 PL_T.Fields(FieldName).Value = Kamo_T.Fields("KamokuName").Value は科目名
 を設定しています。

 52・53行目と62・63行目では、それぞれ残高を計算し設定しています。
 収益科目では勘定科目の残高-借方金額合計+貸方金額合計となり
 経費科目では勘定科目の残高+借方金額合計-貸方金額合計となります。

 65行目の Kamo_T.MoveNext は科目テーブルのレコードをMoveNextメソッドで
 次のレコードに移動しています。

 66行目の Wend は38行目のWhile文がここまでと言う意味で、科目テーブルの
 レコードの数分、38行目から66行目までを繰り返す事になります。

 68行目の PL_T.Fields("ZanDaka44").Value = Base_T.Fields("Koujyo").Value
 は青色申告特別控除額を基本情報から設定しています。

 70行目の PL_T.Update でPLTableのレコードの書き込みが行われます。

 72~75行目で、15~18行目でオープンしたテーブル、及びデータベースを
 クローズしています。

 以上が、貸借対照表、損益計算書の集計サブルーチンの説明です。

 まだ、解らない部分があれば、メールでご質問下さい。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

◇ ACCESSで作るシリーズ 【会計ソフト編】
◇ 発 行 元  :Yoshihisa Fukuda(福田 義久)
◇ ご意見・ご要望
  ご質問等   :y.fukuda@ro.bekkoame.ne.jp

◇ このメールマガジンは、インターネットの本屋さん『まぐまぐ』を利用して発行
  しています。(まぐまぐID:0000030446)
◇ バックナンバー:http://www.bekkoame.ne.jp/ro/y.fukuda/
◇ 登録・解除  :http://www.bekkoame.ne.jp/ro/y.fukuda/

 Copyright(C) 2000 Yoshihisa Fukuda All rights reserved.

◇転載について
 このメールマガジンの無断転載などは、一切禁止です。
 転載をご希望の方は、事前にメールで連絡をください。
◇免責
 このメールマガジン及びホームページの内容による、いかなる損害、障害などに
 関して発行者は一切の責任を負いません。
 掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□