独立して以降、会計ソフトなどから残高試算表を推移表形式で出力し、Excelで加工を行って報告資料などとして使用しています。
よくやる作業としては会計ソフトに入力し確定させた毎月の実績値から、今後の見通しなどを会社の代表者と相談しながら予想し、1年間の収支の予想を計画・作成し、作成した予想の金額に基づく納税予測や納税の計画などもサービスとして提供しています。
個人事業主やフリーランスの人であれば、毎年1月1日から12月31日までの1年間が事業年度になり、この期間に関して、経理をしていくことになりますから、例えば1月から6月までは会計ソフトなどにデータ入力が完了し、売上や経費などの数値が確定している場合、その確定した数値をもとに7月~12月までの(まだ数字が確定してない)今後の数字を予測する。といったイメージになります。
作業としては、Excelを画面に表示したうえで代表者から今後の事業の予定や見通しなどの話を伺い、それらを参考にして予想の数値入力し、入力した数値をパソコンの画面でその場で確認してもらっています。
手作業でも全く問題はないのですが家賃や、税理士報酬、サブスクリプションサービス、水道光熱費など、毎月定額のものや、定額ではないけど毎月大きな変動がないものについては、ある程度入力作業を自動化し、予想の収支を作成する際の「たたき台」にできれば便利かなと思いました。
で、自動化する場合はどのようにしたらよいか生成AIなどの力を借りながら考えて作ってみたので、その過程や考え方を記事にしてみようと思います。
会計ソフトなどから出力した推移表の金額をもとにして、平均値か中央値で予測の収支金額を入力するExcelマクロのイメージ
文章でやりたいことをつらつらと書いてきましたが、文章だけだとイメージが掴みにくいところがありますので、マクロの実行動画を作ってみました。
実際に動作しているところを見ていただく方がやりたいことの理解が早いかと思います↓
前提条件としては会計ソフトから出力した残高試算表等の金額を、推移表形式のひな型に貼り付けた状態でマクロを実行し、まだ金額が確定してない部分(動画であれば7月~12月分)の予想をそれまでの「平均値」または「中央値」のどちらが好きな方で作成する。といったマクロになります。
会計ソフトなどで特定の月まではデータ入力が完了し、金額が確定した状態でデータを出力することを前提しているので、
売上は6月まで入っているが、経費については4月までしかはいっていない。という状態は想定はしていませんが、仮にそういった場合においても予測で金額を入力ことができるように、一応設定をしています。
(動画の方の35秒以降部分を見てもらえれば確認できます)
会計ソフトなどから出力した推移表の金額をもとにして、平均値か中央値で予測の収支金額を入力するExcelマクロコードとその内容
今回生成AIなどを参考にしながら作成したマクロが下記のコードになります↓
Option Explicit
Sub 平均を計算して表示()
'■実績の収支金額を元にして平均値や中央値で予想の収支推移表を作成するマクロ
'変数宣言
Dim i As Long
Dim rng As Range
Dim choice As Long
Dim account_name As String
Dim lastrow As Long
lastrow = Cells(Rows.Count, 2).End(xlUp).Row
'■処理実行部分
For i = 3 To lastrow
account_name = Range("b" & i).Value 'B列に記載された勘定科目名を変数へ格納
Set rng = Nothing '変数を初期化
On Error Resume Next
'C列~N列のうち空白になっているセルを変数に格納する。
Set rng = Range(Range("c" & i), Range("n" & i)).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Range("t" & i).Value = "no" Then 'T列に「no」と入力されている場合
'※粗利益や小計などの集計項目については収支予測は行わない。
'予想不要のデータの場合、T列に「no」と入力する
ElseIf rng Is Nothing Then 'C列~N列のうち空白セルがない場合
MsgBox "【" + account_name + "】には空欄がないため予想収支を作成しません。"
Else
rng.Select
choice = MsgBox("【" + account_name + "】の予想について、平均値か中央値を選択してください" _
& vbCrLf & "平均値で予測する:はい(Y)をクリック" _
& vbCrLf & "中央値で予測する:いいえ(N)をクリック" _
& vbCrLf & "予測しない場合:キャンセルをクリック", vbYesNoCancel + vbInformation)
Select Case choice
Case vbYes
rng.Value = Range("r" & i).Value '平均値(R列で計算した金額)で予想金額作成
rng.Interior.ColorIndex = 36
Case vbNo
rng.Value = Range("s" & i).Value '中央値(S列で計算した金額)で予想金額作成
rng.Interior.ColorIndex = 34
Case vbCancel
' 処理スキップ(何もしない。次の勘定科目へ)
End Select
End If
Next i
MsgBox "予想金額の入力完了", vbInformation
End Sub
大まかな流れとしては会計ソフトなどから出力した実績値の推移データをExcelに貼り付けたタイミングで平均値や中央値をエクセルのセルで計算させておき、その計算結果を使って予想の金額を入力して行く形になります。

