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


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

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

    発 行 : Yoshihisa Fukuda          2000.11.18 Vol.33

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

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

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

--------------------------------------
3-3 青色申告決算書
--------------------------------------
--------------------------------------
3-3-2 フォーム作成(続き)
--------------------------------------
では、青色申告決算書の貸借対照表と損益計算書のそれぞれを集計するプログラム
を作成します。
これらの集計プログラムは、総勘定元帳の時と同様に、サブルーチンとして作成し
印刷実行ボタンを押された時、このサブルーチンを呼び出してから、レポートを実行
します。

今回は貸借対照表の集計プログラムを作成します。

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

Dim ACC_DB As Database
Dim Kamo_T As Recordset
Dim Env_T As Recordset
Dim BS_S_T As Recordset
Dim BS_F_T As Recordset
Dim KariTotal As Currency
Dim KasiTotal As Currency
Dim SisanTotal As Currency
Dim FusaiTotal As Currency
Dim FindDate As String
Dim FindStr As String

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

Set ACC_DB = CurrentDb
Set Kamo_T = ACC_DB.OpenRecordset("KamokuTable")
Set Env_T = ACC_DB.OpenRecordset("EnvironTable")
Set BS_S_T = ACC_DB.OpenRecordset("BSSisanTable", dbOpenDynaset)
Set BS_F_T = ACC_DB.OpenRecordset("BSFusaiSihonTable", dbOpenDynaset)

Env_T.MoveFirst
Kamo_T.MoveFirst

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") = 1 Then
  BS_S_T.AddNew
  BS_S_T.Fields("LineNo").Value = Kamo_T.Fields("BoxNo").Value
  BS_S_T.Fields("KamokuID").Value = Kamo_T.Fields("KamokuID").Value
  BS_S_T.Fields("KamokuName").Value = Kamo_T.Fields("KamokuName").Value
  BS_S_T.Fields("StartZan").Value = Nz(Kamo_T.Fields("ZanDaka").Value)
  BS_S_T.Fields("EndZan").Value = Nz(Kamo_T.Fields("ZanDaka").Value) _
                    + KariTotal - KasiTotal
  BS_S_T.Update
 End If
 If Kamo_T.Fields("KamokuKind") = 2 Then
  BS_F_T.AddNew
  BS_F_T.Fields("LineNo").Value = Kamo_T.Fields("BoxNo").Value
  BS_F_T.Fields("KamokuID").Value = Kamo_T.Fields("KamokuID").Value
  BS_F_T.Fields("KamokuName").Value = Kamo_T.Fields("KamokuName").Value
  BS_F_T.Fields("StartZan").Value = Nz(Kamo_T.Fields("ZanDaka").Value)
  BS_F_T.Fields("EndZan").Value = Nz(Kamo_T.Fields("ZanDaka").Value) _
                    - KariTotal + KasiTotal
  BS_F_T.Update
 End If
 If Kamo_T.Fields("KamokuKind") = 3 And _
   Kamo_T.Fields("BoxNo").Value <> 0 Then
  If Kamo_T.Fields("KamokuID").Value = Env_T.Fields("MotoireKamoID") Then
   BS_F_T.AddNew
   BS_F_T.Fields("LineNo").Value = Kamo_T.Fields("BoxNo").Value
   BS_F_T.Fields("KamokuID").Value = Kamo_T.Fields("KamokuID").Value
   BS_F_T.Fields("KamokuName").Value = Kamo_T.Fields("KamokuName").Value
   BS_F_T.Fields("StartZan").Value = Nz(Kamo_T.Fields("ZanDaka").Value)
   BS_F_T.Fields("EndZan").Value = Nz(Kamo_T.Fields("ZanDaka").Value)
   BS_F_T.Update
  Else
   BS_F_T.AddNew
   BS_F_T.Fields("LineNo").Value = Kamo_T.Fields("BoxNo").Value
   BS_F_T.Fields("KamokuID").Value = Kamo_T.Fields("KamokuID").Value
   BS_F_T.Fields("KamokuName").Value = Kamo_T.Fields("KamokuName").Value
   BS_F_T.Fields("StartZan").Value = Nz(Kamo_T.Fields("ZanDaka").Value)
   BS_F_T.Fields("EndZan").Value = Nz(Kamo_T.Fields("ZanDaka").Value) _
                     + KariTotal - KasiTotal
   BS_F_T.Update
  End If
 End If
 Kamo_T.MoveNext
