にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

自営業でも適格請求書を発行したい: 請求書簡易作成システムの構成

概要

登録番号さえ用意して追加すれば適格請求書を作成できる(と思われる)システムを、Microsoft Excel, Microsoft Word, Pythonを利用して構成した。
データ入力をExcelで行い、Pythonスクリプトで形を変換し、そのデータを元にWordで差し込み印刷を行うことにより請求書を得る仕組みを作った。

作成したファイルやスクリプトは次のURLに置いた:
GitHub - nixeneko/seikyusho_sample: Microsoft Word, ExcelとPythonを使って請求書を作るサンプル

はじめに

インボイス制度とかいうものが始まるらしい、なんかやらないといけないらしい。

制度に関する説明は次のサイトがわかりやすい。
www.itmedia.co.jp


曰く、2023年10月から「適格請求書」というのを発行しないと、(得意先における)消費税の控除関係で不利になるらしい。なので「適格請求書」を必要になったら発行できるように準備しておきたい。

「適格請求書」の要件

請求書に次の内容を含めないといけないらしい。

  1. 書類作成者の氏名又は名称
  2. 取引年月日
  3. 取引内容(軽減税率の対象品目である旨)
  4. 税率ごとに区分して合計した税込対価の額
  5. 書類の交付を受ける事業者の氏名又は名称
  6. 登録番号
  7. 適用税率及び税率ごとに区分した消費税額等

参照:


現行の「区分記載請求書」では、6.と7.が要らないということで、この分が増えることになる。なお、6.の登録番号の発行は申請が必要となっている。とりあえず、6.は2023年10月から必要になるので、それまでは、いつでも追加できるようにしておいて、登録番号の表記を入れれば適格請求書となる状態をつくりたい。

なお、この記事では登録番号の発行を受けるための申請については扱わないこととする。


使うソフト

さて、請求書を発行するといっても、そのために専用のソフトを新しく買ったりとかはしたくない。

Microsoft WordとExcelを使うと差し込み印刷ができるらしいので、Microsoft Officeを基本として使うことにする。事務処理でMicrosoft Officeは使っていることも多いと思うので。

差し込み印刷

Wordには、Excelなどのデータを読み込んで文面を差し替える機能が備わっていて、「差し込み印刷」という。

差し込み印刷については次のページなどが参考になる:
差し込み印刷で請求書のように複数レコードや合計を表示したい:Word(ワード)2013基本講座


以下、Microsoft OfficeのバージョンはMicrosoft 365 MSO (バージョン 2112 ビルド 16.0.14729.20156) 64 ビットを使っているが、基本的に別のバージョンでも問題ないと思われる。

差し込み印刷のフォーマットをつくる

Wordでひな形をつくる
f:id:nixeneko:20220107151249p:plain
請求書ひな形

こんな感じのを作った。

税込みベースの作業フローを使っていたのでそのまま税込みベースで計算しているが、統一されていれば税別ベースで計算してもよい*1

Excelで、差し込めるデータ構造を決める

サンプルデータを用意した。こんな感じのものであれば差し込み印刷で問題なく使える。シートの名前は「請求書」とした。

f:id:nixeneko:20220107232007p:plain
Excelサンプルデータ

必要なのはテキストや数値のみであって、幅やフォーマットは関係ない。
グレーの部分はデータとしては利用していないので、空欄や別の値でも問題ない。

Wordに差し込み印刷を設定する

[差し込み文書]タブを開く→[差し込み印刷の開始]→[標準のWord文書]をクリック

[宛先の選択]→[既存のリストを使用(E)...]をクリック

先ほどサンプルデータを用意したエクセルファイルを選んで、[開く(O)]を押す。

[テーブルの選択]ウィンドウが出るので、データのあるシート(ここでは「請求書$」)を選択して[OK]を押す。
([先頭行をタイトル行として使用する(R)]にチェックが入っていることを確かめる。)

___様となっているところにカーソルを移動して、[差し込みフィールドの挿入]→「被請求者」を選択すると«被請求者»と書かれたものが挿入される。

同様に年月日のところに「年」「月」「日」の差し込みフィールドを挿入する。


注文内容の部分には工夫が必要である。
1行目は次のように差し込みフィールドを挿入する。

  • 品目→「品目」
  • 税込単価→「単価」
  • 個数→「個数」
  • 小計→「品目小計」

ここで、挿入された«単価»を右クリックし、[フィールド コードの表示/非表示(T)]をクリック。
すると{ MERGEFIELD 単価 }というような表示になるので、閉じ曲括弧}の直前に\# ¥,0 を入力して次のようにする。

