前回PowerAutomateを使って出納帳から弥生インポートデータを作成しましたが、今回は同じ内容をPythonを使ってやってみたいと思います。

Pythonでコードを書けなかった理由

正直に言います(前回もこんなこと書いてましたが)。

プログラミング言語のPython、今まで入門書読んだりセミナー受けたりしましたが、ことごとく挫折しました。

挫折したというよりも、入門書などを読んで満足してしまい、実際に業務で使うプログラムを作ろうとしませんでした。

「RPAやマクロでなんとかなってるし、わざわざ本格的なプログラミング言語まで使わなくても」と。

一応言い訳しておくと、Pythonって著者によって、勧める環境が結構違うんです。

入門書を2~3冊読むと、最初のインストールのところで

「これを使った方がいい」

という環境が違うので、まずはそこで混乱する。

どれを使ったらいいんだと悩んでいるうちに「RPAやマクロでなんとかなってるし」というところに戻って、以下無限ループ。

こんな感じで、今まできちんと自分でコードを書くという作業をしてきませんでした。言い訳オシマイ。

実は年初に改めてPythonに取り組んでみようと目標を立てていたのですが、気付けばもう9月。

ということで、少し前から入門書などを改めて読んでいましたが、やはり自分で手を動かさないとダメだなと。

かつ、それは本に書いてあるサンプルではなく、自分の身の回りの課題を解決するものであるべき。

いつもはこの時点で、どんなプログラムを書くか思いつかずに、結局何もせずに終わるのですが、今回はありました。

「前回試しにつくってみたRPAをpythonで作ってみよう」と。

広告

金銭出納帳から弥生インポートデータをつくるには

とりあえずChatGPTに聞いてみる

とはいえ今まで自分で書いたことのない言語。どのように作り始めればよいのかわかりません。

こんな時はとりあえずChatGPTに相談してみます。

こんな感じでやりとりして

出てきた回答がこちら。

私が正確に指示しなかったからですが、これでできるわけないなと。ただ、このコードを眺めていると、なんとなく方向性が見えてきます。

要するに

  1. Excelファイルを読み込んで
  2. 変数の中に弥生インポート形式でデータを格納して
  3. CSVファイルに書き込む

という流れでつくればいいんだと。

前回のPowerAutomateでは

  1. Excel金銭出納帳のデータを読み取って、Excelを閉じる
  2. 転記用の新しいExcelを開く
  3. 1で読み取ったデータを、2のExcelファイルに弥生インポート形式にあわせて転記する
  4. 3で作成したExcelデータを読み取って、CSVファイルに書き出す

という流れで作成しましたが、一旦Excelに転記してそのExcelを読み込むという回りくどいやり方ができるのは

「Excelワークシートから読み取る」

というアクションを事前に準備してくれているからです。

Pythonではその部分も自分でコードを書かないといけないので、そんな回りくどいことはせずに直接変数にデータを書き込むようにプログラムを作ります。

弥生インポートデータを作成するコード

この考え方で今回書いたコードがこちら。

import openpyxl as xl
from datetime import datetime
import csv


# Excelファイルを読み込む
wb = xl.load_workbook("cash_ledger.xlsx", data_only=True)
sheet = wb.active


# iter_rowsを使って出納帳データを読み取る
# 日付データをCSVファイルに書き出せる形式に変換
# 日付データ:読み取り時点ではdatetime(2024,5,1)となる
origin_data=[]
for row in sheet.iter_rows(min_row=5):
    v=[i.value for i in row]
    v[0] = v[0].strftime("%Y/%m/%d")
    origin_data.append(v)


# 出納帳データを使って弥生インポートデータ用の2次元リストを作成
import_data=[]
for row in origin_data:
    if row[1] is None:
        value = [
            "2000",
            "",
            "",
            row[0],
            row[6],
            "",
            "",
            "対象外",
            row[2],
            "",
            "現金",
            "",
            "",
            "対象外",
            row[2],
            "",
            str(row[5]) + " " + str(row[4]),
            "",
            "",
            0,
            "",
            "",
            "",
            "",
            "NO"
        ]
    else:
        value = [
            "2000",
            "",
            "",
            row[0],
            "現金",
            "",
            "",
            "対象外",
            row[1],
            "",
            row[6],
            "",
            "",
            "対象外",
            row[1],
            "",
            str(row[5]) + " " + str(row[4]),
            "",
            "",
            0,
            "",
            "",
            "",
            "",
            "NO"
        ]
    import_data.append(value)