Wend
  
SisanTotal = Nz(DSum("EndZan", "BSSisanTable"), 0)
FusaiTotal = Nz(DSum("EndZan", "BSFusaiSihonTable"), 0)
BS_F_T.AddNew
BS_F_T.Fields("LineNo").Value = 24
BS_F_T.Fields("KamokuID").Value = 58
BS_F_T.Fields("KamokuName").Value = "控除前所得"
BS_F_T.Fields("StartZan").Value = 0
BS_F_T.Fields("EndZan").Value = SisanTotal - FusaiTotal
BS_F_T.Update

BS_S_T.Close
BS_F_T.Close
Env_T.Close
Kamo_T.Close
ACC_DB.Close

ここまでです。

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

これで、貸借対照表の集計を行うプログラムのサブルーチンが出来上がりです。

【解説】
 最初の11行のDim文は今までに何回も登場している変数宣言です。

 次の、FindDate=・・・ はデータを集計する際の検索条件となります。
 ここでは、仕訳データの仕訳日付が青色申告決算書の印刷指示画面の開始・終了
 日付(すなわち会計期間)内のデータという条件式です。

 次の5行のSET文は、データベース及び、各テーブルをオープンしてアクセスでき
 る様にしています。(これはVol.21でも出てきました)

 次の Env_T.MoveFirst と Kamo_T.MoveFirst は MoveFirst というメソッドを
 用いて、テーブルのカレントレコードを先頭レコードに移動しています。

 次の While Kamo_T.EOF = False は繰り返しの文ですが、Kamo_T(科目テーブル)
 のレコードがEOF(エンドオブファイル:ファイルの最後)になるまで繰り返す
 という、プログラムの流れを制御するフロー制御の文です。

 その中で、仕訳データの借方、貸方の各金額を集計するわけですが、FindStr=・・
 で最初のFindDate(仕訳データの日付の抽出条件)に加えて、科目IDを抽出条件
 として足しています。

 KariTotal と KasiTotal は、DSum関数により、各条件に当てはまる仕訳データの
 借方、貸方の各金額を集計しています。

 後は、集計結果を貸借対照表用のテーブルに書き込めば良いのですが、科目種別に
 より、借方金額と貸方金額の加減算が変わりますので、If文でそれらを振り分けて
 います。

 テーブルにデータを追加するときは、AddNewメソッドを使用します。
 AddNewメソッドの後に、各フィールドにデータを設定して、Updateメソッドで
 データはテーブルに追加されます。
 (ちなみにデータの修正の時はEditメソッドを使います)

 最後に控除前所得(当期利益)を計算していますが、ここで科目IDを55として
 いるのですが、これは、ホームページで配布した科目テーブルの場合です。

 もし、皆さんがご自分で勘定科目を設定されている場合、控除前所得の科目IDを
 確認して、その数値にして下さい。

--------------------------------------
今回は貸借対照表の集計プログラムを作成しました。
次回は損益計算書の集計プログラムを作成しましょう。
______________________________________
◆◇ ワンポイントコーナー ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

【集計の方法】

 基本的に、会計ソフトの集計は、総勘定元帳、残高試算表、そして今回の
 青色申告決算書も全て、勘定科目毎に仕訳の借方、貸方の金額を累計するという
 事に変わりはありません。
 その仕訳データを集計する範囲が日付で指定される訳です。
 従って、青色申告決算書も、残高試算表の様にクエリーを用いて集計する事も
 可能です。

 このメールマガジンでは、できるだけ色々な方法を紹介するため、違う手段を
 用いていますが、読者の皆様方はご自分の得意な方法で統一されても構わないと
 思います。

 「クエリーは良く解るがVBAはちょっと」と言う方は集計をクエリーで行えばVBA
 はデータをセットする部分だけで済みます。

 また、「VBAが得意でクエリーはよく判らない」と言う方は、全てVBAを用いて集計
 されても構わないでしょう。

 また、複雑な集計はクエリーを何重にも重ね合わせなければならず、クエリーの
 組み合わせが複雑過ぎると処理速度が低下する事もあるので、その辺に注意が
 必要です。
______________________________________
◆◇ Q&Aコーナー    ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

 今回は、ありません。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

◇ 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.

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