関数でできることはエクセルの関数上で表現しておき、その結果を使ってマクロを動かして行きます。
マクロだけですべてを完結することももちろんできますが、私はそちらよりもExcel上でできる処理はマクロを使わずにExcelで処理をしておく方がシンプルかつ分かりやすいと感じるのでこの方法を採用しています。
また、粗利益や利益の金額を差し引きで計算したり、経費の合計を出したりする列は今後の金額を予想をするセルではなく、すでに計算式が入力されている行です。こういった行に関しては別途、セルで目印を付けておくことでマクロの動作の対象から外すように設定しています↓

空白セルを探し出す。SpecialCells(xlCellTypeBlanks)
予想の金額を入力するセル(データが入力されていない空白セル)をどうやってマクロで判定させるかについてですが、SpecialCells(xlCellTypeBlanks)というコードを書くことで指定した範囲(C列~N列の間で)で空白のセルを探し出しています。
この部分です↓

こうすることでC列からN列までを選択した状態で空白のセルのみを選択することができます。
手動でやる場合だとこの下の画像のやりかたで空白セルを選択する方法がありますが、これと全く同じ動作になります↓

msgboxで「平均値」で予測するか「中央値」で予測するか、何もしないかを選ぶ。
今後の金額を予測するにあたって、勘定科目ごとに「平均値」で予測するのか、それとも「中央値」で予測するのかをわけたほうがいいと思ったのでその機能を追加しています。
基本的には「平均値」で今後の予測金額として採用してもいいのですが、普段は金額が少ないのにたまたま大きな金額が発生することもあります。
例えば修繕費や租税公課などがあげられると思います。
普段はまったく金額が発生しないけど、たまに発生する。そして発生したらまぁまぁ金額が大きい。そんなやつです。
こういった科目は平均値で予測金額を作成すると、実態にそぐわないことがあるので、そういった科目の場合には中央値を予測金額として採用するほうがよいです。

この部分をマクロで表現しているのが↓の部分です

マクロを実行すると↓のメッセージボックスが表示されるようにしておき、その選択に応じてその後の動作を変化させています。

selectcaseステートメントに関しては↓の記事を参考にしていただければと思います。

余談 ある程度マクロを書いたら生成AIに投げて採点・よりよい提案をしてもらう
少し話がそれますが、自分の場合ある程度マクロを書いた状態でコードを生成AIに投げて採点してもらって改善点などを把握し、コードを訂正する作業をしています。
今回のコードも初回でこのように作成できていたわけではなく、おおまかにやりたい動作が実現できた時点でChatGPTに採点させたところ、78点でした。

採点後に改善点などのコメントをChatGPTがくれますので、自分のなかで「アリ」だなと思った部分をコードに追加していく作業を繰り返して、最終的90点くらいになったものが今回の記事のコードになりました。
採点してもらって改善するための手段として生成AIは有効です。
まとめ
会計ソフトから出力した推移表のデータを利用して今後の予測収支をExcelで作成する際に、収支予測のたたき台として「平均値」または「中央値」で金額を入力するマクロに関して記事にしました。
正直、毎日おこなう作業ではないのでマクロを使わずにショートカットキーなどを使って手作業でやってもいいと思います。お好みで参考にしていただければ。
【本日の近況報告】
ザ・パーフェクト黒ラベルというサッポロビールを体験しました。特にこだわりはないのですが、ビールを買うときはサッポロ黒ラベルをよく選ぶので体験してみましたが、泡がクリーミーという違いしか自分にはわかりませんでした。。。
それだけレギュラーの黒ラベルが美味しいということなのでしょうが。
【本日の1曲】
サニーデイ・サービス/今日を生きよう
youtubeでPVが4K版でアップされているのを見つけて聴いたみたらトリコに。
うだるような暑さが続く毎日ですが、そんなときにはこんなゆったりとした1曲が似合います。
夕暮れ時にいかがでしょうか。