# CSVファイルに保存
output_file = 'import.csv'
with open(output_file, mode='w', newline='', encoding='sjis') as file:
    writer = csv.writer(file)
    writer.writerows(import_data)


print("CSVファイルが作成されました:", output_file)

ここまでつくるのにいろんなエラーが出ましたが、その都度ChatGPTに

「このエラーってどうやったら解決するの?」

と聞きながらなんとか完成しました。

なお、読み込むファイル名に日本語が含まれているとうまく動かなかったので、金銭出納帳のファイル名は「cash_ledger.xlsx」に変更し、そのファイルと同じフォルダにプログラムを保存しています。

このプログラムで作成したCSVファイルを弥生会計にインポートしたところ、無事インポートできました。

※データは前回と同じものを日付だけ5月に変更しています。出納帳の取引先が空欄の場合に「None」と摘要に記帳される点は、今回はご愛敬ということで・・・

広告

コードを書くにあたりつまずいた点

今回コードを書くにあたり、つまずいたのは主に次の3点でした(他にもいろいろありましたが)。

リストの中にリストを入れるという考え方

Pythonではリストというデータの入れ物を使えるのですが、入門書に書いてあるのは

[1,2,3]

といった形の1行のリスト。

だけど今回読み取ったり、CSVファイルに書き出すのは、複数行のデータです。

これを

[[1,2,3],[4,5,6],[7,8,9]]

という形でリストの中にリストを入れるというやり方を使わないと、タテヨコの2次元のデータを扱えません。

慣れた方にとっては「そんなの当たり前でしょ」となりますが、いざ自分でコードを書こうとすると、意外とこうした点でつまずいたりするものです。

日付の取扱い

出納帳のExcelファイルを読み取ると、日付のデータが

datetime(2024,05,01)

という形式になります。

これをそのままCSVファイルに書き出しても、弥生会計は受け付けてくれません。

strftime(“%Y/%m/%d”)

というメソッドを使って、日付の形式を整えておく必要があります。

CSVファイルの保存コード

ChatGPTが回答したCSVファイルへの書き込みコードでは、

encoding=’utf-8-sig’

となっていますが、この形式で作成したCSVファイルを弥生会計は「不正なデータ」として受け付けてくれません。

エラーの詳細も出力してくれないため、最初原因がわかりませんでしたが、Windowsで一般的に使用される「シフトJIS」という形式で保存したところ、問題なくインポートできました。


実際、前回のPowerAutomateで処理すると数十秒かかった処理が、こちらのコードを使うとわずか数秒で完了します。

RPAよりもプログラミング言語を使う方がハードルは高いですが、効果は大きいでしょう。

今回のコード、試行錯誤しながらつくりましたので、得意な方からすれば

「あそこはこうすればいいのに」
「もっと少ない行で作れるのに」
「素人っぽい考え方しているな」

等々気になる点はあるかもしれません。

ただ、そうした点は数をこなしていくことで改善する部分もあるでしょうし、なにより大事なのはとにかくまず自分で書いてみること。

自分でやってみることで得られる学びは大きいものです。

Pythonでのプログラミング、初心者でも頑張ればなんとかなりますよ、ということで参考になれば幸いです。

投稿者

加藤 博己
加藤 博己加藤博己税理士事務所 所長
大学卒業後、大手上場企業に入社し約19年間経理業務および経営管理業務を幅広く担当。
31歳のとき英国子会社に出向。その後チェコ・日本国内での勤務を経て、38歳のときスロバキア子会社に取締役として出向。30代のうち7年間を欧州で勤務。

40歳のときに会社を退職。その後3年で税理士資格を取得。

中小企業の経営者と数多く接する中で、業務効率化の支援だけではなく、経営者を総合的にサポートするコンサルティング能力の必要性を痛感し、「コンサル型税理士」(経営支援責任者)のスキルを習得。

現在はこのスキルを活かして、売上アップ支援から個人的な悩みの相談まで、幅広く経営者のお困りごとの解決に尽力中。

さらに、商工会議所での講師やWeb媒体を中心とした執筆活動など、税理士業務以外でも幅広く活動を行っている。
広告