公認会計士がプログラミングで請求書作成フロー構築に挑む!

私は公認会計士・税理士であって、ノンプログラマーではあるのですがプログラミングへの情熱が止みません。。!もう会計や管理業務周りで煩雑な業務をしたくない。。

MFやFreeeでの請求書作成ポチポチ作業に嫌気がさして、重い腰を上げて請求書をマクロで作り上げていく過程を全力公開してみます!

請求書作成オススメ業務フロー図解

請求書作成システムへの手入力、ダメ絶対><

例えば、弊所で当初使用していたfreee請求書のUIは以下の画面の通りです。

ポチポチ作業めっっちゃ面倒。。><

請求書をシステム上でポチポチと入力していくという仕様になっており、紙ベースの請求書に手書きにて記載していくのとあまり操作感が変わりません。泣入力しながら紙ベースの請求書のプレビューができて確認する仕様のためこういった操作感になるのだと思います。

特に個人的には請求日や入金期日をシステム上のカレンダーで該当日付をクリックする必要があるのが無駄が多いと感じます、

請求日はまだデフォルトで当日の日付が入るのですが、入金期日は完全に手入力。。ここのポチポチが毎回面倒なんです、、(><)

入金期日はおおよそ規則性がある(請求日の当月末、翌月末等)ため、ここは是が非でも自動化したいところです!

請求書作成手順

①請求書フォーマットとそちらへ転記する用のデータベース作成

それでは、Excelベースで仕組みを作成してみましたので、以下にてサンプルを書いていきます。

A.まずこういったデータベースを蓄積していくシートを作成します。

ポイントは

日付の列は本日であれば、Ctl+;のショートカットキーにて即入力

入金期日の列であれば、下記画像のようにEOMONTH関数を入れておき、日付の列に連動して自動入力を図ります。

※()の部分については

(,0)であれば当月末

(,1)であれば翌月末

の日付となります。

B.次にinvoice(請求書)シートの仕組みを構築します。

ポイントは全てdataシートから転記するのではなく、Excelに入力しておいた方が良い以下の赤枠部分に関しては

既に固定情報を入力OR計算式を入力しておくようにします。このようなシートです。

②シート間で情報を転記するマクロの作成

マクロの精緻な解説はここではひかえますが、現代ではAIとのやり取りで何とか動くものを生み出せる良い時代です!

今回のコードもAIとGoogle検索を駆使して作りました!以下のようなコードです。

Sub 請求書を個別にPDF出力()

    Dim i As Long
    Dim lastRow As Long
    Dim dataWs As Worksheet
    Dim invoiceWs As Worksheet
    Dim savePath As String
    Dim fileName As String

    ' シート設定
    Set dataWs = Worksheets("data")
    Set invoiceWs = Worksheets("invoice")

    ' 最終行を取得(A列にデータがある想定)
    lastRow = dataWs.Cells(dataWs.Rows.Count, 1).End(xlUp).Row

    ' 保存先(例:デスクトップ)
    savePath = Environ("USERPROFILE") & "\Desktop\請求書PDF\"

    ' フォルダが無ければ作成
    If Dir(savePath, vbDirectory) = "" Then MkDir savePath

    ' データ行を1件ずつ処理
    For i = 2 To lastRow ' 1行目は見出し

        ' データを請求書に転記(必要に応じて調整)
        invoiceWs.Range("A5").Value = dataWs.Cells(i, 1).Value ' 郵便番号
        invoiceWs.Range("A6").Value = dataWs.Cells(i, 2).Value ' 住所
        invoiceWs.Range("A7").Value = dataWs.Cells(i, 3).Value ' 請求先名
         invoiceWs.Range("B24").Value = dataWs.Cells(i, 4).Value ' 項目
         invoiceWs.Range("D24").Value = dataWs.Cells(i, 5).Value ' 金額
         invoiceWs.Range("D5").Value = dataWs.Cells(i, 6).Value ' 請求日
         invoiceWs.Range("D7").Value = dataWs.Cells(i, 7).Value ' 入金期日

        ' PDFファイル名を作成(例:氏名_日付.pdf)
        fileName = savePath & _
                   "請求書_" & dataWs.Cells(i, 1).Value & "_" & Format(dataWs.Cells(i, 2).Value, "yyyymmdd") & ".pdf"

        ' PDF出力
        invoiceWs.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            fileName:=fileName, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False

    Next i

    MsgBox "全ての請求書をPDF出力しました!", vbInformation

