【第5回】税務調査も怖くない!Excelで「総勘定元帳」を全自動化する
仕事・効率化
2026.02.09
【第5回】税務調査も怖くない!Excelで「総勘定元帳」を全自動化する【ほねぶとDr.】
【第5回】税務調査も怖くない!Excelで「総勘定元帳」を全自動化する
※はじめに(E-E-A-T対策)
本連載で紹介するExcelの関数および動作環境は、Microsoft 365(最新版)またはExcel 2021以降を基準としています。古いバージョンではFILTER関数などが動作しないためご注意ください。
【これまでのあらすじ】
こんにちは、勤務医大家のほねぶとDrです。
今回が青色申告のためのエクセル講習、ついに最終回です!
前回までに、「仕訳帳(Journal)」に入力するだけで、「決算書(P/L・B/S)」が全自動で作られるシステムを構築しました。
しかし、「青色申告特別控除(65万円)」への道で、最後に立ちはだかる壁があります。それが「総勘定元帳(そうかんじょうもとちょう)」です。
これは税務調査が入った際に「見せて」と言われる最重要書類でもあります。
【今回のゴール】
Excelの最新関数を駆使して、「年号を変えるだけで、過去も未来も参照できる(タイムマシン機能付き)」の最強の元帳を作ります。
💡 「エクセルを作る時間がない!」という方へ
この連載ではエクセルでの自作方法を解説していますが、「正直、数式とか苦手…」「手っ取り早く終わらせたい」という方もいると思います。
「時間をお金で買いたい」 という方は、クラウド会計ソフト(マネーフォワードや弥生など)を使うのが一番の近道です。
- 銀行口座・クレカと連携して自動入力
- スマホでレシートを撮るだけで仕訳完了
- 確定申告書Bなどの提出書類も自動作成
1. 目指すゴール:こんなシートを作ります
今回作る「Ledger(総勘定元帳)」シートの完成形はこれです。
- B1セル: 「2025」などの年号を入力
- B2セル: 「普通預金」などの勘定科目を入力
- 結果: A5行目以降に、その年の、その科目の取引データがズラッと自動表示される。しかも「残高」推移付き。
▼ 必要な環境
Microsoft Excel 2021 または Microsoft 365
※最新のスピル機能(FILTER関数など)を使用するため、古いExcelでは動きません。
2. ステップ1:シートの準備
まず、新しいシートを作成し、シート名を「Ledger」とします。
以下の配置で枠組みを作ってください。
| セル |
入力内容 |
役割 |
| B1 |
2025 |
対象の年数(ここを変えるとデータが切り替わります) |
| B2 |
普通預金 |
見たい勘定科目 |
| A4 |
日付 |
見出し |
| B4 |
相手勘定 |
見出し |
| C4 |
摘要 |
見出し |
| D4 |
借方 |
見出し |
| E4 |
貸方 |
見出し |
| F4 |
残高 |
見出し |
※前提として、別シートに仕訳データが入ったテーブル(前回までに作成した tbl_Journal_2025 など)があるものとします。
3. ステップ2:魔法の数式を埋め込む
ここが核心です。
ExcelのINDIRECT関数とFILTER関数を組み合わせることで、「指定した年のテーブルを見に行き、指定した科目の行だけを引っ張ってくる」処理を実装します。
以下の数式を、それぞれのセルにコピペしてください。
A5セル(日付)
=FILTER(INDIRECT(“tbl_Journal_”&$B$1&”[日付]”), (INDIRECT(“tbl_Journal_”&$B$1&”[借方科目]”)=$B$2)+(INDIRECT(“tbl_Journal_”&$B$1&”[貸方科目]”)=$B$2), “”)
B5セル(相手勘定)
「自分が借方にいる時は貸方の科目を、自分が貸方にいる時は借方の科目を表示する」という処理をしています。
=LET( TableName, “tbl_Journal_” & $B$1, 借方列, INDIRECT(TableName & “[借方科目]”), 貸方列, INDIRECT(TableName & “[貸方科目]”), 対象条件, (借方列=$B$2)+(貸方列=$B$2), 抽出借方, FILTER(借方列, 対象条件), 抽出貸方, FILTER(貸方列, 対象条件), IF(抽出借方=$B$2, 抽出貸方, 抽出借方) )
C5セル(摘要)
データがない場合に「0」と表示されるのを防ぐため、最後に &”” を付けています。
=FILTER(INDIRECT(“tbl_Journal_”&$B$1&”[摘要]”), (INDIRECT(“tbl_Journal_”&$B$1&”[借方科目]”)=$B$2)+(INDIRECT(“tbl_Journal_”&$B$1&”[貸方科目]”)=$B$2), “”) & “”
D5セル(借方金額)
=LET( TableName, “tbl_Journal_” & $B$1, 借方列, INDIRECT(TableName & “[借方科目]”), 貸方列, INDIRECT(TableName & “[貸方科目]”), 借方金額, INDIRECT(TableName & “[借方金額]”), 対象条件, (借方列=$B$2)+(貸方列=$B$2), 抽出借方, FILTER(借方列, 対象条件), 抽出金額, FILTER(借方金額, 対象条件), IF(抽出借方=$B$2, 抽出金額, 0) )
※E5セル(貸方金額)は、上記の「借方」と「貸方」を入れ替えたものを使用します(長くなるため、配布テンプレートで確認してください!)。
4. ステップ3:最難関「残高推移」の自動計算
青色申告の要件として、総勘定元帳には「残高」の記載が必要です。
しかし、「資産(現金など)」は借方で増え、「負債(借入金など)」は貸方で増えるため、単純な足し算では計算できません。
そこで、[第3回]で作ったPL/BSシートからその科目の「区分(資産・負債など)」を読み取り、計算式を自動で切り替えるロジックを組みました。
▼ F5セルに入れて、下までオートフィル(コピー)
=IF(A5=””,””, IFERROR(VLOOKUP($B$2, INDIRECT(“‘PL&BS_”&$B$1&”‘!A:F”), 3, FALSE), 0) + IF(OR(VLOOKUP($B$2, INDIRECT(“‘PL&BS_”&$B$1&”‘!A:F”), 2, FALSE)=”資産”, VLOOKUP($B$2, INDIRECT(“‘PL&BS_”&$B$1&”‘!A:F”), 2, FALSE)=”経費”), SUM($D$5:D5) – SUM($E$5:E5), SUM($E$5:E5) – SUM($D$5:D5) ) )
解説: 「期首残高(VLOOKUP)」+「今の行までの借方累計」-「今の行までの貸方累計」を計算しています(負債の場合はプラスマイナス逆)。
5. 完成!これで何ができるのか?
このシートが1枚あれば、以下のような運用が可能になります。
🕵️♂️ 税務調査対応
調査官に「消耗品費の元帳を見せてください」と言われたら、B2セルを「消耗品費」に変えて印刷するだけ。秒で終わります。
⚠️ 入力ミスの発見
「現金」を選択して、残高がマイナスになっていたら記帳漏れのサインです。
🕰️ 過去の振り返り
B1セルを「2025」に変えれば、一瞬で去年のデータに切り替わります。
6. まとめ:Excelで会計はもっと自由になる
市販ソフトは便利ですが、「ブラックボックス」になりがちです。
自分でシステムを構築すると、お金の動き(借方・貸方)が手に取るように理解できるようになります。何より、自分の事業規模やスタイルに合わせて、機能を無限に拡張できるのがExcelの醍醐味です。
「仕訳帳」さえしっかり作っておけば、あとはExcelが全部やってくれる。
そんな「ほねぶと流・資産管理システム」、ぜひ試してみてください。
*これは不動産所得が、消費税のかからないために簡便にできています。事業所得で消費税の計算が必要などより専門的な知識が必要な場合はうまく作動しない可能性もありますので、会計ソフトを利用することや専門家にご相談ください。
【読者限定】完成版エクセルを無料プレゼント!
作成した「確定申告用エクセルファイル(完成版)」ですが、トラブル防止のため直接の配布は行っておりません。
ご希望の方には個別にファイルをお送りしますので、以下のいずれかの方法でご連絡ください!
※「エクセル希望」と一言メッセージをいただければ、すぐにお送りします。
▼ 参考資料
- [Microsoftサポート] FILTER 関数
- [Microsoftサポート] LET 関数
").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1
").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0
タイトルとURLをコピーしました