2020年9月23日水曜日

減価償却費の計算用スプレッドシート(定額法・平成19年4月1日以後取得の資産に対応)

減価償却費の計算用スプレッドシートを作ってみました。計算と減価償却資産ごとのシートの作成はGAS(Google Apps Script)で自動化しています。手作業で計算するととても面倒ですからね。

平成19年4月1日以後に取得した減価償却資産を定額法を用いて計算する場合に使うことができます。

スプレッドシートやエクセルでは減価償却費の計算(定額法)をするSLN関数が用意されていますが、これはそのまま使うとずれるのですね。なので、計算式は自分で作る必要があります。


① スプレッドシートのダウンロード




PCでGoogleアカウントにログインした状態で、リンク先にて「ファイル」から「コピーを作成」で編集可能なファイルが作成されます。エクセルで使いたい方はファイル作成後にMicrosoft Excel(.xlsx)形式でダウンロードすれば使えると思います。

スプレッドシートには「参照」「減価償却費データ」「減価償却資産リスト」「1サンプル」というシートが含まれています。

次にGASのコードの作成を行います。


② コードの作成

スプレッドシートの「ツール」→「スクリプト エディタ」からスクリプトファイルを作成します。コードは以下の通りです。

function depreciableAssets() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName("減価償却資産リスト");
  var lastRow = sheet.getLastRow();
  
  var num = sheet.getRange(lastRow, 1).getValue(); //管理番号 
  var name = sheet.getRange(lastRow, 2).getValue(); //資産名称
  var acc = sheet.getRange(lastRow, 3).getValue(); //勘定科目
  var date = sheet.getRange(lastRow, 4).getValue(); //取得年月日  
  var year = Utilities.formatDate(date, "JST", "yyyy"); //取得年
  var month = Utilities.formatDate(date, "JST", "MM"); //取得月
  var life = sheet.getRange(lastRow, 5).getValue(); //耐用年数
  var ratio = sheet.getRange(lastRow, 6).getValue(); //事業専用割合
  var qty = sheet.getRange(lastRow, 7).getValue(); //数量
  var price = sheet.getRange(lastRow, 8).getValue(); //単価
  
  var depreciation = qty * price; //取得価格(償却費)
  var rate = "=VLOOKUP(E" + lastRow + ",'参照'!$A$2:$B$100,2,FALSE)"; //償却率
  var expense = depreciation * ratio; //経費算入額
  var months = 13 - month; //初年償却月数
  
  sheet.getRange(lastRow, 9).setValue(depreciation);
  sheet.getRange(lastRow, 10).setValue(rate);
  sheet.getRange(lastRow, 11).setValue(expense);
  sheet.getRange(lastRow, 12).setValue(months);
  
  rate = sheet.getRange(lastRow, 10).getValue();
    
  spreadsheet.insertSheet(num + name);
  var newSheet = spreadsheet.getSheetByName(num + name);

  newSheet.getRange(1, 1).setValue("管理番号");
  newSheet.getRange(1, 1).setBackground("#d9ead3");
  newSheet.getRange(1, 2).setValue(num);
  newSheet.getRange(1, 1, 1, 2).setBorder(true, true, true, true, true, false);
  
  newSheet.getRange(3, 1).setValue("資産名称");
  newSheet.getRange(3, 1).setBackground("#d9ead3");
  newSheet.getRange(3, 2).setValue(name);
  newSheet.getRange(4, 1).setValue("勘定科目");
  newSheet.getRange(4, 1).setBackground("#d9ead3");
  newSheet.getRange(4, 2).setValue(acc);
  newSheet.getRange(3, 3).setValue("取得年月日");
  newSheet.getRange(3, 3).setBackground("#d9ead3");
  newSheet.getRange(3, 4).setValue(date);
  newSheet.getRange(4, 3).setValue("耐用年数");
  newSheet.getRange(4, 3).setBackground("#d9ead3");
  newSheet.getRange(4, 4).setValue(life);
  newSheet.getRange(3, 5).setValue("事業専用割合");
  newSheet.getRange(3, 5).setBackground("#d9ead3");
  newSheet.getRange(3, 6).setValue(ratio);
  newSheet.getRange(3, 6).setNumberFormat("0%");
  newSheet.getRange(4, 5).setValue("償却率");
  newSheet.getRange(4, 5).setBackground("#d9ead3");
  newSheet.getRange(4, 6).setValue(rate);
  newSheet.getRange(4, 6).setNumberFormat("0.000");
  newSheet.getRange(3, 1, 2, 6).setBorder(true, true, true, true, true, true);

  newSheet.getRange(6, 1).setValue("経過年数");
  newSheet.getRange(7, 1).setValue("1");
  newSheet.getRange(6, 2).setValue("対象年");
  newSheet.getRange(7, 2).setValue(year);
  newSheet.getRange(6, 3).setValue("数量");
  newSheet.getRange(7, 3).setValue(qty);
  newSheet.getRange(6, 4).setValue("単価");
  newSheet.getRange(7, 4).setValue(price);
  newSheet.getRange(7, 4).setNumberFormat("[$¥-411]#,##0");
  newSheet.getRange(6, 5).setValue('="取得価格"&CHAR(10)&"(償却費)"');
  newSheet.getRange(7, 5).setValue(depreciation);
  newSheet.getRange(7, 5).setNumberFormat("[$¥-411]#,##0");
  newSheet.getRange(6, 6).setValue("経費算入額");
  newSheet.getRange(7, 6).setValue(expense);
  newSheet.getRange(7, 6).setNumberFormat("[$¥-411]#,##0");
  newSheet.getRange(6, 7).setValue("初年償却月数");
  newSheet.getRange(7, 7).setValue(months);
  newSheet.getRange(6, 8).setValue('="対象年"&CHAR(10)&"経費算入額"');
  newSheet.getRange(7, 8).setValue("=ROUND((F7*F4)*G7/12,0)");
  newSheet.getRange(7, 8).setNumberFormat("[$¥-411]#,##0");
  newSheet.getRange(6, 9).setValue('="対象年末"&CHAR(10)&"未償却残高"');
  newSheet.getRange(7, 9).setValue("=F7-H7");
  newSheet.getRange(7, 9).setNumberFormat("[$¥-411]#,##0");
  newSheet.getRange(6, 10).setValue("備考");   
  for(var i = 1; i < 11; i++){
    newSheet.getRange(6, i).setBackground("#d9ead3");
    newSheet.getRange(6, i).setHorizontalAlignment("center");
  }
  newSheet.getRange(6, 1, 1, 10).setBorder(true, true, true, true, true, false);

  newSheet.getRange(8, 1).setValue("=$A7+1"); //経過年数
  newSheet.getRange(8, 2).setValue("=$B7+1"); //対象年
  newSheet.getRange(8, 8).setValue("=ROUND(IF((I7-(F7*F4))<=0,(((F7*F4)+(I7-(F7*F4))))-1,(F7*F4)),0)"); //対象年経費算入額
  newSheet.getRange(8, 8).setNumberFormat("[$¥-411]#,##0");
  newSheet.getRange(8, 9).setValue("=IF((I7-H8)<=0, 1,(I7-H8))"); //対象年末未償却残高
  newSheet.getRange(8, 9).setNumberFormat("[$¥-411]#,##0");
  newSheet.getRange(7, 1, 1, 10).setBorder(true, true, false, true, true, false);

  life = life + 1;
  
  var row1 = 8;
  var row2 = 7;

  for(var j = 1; j < life; j++){
    newSheet.getRange(row1, 1).setValue("=A" + row2 + "+1"); //経過年数
    newSheet.getRange(row1, 2).setValue("=B" + row2 + "+1"); //対象年
    newSheet.getRange(row1, 8).setValue("=ROUND(IF((I" + row2 + "-(F7*F4))<=0,(((F7*F4)+(I" + row2 + "-(F7*F4))))-1,(F7*F4)),0)"); //対象年経費算入額
    newSheet.getRange(row1, 8).setNumberFormat("[$¥-411]#,##0");
    newSheet.getRange(row1, 9).setValue("=IF((I" + row2 + "-H" + row1 + ")<=0, 1,(I" + row2 + "-H" + row1 + "))"); //対象年末未償却残高
    newSheet.getRange(row1, 9).setNumberFormat("[$¥-411]#,##0");
    newSheet.getRange(row1, 1, 1, 10).setBorder(true, true, true, true, true, false);
    newSheet.getRange(row1, 1, 1, 10).setBorder(true, null, null, null, null, null, "#000000", SpreadsheetApp.BorderStyle.DOTTED);
    
    if(newSheet.getRange(row1, 9).getValue() == 1){
      break;
    }
    
    row1 = row1 + 1;
    row2 = row2 + 1;
  }
  
  newSheet.protect().setWarningOnly(true); //シートの保護
  
  sheet.getRange(lastRow, 13).setValue('=IFERROR(VLOOKUP(YEAR(NOW())-1, INDIRECT(TEXTJOIN("", TRUE,A' + lastRow + ',B' + lastRow + ')&"!$B:$H"), 7,FALSE), 0)');
  sheet.getRange(lastRow, 14).setValue('=IFERROR(VLOOKUP(YEAR(NOW())-1, INDIRECT(TEXTJOIN("", TRUE,A' + lastRow + ',B' + lastRow + ')&"!$B:$I"), 8,FALSE), 1)');
  sheet.getRange(lastRow, 15).setValue('=IFERROR(VLOOKUP(YEAR(NOW()), INDIRECT(TEXTJOIN("", TRUE,A' + lastRow + ',B' + lastRow + ')&"!$B:$H"), 7,FALSE), 0)');
  sheet.getRange(lastRow, 16).setValue('=IFERROR(VLOOKUP(YEAR(NOW()), INDIRECT(TEXTJOIN("", TRUE,A' + lastRow + ',B' + lastRow + ')&"!$B:$I"), 8,FALSE), 1)');

}

