例えば飲食店等でレジに入っている現金を「現金」勘定で管理しているとします。
売上や経費の支払いによって現金残高の増減があった結果、その日のレジの現金残高が50,000円を超えていたらその超えた金額を別のところに移し、「小口現金」勘定で管理することとします。その日のレジの現金残高が50,000円に満たない場合にはそのままにしておきます。
レジの現金残高が常に50,000円を超えないように管理するわけですが、これを会計ソフトに手入力しようとすると、
- その日の残高を確認する
- 残高が50,000円を超えていたらその差額を計算する
- 差額をその日の日付で入力する
ということになり大変面倒で、1ヶ月分まとめて入力する場合はかなり時間がかかります。
以前からこの残高の確認と入力データの作成をExcelのVBAで行なっていたのですが、今回Pythonで同じ仕組みを作成してみました。
プログラムは以下のようなものです。プログラムの入力ファイルも出力ファイルも弥生会計の仕訳日記帳の形式としています。
import csv
import os
# 作業ディレクトリとファイル名を指定
os.chdir(r'C:\Users\xxxxx\xxxxx')
val1 = 'export.csv'
# CSVファイルを開いて二次元配列にする
with open(val1,encoding = 'cp932') as f:
reader = csv.reader(f)
list_in = [row for row in reader]
# リストのデータ数
line_count = len(list_in)
# 出力用のリスト
list_out = []
# 初期値の設定
i = 0
zandaka = 50000
# 日付が変わるまで現金残高を計算し、残高が50,000円を超えていたら
# その差額を小口現金勘定に振り替えるデータを作成する
while i < line_count:
temp_date = list_in[i][3]
while list_in[i][3] == temp_date:
if list_in[i][4] == '現金':
zandaka = zandaka + int(list_in[i][8])
elif list_in[i][10] == '現金':
zandaka = zandaka - int(list_in[i][14])
i += 1
if i >= line_count:
break
if zandaka > 50000:
col_1 = '2000'
col_2 = ''
col_3 = ''
col_4 = temp_date
col_5 = '小口現金'
col_6 = ''
col_7 = ''
col_8 = '対象外'
col_9 = zandaka - 50000
col_10 = 0
col_11 = '現金'
col_12 = ''
col_13 = ''
col_14 = '対象外'
col_15 = zandaka - 50000
col_16 = 0
col_17 = '小口現金へ'
col_18 = ''
col_19 = ''
col_20 = 0
col_21 = ''
col_22 = ''
col_23 = 0
col_24 = 0
col_25 = 'no'
list_out.append([col_1,col_2,col_3,col_4,col_5 \
,col_6,col_7,col_8,col_9,col_10 \
,col_11,col_12,col_13,col_14,col_15 \
,col_16,col_17,col_18,col_19,col_20 \
,col_21,col_22,col_23,col_24,col_25])
zandaka = 50000
with open('py_input.csv',mode = 'w',encoding = 'cp932',newline = '') as f:
writer = csv.writer(f)
writer.writerows(list_out)
最初はpandasで作ろうと思っていたのですが、
「日付ごとに現金残高を計算しその金額によって新たにデータを作成する」
という手順をうまく考えることができなかったので、CSVファイルを1行ずつ処理する方法に変えました。
CSVファイルを二次元配列にすれば、ExcelのVBAに似た手順で処理を書くことができます。