世の中で経理に求められている役割には教科書的なものがあると思っています。経理の役目は
支払いや、
給与計算、
売上の集計と請求・入金の管理、
会計ソフトの入力、
などの現業的なものから、
予算の取りまとめ、
実績の集計、
予実の比較とフィードバックなどの
経営の要となる役割もあります。そう、経理は会社の経営にとってとても重要な役割を担っているのです。私は予算を立てて実績と比較することは会社が成長するうえで、必要不可欠なものだと考えています。会社は、成り行き任せにしても大きくならないのです。
そんな会社の成長をサポートするうえで、現業部分で時間を取られて付加価値の高い部分がおろそかになってしまうのはもったいないです。是非、プログラミングを覚えて、リーティンな業務を効率していただけたらと思います。
ここでご紹介するのは、売上のボリュームが多いお客様の資料を入力するうえで、弊事務所が実際に使っているPythonの例です。今回は売上が対象ですが、仕訳がめんどくさい給与の仕訳などにも威力を発揮すると思います。
売上ですが、通常は会社の販売管理のシステムに入っているか、急成長した中小企業ならもしかしてまだエクセルで管理しているかもしれません。こんな風に。
エクセルで毎月の売り上げをまとめて、これを経理が弥生会計などの会計ソフトに手で入力するのが典型的なパターンかと思います。
これをPythonで自動化すると、ボタン一つでCSVで仕訳データが作れます。Pythonなどのプログラミング言語のいいところは、条件分岐などの複雑な条件も対応できることです。エクセルだとIF関数が複数必要な場合など複雑になりがちですがプログラミング言語なら、プログラミング言語がそもそも条件分岐を処理するために出来てるようなものなので、そんなことにはなりません。
CSVを使った弥生ファイルはこんな感じになります。
実際に使ったコードはこんな感じになります。
#1ではエクセルのモジュールをインポートしています。Pythonではエクセルデータも簡単に扱う事が出来ます。
#2ではエクセルに個別の仕訳データを書き込んでいます。
#3でエクセルのファイルを開いています。
#4でエクセルのデータを実際にシートから読み込んでいます。データがなくなるところをifの関数を使って自動で判定しています。
やってみると意外と簡単なので、是非、挑戦してみたら良いと思います。
こちらのサンプルには実際にPythonをインストールするところを書いていませんが、それもそれほど難しくありません。こちらのリンク先からAnacondaをインストールして、AnacondaのメニューからJupyter Notebookを開き、下記のコードをコピペするだけです。ファイルの保存場所やシートの名前は各自皆様の環境に合わせて修正をお願いいたします。
#(1) Pythonでエクセルを読み込むモジュール
import openpyxl
#(2) エクセルの
def renderJournalCSV(journal, sheet, rowNum):
sheet[“A” + str(rowNum)] = 2000
sheet[“D” + str(rowNum)] = journal.Date
sheet[“E” + str(rowNum)] = journal.DrAcc
sheet[“F” + str(rowNum)] = journal.DrSubAcc
sheet[“G” + str(rowNum)] = journal.DrCostCenter
sheet[“H” + str(rowNum)] = journal.DrCTaxCode
sheet[“I” + str(rowNum)] = journal.Amount
sheet[“J” + str(rowNum)] = journal.DrCTaxAmount
sheet[“K” + str(rowNum)] = journal.CrAcc
sheet[“L” + str(rowNum)] = journal.CrSubAcc
sheet[“M” + str(rowNum)] = journal.CrCostCenter
sheet[“N” + str(rowNum)] = journal.CrCTaxCode
sheet[“O” + str(rowNum)] = journal.Amount
sheet[“P” + str(rowNum)] = 0
sheet[“Q” + str(rowNum)] = journal.Description
sheet[“T” + str(rowNum)] = 0
sheet[“Y” + str(rowNum)] = “no”
def makeJournal_Sales(bookDate, name, amount, desc):
journal = Journal()
journal.Date = bookDate
journal.DrAcc = “売掛金”
journal.DrSubAcc = name
journal.DrCostCenter = “”
journal.DrCTaxCode = “対象外”
journal.Amount = amount
journal.DrCTaxAmount = 0
journal.CrAcc = “売上高”
journal.CrSubAcc = name
journal.CrCostCenter = “”
journal.CrCTaxCode = “課税売上8”
journal.CrCTaxAmount = 0
journal.Description = desc
return journal
class Journal:
def __init__(self):# コンストラクタ
self.Date = “”
self.DrAcc = “”
self.DrSubAcc = “”
self.DrCostCenter = “”
self.DrCTaxCode = “”
self.Amount = 100
self.DrCTaxAmount = 0
self.CrAcc = “”
self.CrSubAcc = “”
self.CrCostCenter = “”
self.CrCTaxCode = “”
self.CrCTaxAmount = 0
self.Description = “”
#3
wb = openpyxl.load_workbook(“C:/Users/ichir/onedrive/デスクトップ/SalesReport.xlsx”)
sheet1 = wb[‘report’]
sheet_result = wb[‘result’]
journals = []
#4
for rowCount in range(3, 105): # rangeの範囲の終わりは含まれないので、1行多くする。
if sheet1.cell(row=rowCount,column=1).value is not None:
transactionDate = sheet1.cell(row=rowCount,column=1).value
clientName = sheet1.cell(row=rowCount,column=2).value
amount = sheet1.cell(row=rowCount,column=3).value
description = sheet1.cell(row=rowCount, column=7).value
journal = makeJournal_Sales(transactionDate, clientName, amount, description)
journals.append(journal)
print(len(journals))
cnt = 1
for journal in journals:
sheet_result = wb[‘result’]
renderJournalCSV(journal, sheet_result, cnt)
cnt += 1
wb.save(“C:/Users/ichir/onedrive/デスクトップ/result.xlsx”)
print(“work completed”)