End Sub

→こちらのマクロを実行すると取引先ごとのPDFファイルを作成できました!「全ての請求書をPDF出力しました!」のポップアップが出ると成功です!!

→こちらのフォルダ上にPDFが3つ生成されており、開くと、、

→無事に作成できてますね!

プログラミングはエラーとの戦いは大変ですが、思い通りに動いてくれると相当感動するので一度是非トライしてみてくださいね。今は生成AIがあるのでノンプログラマーにもかなり門戸は開かれていると感じます!!

ご参考までにマクロの動きのイメージ動画は以下となります!(音声はなしのイメージ操作画面のみです)

※前半部分はフォーマットの紹介で、余分なデータを削除しております。

やや上級編

1つの取引先に対して請求書の項目が1つであれば、上記の方法にて実施できるのですが、請求書の項目を複数出したい場合はこちら。

Sub invoice()
'データが複数行ある場合の貼り付け位置
Dim n
n = 21
'選択した部分で繰り返す
Dim i As Long
For i = Selection(1).Row To Selection(Selection.Count).Row
    '最初の行または上のデータと請求書番号が違う場合
    Dim createNewSheet As Boolean
    createNewSheet = False
    
    If i = Selection(1).Row Then
        createNewSheet = True  '最初の行は必ず新しいシートを作成
    ElseIf i > 1 Then
        '前の行と比較(i > 1の場合のみ)
        If ThisWorkbook.Worksheets("data").Range("a" & i).Value <> ThisWorkbook.Worksheets("data").Range("a" & i - 1).Value Then
            createNewSheet = True
        End If
    End If
    
    If createNewSheet Then
        '選択したデータのうち最初の行なら新規ブックへひな形をコピー
        If i = Selection(1).Row Then
            ThisWorkbook.Worksheets("master").Copy
        Else
            'そうでなかったら同じブックでシートをコピー
            ActiveSheet.Copy after:=Worksheets(Worksheets.Count)
            Range("b20", "e37").ClearContents
            '貼り付け位置リセット
            n = 21
        End If
        'データの転記
        Range("e1").Value = ThisWorkbook.Worksheets("data").Range("a" & i).Value
        Range("f1").Value = ThisWorkbook.Worksheets("data").Range("b" & i).Value 'コード
        Range("e5").Value = ThisWorkbook.Worksheets("data").Range("d" & i).Value '発行日
        Range("e8").Value = ThisWorkbook.Worksheets("data").Range("e" & i).Value '支払期限
        Range("b20").Value = ThisWorkbook.Worksheets("data").Range("f" & i).Value '項目
        Range("c20").Value = ThisWorkbook.Worksheets("data").Range("g" & i).Value '内容
        Range("e20").Value = ThisWorkbook.Worksheets("data").Range("h" & i).Value '金額
        ActiveSheet.Name = ThisWorkbook.Worksheets("data").Range("a" & i).Value & ThisWorkbook.Worksheets("data").Range("c" & i).Value  'シート名
    Else
        '上のデータと請求書番号が同じ場合
        Range("b" & n).Value = ThisWorkbook.Worksheets("data").Range("f" & i).Value '項目
        Range("c" & n).Value = ThisWorkbook.Worksheets("data").Range("g" & i).Value '内容
        Range("e" & n).Value = ThisWorkbook.Worksheets("data").Range("h" & i).Value '金額
        n = n + 1
    End If
Next

'■請求書PDFの作成
Dim w
'それぞれのシートをPDFとして保存
For Each w In Worksheets
    w.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\" & w.Name & "様 請求書" & ".pdf"
Next
'作成したExcelを閉じる
ActiveWorkbook.Close savechanges:=False
End Sub

以下のサービスメニューにて、本件のような業務自動化について個別のケースに即した相談についても承っております、

単発でのご利用も大歓迎です。

編集後記

1回きりの作成だとさほど手間を感じないため、つい手作業でやってしまいがちなのですが

今後何回実施するのであろうというこういった繰り返しの反復作業とプログラミングの相性は抜群です!

目の前で追われている作業を終わらせることに気を取られすぎずに、踏ん張って業務自動化の構築を試みていきたいですね!(自戒を込めて。。)

1日1新

VS CODE(プログラミングコードを編集して作っていくためのコード用EDITOR。これをいじっているとプログラマー気分に近づいてテンションあがるためオススメです!笑)


PAGE TOP