なぜVBAで財務関数を使うのか?
実務において、「あと何回支払えば完済できるか?」「目標金額まで何ヶ月かかるか?」といったシミュレーションは日常的です。Excelのワークシート関数を使えば簡単ですが、VBAで自動化することで、複数の条件を瞬時に比較したり、計算結果を元に帳票を自動作成したりといった「動的なレポート作成」が可能になります。本記事では、財務関数の要である「NPER関数」をVBAから呼び出し、計算を自動化する方法を解説します。
基礎知識:NPER関数とは
NPER(エヌパー)関数は、一定の利率で定期的な支払いを継続した場合の「支払い回数」を求める関数です。
重要なポイントは、キャッシュフローの向き(プラス・マイナス)です。手元から出ていくお金(支払い)は「マイナス」、手元に入ってくるお金は「プラス」として符号を定義します。この符号を間違えると、計算結果がエラーになったり、意図しない数値になったりするため注意が必要です。
実装のポイント
VBAでワークシート関数を呼び出すには、WorksheetFunctionオブジェクトを使用します。
NPER関数の引数は以下の通りです。
1. 利率(月利)
2. 定期支払額
3. 現在価値(借入金や元本)
4. 将来価値(目標額など)
5. 支払期日(期末か期首か)
サンプルプログラム:ローン返済回数計算ツール
以下のコードは、借入額や月々の返済額から、完済までの月数を算出する実用的なプロシージャです。
Sub CalculateLoanTerm()
‘ 変数の定義
Dim rate As Double ‘ 年利
Dim pmt As Double ‘ 月々の返済額
Dim pv As Double ‘ 借入金額(現在価値)
Dim fv As Double ‘ 頭金(将来価値)
Dim months As Double ‘ 返済回数
‘ 値の代入(実際の業務ではセルから取得してください)
rate = 0.015 / 12 ‘ 年利1.5%を月利に換算
pmt = -50000 ‘ 毎月5万円返済(支払うのでマイナス)
pv = 5000000 ‘ 500万円借入
fv = 0 ‘ 最終的な残高
‘ WorksheetFunctionを使ってNPER関数を呼び出す
‘ 第5引数の「0」は期末払いを指定
months = Application.WorksheetFunction.NPer(rate, pmt, pv, fv, 0)
‘ 結果をイミディエイトウィンドウに出力
Debug.Print “完済までにかかる月数: ” & Application.RoundUp(months, 0) & ” ヶ月”
End Sub
応用・注意点
1. 切り上げ処理の重要性:
NPER関数は計算結果を小数で返しますが、実務上の「回数」は整数です。そのため、Application.RoundUp関数などを併用して、端数を切り上げるのが一般的です。
2. 引数の符号:
エラーが出る場合、多くは「現在価値」と「定期支払額」の符号がどちらもプラス(またはマイナス)になっていることが原因です。片方が「受け取り」、もう片方が「支払い」であることを意識してください。
3. エラーハンドリング:
利率が0であったり、支払額が少なすぎて完済できない場合(元金が減らない場合)、関数はエラーを返します。実務コードでは、事前に`If`文で返済額が利息を上回っているかチェックするなどのバリデーションを入れると、より堅牢なツールになります。
このテクニックを活用して、複雑なローンシミュレーションをVBAで一気に解決しましょう!