まるっとコピペで使えるかと思います。

GASの初回実行時に承認が必要となります。無料のGoogleアカウントの場合「このアプリは確認されていません」というページが表示されます。ここで「安全なページに戻る」をクリックすると実行できませんので、「詳細」→「プロジェクト名(安全ではないページ)に移動」から承認します。


(もう少しさっぱりしたコードにできないものかと思いつつ、まぁとりあえず動けばいいでしょう。笑)


③ スプレッドシートの使い方

・「参照」シート

他シートからの参照用に定額法の償却率と勘定科目が入っています。はじめにD2:D11の範囲に必要となる勘定科目を入力してください(必要ないものは消してください)。


・「減価償却費データ」シート

自動で勘定科目ごとの資産数、償却費、経費算入額、前年経費算入額、前年末未償却残高、当年経費算入額、当年末未償却残高が表示されます。入力はありません。


・「減価償却資産リスト」シート

管理番号、資産名称、勘定科目、取得年月日、耐用年数、事業専用割合、数量、単価の8項目の入力をします(黄色のセル)。数字は全て半角です。勘定科目は「参照」シートに記載した科目をプルダウン リストから選択します。

8項目入力後、先ほど作成したGASのdepreciableAssets関数を実行します。「減価償却資産リスト」シートの取得価格(償却費)、償却率、経費算入額、初年償却月数、前年経費算入額、前年末未償却残高、当年経費算入額、当年末未償却残高が入力され、管理番号と資産名称をくっつけた名前で個別のシートが作成されます。「1サンプル」シートが例になります。

個別のシートでは耐用年数に応じて残存価格1円になるまでの対象年経費算入額と対象年末未償却残高が表示されます。



④ 注意点

depreciableAssets関数は新しい減価償却資産の入力毎に実行してください。複数資産をまとめて実行することはできません。

管理番号は重複しないように気をつけてください。

減価償却資産を除去する場合には、個別のシートと「減価償却資産リスト」シートの対象の行を削除してください。

自分でも使っていますので計算ミス等は無いように注意して作っていますが、実際にお使いになる際にはご自身でよくご確認ください。


***

自営業にとって毎年の確定申告は経営状態を把握する良い機会ですからね。正確に、かつできる限り省力化していきたいところです。

今年は領収証等も都度フォームで入力→自動で合計残高試算表作成という形にしたので、年明けとともに申告の準備が整う予定です。

(そううまくいくだろうか。笑)