{ MERGEFIELD 単価 \# ¥,0 }

これを再度右クリックして[フィールド コードの表示/非表示(T)]をクリック。

追加したコードの意味は次のようになっている。

  • \# はnumeric picture switchというWordの機能らしく、数値の表示形態を指定する。
  • ¥は円記号(U+00A5)である。
    • 円記号¥(U+00A5)の代わりにバックスラッシュ\(U+005C)を用いる場合は、\\としなければならない。ただ、最新のコンピュータではバックスラッシュが円記号で表示されないことも多くなってきているし、円記号の方を使っておけばいいと思う。昔のシステムではわからないが…
  • ,は3桁ごとにコンマ区切りをすることを表す。
  • 0は整数で、1桁の場合でも先頭を0パディングしないことを表す。

参考: Fix the Formatting of an Excel Mail Merge Field in a Word Document


同様に«品目小計»のフォーマットも指定する。


2行目の品目の欄に移動し、[ルール]→[Next Record If (条件により次のレコード)(X)...]をクリック。

[Wordフィールドの挿入: Next Record If]ウィンドウが表示されるので、

  • [フィールド名(F)] →「請求書ID」
  • [比較(C)] → [空白でない]

にして[OK]をクリックすると«Next Record If»と挿入される。

その直後に「品目」という差し込みフィールドを挿入する。
2行目の他のセル、税込単価, 個数, 小計のところは1行目と同じでよい。

Next Record Ifというのがなぜ必要かというと、これがないと一つの請求書で1つの行しか参照せず、同じ品目が並ぶことになる。そのため、「次の行に進んでください」とWordに指示を出すコマンドが必要で、それがNext Record Ifである。ここでは「請求書ID」が空白でない場合のみ次の行に移るように設定したので、空白行より先には進まないでそこで止まる。


3行目以降は2行目と同じてよく、2行目をコピペすればよい。


また、他のものについても同様に差し込みフィールドを挿入し、フィールドコードを編集することで円記号前置+コンマ区切りを指定する。

  • ご請求金額→「代金計」{ MERGEFIELD 代金計 \# ,0 }
  • 合計金額→「代金計」{ MERGEFIELD 代金計 \# ¥,0 }
  • 税率10%対象金額(税込)→「標準税率対象」{ MERGEFIELD 標準税率対象 \# ¥,0 }
  • 10%税額→「標準税」{ MERGEFIELD 標準税 \# ¥,0 }
  • 税率8%対象金額(税込)→「軽減税率対象」{ MERGEFIELD 軽減税率対象 \# ¥,0 }
  • 8%税額→「軽減税」{ MERGEFIELD 軽減税 \# ¥,0 }
  • 消費税計→「消費税計」{ MERGEFIELD 消費税計 \# ¥,0 }


出来上がったものは次のような見た目になる。

f:id:nixeneko:20220107155810p:plain
差し込みフィールドの挿入が済んだ請求書テンプレート


ここで、[差し込み文書]タブの[結果をプレビュー]をクリックしてオンにすると最初のデータがプレビューされる。

実際の差し込みでは、[差し込み文書]タブの[完了と差し込み]から[個々のドキュメントの編集(E)]でWordファイルを作成するか、[文書の印刷(P)]で印刷することになると思う。

実際に差し込みを行ったものが次図である。

f:id:nixeneko:20220110160329p:plain
差し込みを行った請求書


制限としては、この請求書の書式では注文内容の明細を示すための欄を16行しか確保していないので、16種類以上の品目が出てきた場合に望む結果が得るられないことになる。
とはいえそんなたくさんの品目を扱うならもっとちゃんとしたシステム導入するでしょという気もする。

入力を簡単にしたい

さて、差し込みは出来上がったものの、差し込み用のExcelデータを手入力するのはすごく面倒である。
そのため、必要最低限の情報を入力するExcelファイルを作り、適宜変換することにする。Excelは入力には便利なので。
もちろん注文内容をデータで持っているのであればそれを変換してやればそれで済むのだが、紙ベースで管理しているので入力するしかない。


変換は、本当であればすべてExcelでやりたかったのだが、やり方がよくわからなかったのでPythonで変換することとした。Pythonを選んだのは単に使い慣れてるからで、同じことができれば何でもよい。

f:id:nixeneko:20220110144725p:plain
請求書作成システム全体図

入力用Excelファイル → 変換 → 出力用Excelファイル → Word差し込み → 請求書Wordファイル ……という流れになる。

要件を考える

さて、Pythonで変換するにあたって、
出力にあたって必要なのは

  • 請求先名称
  • 請求年月日
  • 請求金額(合計金額)
  • 標準税率対象金額
  • 標準税額
  • 軽減税率対象金額
  • 軽減税額
  • 消費税計
  • 品目のリスト

であり、品目についてはさらに

  • 品名(軽減税率対象の場合は最後に「(※)」とつける)
  • 税込単価(税別でもいいが全体で統一する)
  • 個数
  • 小計

をもつ必要がある。

また、品目については、送料を最後にまとめて表示するようにしたい。


税率の計算では小数点以下を扱う必要が生じるが、これはdecimalを利用する。誤差があると困るのでfloatは使わない方がいい。


消費税の計算については、

  1. 標準税率対象金額から標準税額を計算し、整数に丸める
  2. 軽減税率対象金額から軽減税率を計算し、整数に丸める
  3. 標準税額と軽減税額を合計する

という順番(ただし1.と2.は順不同)で、税率ごとの対象金額の合計に対して整数に丸め、合計することになっている。
整数への丸め方(端数処理)は、切り捨て、切り上げ、四捨五入などのどれでもよいとのこと。とりあえず四捨五入にしておく…。
参考: 切り捨て?切り上げ?請求書の端数処理について解説 | 経営者から担当者にまで役立つバックオフィス基礎知識 | クラウド会計ソフト freee

入力用Excelファイルの構造を考える

入力用のExcelファイルは次のようなものを作った。

f:id:nixeneko:20220110145450p:plain
入力用Excelファイル

以下概略である。

  • 「請求書ID」が同一のものが1つの請求書となる。
  • 「被請求者」が請求先として記載される。
  • 「商品品目」はドロップダウンリストからの選択式とした。
    • ドロップダウンリストの定義は「品目リスト」シートのテーブルで行っている。
    • 自由入力も可能としている。
  • 「軽減」は軽減税率対象の場合はxを入力する。
    • 「商品品目」をドロップダウンリストから選択した場合は自動入力されるようにした。
  • 「単価」はドロップダウンリストから選択した場合は自動入力されるようにした。
  • 「送り先〒」に郵便番号を入力するか、「送り先住所」に都道府県を入力する。
    • 「送り先〒」は文字列で、入力すると隣の「送り先住所」に都道府県が入るようにしている。
      • 住所を都道府県から書かない人がいるので、これがないと調べる手間が増える。
    • 郵便番号から都道府県を引くのは「郵便番号表」 シートのテーブルで行っている。
  • 「サイズ」は荷物のサイズで、商品品目がリストにあれば自動入力される他、プルダウンで変更できる。
    • 大きな箱単位のものを想定しているので自動入力を用意しているが、発送する荷物の数と一対一対応しないことがほとんどの場合は自動入力をなくした方がよさそう。
  • 「送料単価」は「送り先住所」と「サイズ」から自動入力される。
    • 都道府県送料」シートから引いている。
  • 「送料個数」は「個数」と同一の数値が自動で入力されるようにしているが、任意で変更できる。
    • 必要がなければ空欄にするか0にする。
    • 商品の個数と一対一対応することがまれな場合は自動入力をなくした方がよさそう。
プルダウンリストの元の値にテーブルを利用する

プルダウンリストの[元の値]にテーブルを利用するには、INDIRECT()関数を使う。
連動するドロップダウンリストをテーブルを利用して作成する:Excelの基本操作

ドロップダウンリストと自由入力を混在させる

データの入力規則として、ドロップダウンリストと自由入力を混在させるためには、[データの入力規則]の[エラーメッセージ]タブの設定を変更する。
Excel:入力規則でドロップダウンリストと入力を混在させたい  −教えて!HELPDESK

郵便番号表の作成
  1. [データ]タブ → [データの取得] → [ファイルから(F)] → [テキストまたはCSVから(T)] → KEN_ALL.CSVを選択、[インポート]を押す。
  2. ウィンドウが開くので、[データ型検出]を[データ型を検出しない]に変更して[読み込み]を押す。
  3. 読み込まれるので、不要な列を消す。
  4. 全体を選択して、[セルの書式設定]→[表示形式]を[文字列]にして[OK]を押す。
  5. シート名を郵便番号表にする(しなくてもいい)。
  6. [テーブル デザイン]タブから[テーブル名]を郵便番号テーブルにする

変換スクリプトの用意

seikyusho_sample/convert.py at main · nixeneko/seikyusho_sample · GitHub
変換用のPythonスクリプトを用意した。

実行に必要なのは

である。

使い方

端末やコマンドプロンプト*2を開いて、

python convert.py 請求データ.xlsx --date 2022-01-06

などとすると、processed.xlsxというファイルが出力される。
コマンドラインオプションとして、--dateで日付指定、--min_id, --max_idでIDの範囲指定ができるようにしてある。


一度差し込み印刷のファイルを設定してしまえば、同じファイルパスをであれば請求書テンプレートのWordファイルを開くときに自動で読み込まれるので、請求書出力プロセスは次のようになる。

  1. 入力用Excelファイルへの入力
  2. pythonスクリプトで変換
  3. 請求書テンプレートのWordファイルを開き、差し込みを実行する

というわけで、かなり楽になった。

サンプルのダウンロード

次のリンクからダウンロードできます。
github.com
なお、動作保証等はしませんので、利用される場合は自己責任で行ってください。

さいごに

請求書を手書きからコンピュータ作成に移行しようというところだったので、ついでに適格請求書に対応できるような仕組みを準備した。

取扱商品が少なく固定されている場合は商品ごとに列を用意して数だけ入力するとかにしてもよいし、自分のところで扱っている商品によってシステムを構成することでかなり楽ができる。

効率化していきましょう。

*1:というか、レシートとか見ると税別で計算してる方式の方が多いような気もする。ここら辺正直良くわかってないので調べないといけない…。

*2:手元ではCygwin上のpython3を使って動作確認をしている。