間違いだらけのExcel関数ヘルプ
− 財務関数篇 −


 マイクロソフトのExcelといえば、日本だけではなく、世界中のオフィスでもっとも使われているソフトであろう。最近、 仕事で、このExcelのワークシート関数のヘルプを子細に眺める機会があった。その結果わかったのは、「Excelの関数ヘルプは間違い、不適切な説明、わけのわからない造語だらけ」 ということである。
 実は、Excelの統計関数のヘルプについては、既に先人がチェックされていて、その方は「Microsoft Excel の統計関係の関数のオンラインヘルプは『嘘,曖昧,不親切』の 3 語に尽きます。」と書いておられる。(以下のリンク参照)

http://aoki2.si.gunma-u.ac.jp/lecture/stats-by-excel/part1.html
http://aoki2.si.gunma-u.ac.jp/lecture/stats-by-excel/part2.html
http://aoki2.si.gunma-u.ac.jp/lecture/stats-by-excel/part3.html
http://aoki2.si.gunma-u.ac.jp/lecture/stats-by-excel/part4.html
http://aoki2.si.gunma-u.ac.jp/lecture/stats-by-excel/part5.html
http://aoki2.si.gunma-u.ac.jp/lecture/stats-by-excel/part6.html

 しかし、「嘘、曖昧、不親切」なのは統計関数のヘ ルプだけではない。これからその実例を財務関数を例にとって説明してみたい。
 

(1) 住宅ローンの利子支払いが100万円も多くなる!?

 財務関数で、いくつかの関数は、同じ引数(ひきすう、パラメーター→関数 に入力する変数のこと)を使用するものがある。
たとえば、CUMIPMT、CUMPRINC、PV、IPMT関数といった、「定期的な支払い」(定期預金など)に関係する関数の場合、「支払期日」とい う引数を使用している。これは、「定期」の「期」、つまり毎月払いの積み立てやローンの場合、それぞれの月において、「期首」(この例では月初)に支払う のか、「期末」(この例では月末)に支払うのか、という設定をする引数である。

 Excelの関数ヘルプは、この引数について見事なまでに混乱している。下記は筆者が調べた関数毎とExcel2000と Excel2002でのヘルプの説明である。
 


Excel2000 Excel2002
CUMIPMT 0=期首、1=期末 0=期首、1=期末
CUMPRINC 0=期首、1=期末 0=期末、1=期首
PV 0=期末、1=期首 0=期末、1=期首
IPMT 0=期末、1=期首 0=期末、1=期首
 
 ご覧になってわかるように、関数によって設定方法がまったく逆である。なおかつ、CUMPRINC関数についてはVersion毎に違う。また、 CUMIPMTとIPMT関数は名前が似ていることからもわかるように、同じく利子計算の関数である。にもかかわらず設定方法は逆になっている。

 Excel2002ではCUMIPMT関数だけが逆の設定になっている。このヘルプ説明は本当に正しいのだろうか?これは次の手順で簡単 に検証できる。つまり、CUMIPMT関数は、ある期から別の期までの利息額の累計を求める関数であるので、第1期から第1期の利息額、つまり第1期のみ の利息額を求めてみる。この場合、期首払いであれば、第1期の期首であるから利子はまだ発生しないので結果が0になる筈である。では、やってみよう。

10万円を24回払いの年率3%で借りた場合、第1回目の支払いでの利子額は

=CUMIPMT(3%/12,24,100000,1,1,0) → -250
=CUMIPMT(3%/12,24,100000,1,1,1) →   0

(Excel関数では、支払い利子はマイナスになる。)

この関数では、最後の引数が「支払い期日」である。ご覧のように、それを0と1にして実際にExcelに計算させてみると、支払期日=1の 方が利子が0になっている。つまり支払期日が1は「期首」である。ヘ ルプは逆に書いてある!
(筆者が調べた限り、正しいのはすべての関数で「0=期末、1=期首」 )

 こんな引数の設定など、どちらでもよい、と考えたあなたは間違っています。 次のような例で、この引数の設定を間違えると結果がどれだけ違うか確認してください。

たとえば、4000万円の住宅ローンを20年間で支払い、年2回のボーナス月だけでの支払い(1月、7月払い→期首払い)、利率4%とした 場合、利子の累計額は、

=CUMIPMT(0.04/2,20*2,40000000,1,20*2,1) → -17,342,349

これを間違えて、期末払いに設定してしまうと

=CUMIPMT(0.04/2,20*2,40000000,1,20*2,0) → -18,489,196

となり、(この場合利子は支払いなのでマイナスになっている)、なんと1,146,847円と100万円以上も利子支払額が多くなるのである。あなたが住宅ローンを借りている先がExcel使っていたら要注意です。
 
 

(2) マイナスの減価償却費の謎!?
 

 Excelには減価償却費を計算する関数が7種類も用意されている。ABC順に、AMORDEGRC、AMORLINC、DB、DDB、 SLN、SYD、そしてVDBの7つである。このうち、日本で税務署に提出する書類に使用できるのは、定率法のDB関数か、定額法のSLN関数だけであ り、残りの関数は内部で何か特別な目的で使わない限りは不要である。

 とはいえ、これら7つの関数の引数を色々変えて計算してみると面白い結果が出る。共通の引数は以下のようにする。
 

取得価額(B1)  1000000
残存価額(B2)  10000
耐用年数(B3) 10
期間(開始期)(B4) 5
期間(終了期)(B5) 6
月(B6)  12
購入日(B7)  2001/1/30
最初の会計期の終了する日付(B8) 2001/3/30
率(B9)  10%
 結果は以下の通りになる。
 

引数の設定→ 上記のまま 取得価額=0 取得価額=-1,000,000 耐用年数=0 耐用年数
=-10
関数名 戻り値1 戻り値2 戻り値3 戻り値4 戻り値5
AMORDEGRC =AMORDEGRC(B1,B7,B8,B2,B4,B9,0) \75,806 #NUM! #NUM! \75,806 \75,806
AMORLINC =AMORLINC(B1,B7,B8,B2,B4,B9,0) \100,000 #NUM! #NUM! \100,000 \100,000
DB =DB(B1,B2,B3,B4) \81,875 \0 #NUM! #NUM! #NUM!
DDB =DDB(B1,B2,B3,B4,2) \81,920 \0 #NUM! #NUM! #NUM!
SLN =SLN(B1,B2,B3) \90,000 \-10,000 \-110,000 #DIV/0! \-90,000
SYD =SYD(B1,B2,B3,B4) \98,182 \-10,909 \-120,000 #NUM! #NUM!
VDB =VDB(B1,B2,B3,B4,B5) \65,536 \0 #NUM! #NUM! #NUM!

 戻り値2から5までの4つの場合は、すべてエラーとして処理されるべきである。減価償却の対象の設備や機械の価格は当然0より大きくなけ ればならないし、耐用年数も同じである。にもかかわらず、SLN関数やSYD関数はマイナスの減価償却費という不思議な値を返す。こ のように意図的に入力した場合は、当然最初から間違った値だということがわかるが、セル参照で取得価額や耐用年数に値を設定している場合、それらがマイナ スになっても、Excelはエラーだと警告してくれない。そのまま減価償却費を合計して計算している場合にはもっとわからなくなる。要注意である。

 エラーを返す場合も、そのエラーメッセージは一様ではない。ここで検証のため、ヘルプに書 いてあるそれぞれの関数の計算式を眺めてみる。
 

関数名 計算式
AMORDEGRC 説明無し
AMORLINC 説明無し
DB 償却率 = 1 - ((残存価額 / 取得価額) ^ (1 / 耐用年数))
DDB 取得価額 - 残存価額 (前期までの償却費累計額) * 率 / 耐用年数
SLN 説明無し((取得価額-残存価額)/耐用年数)
SYD
VDB 説明無し

 注目すべきはDB関数である。計算式に分数があり、分母に取得価額がある。にもかかわらずこの分母に0を設定してもエラーにならず、\0が値として返っている。ま た、SLN関数とSYD関数は共に分母に耐用年数(life)が設定してある。ここで耐用年数(life)を0にした場合、SLN関数はきちんと#DIV/0!(0除算)エラーを返しているが、SYD関数は #NUM!エラーとなっている。謎の仕様としかいいようがない。
 

(3) 勝手な造語と誤訳のオンパレード!

 Excelには、固定利付き債券(Fixed Income Securities)の価格や利回りを計算する関数がいくつかある。PRICE、YIELD、ODDFPRICE、ODDFYIELD、 ODDLPRICE、ODDLYIELD関数などがそうである。
 固定利付き債券とは、アメリカ国債などが典型例だが、たとえば額面$1000の本券に、さらに定期的に利子を受け取るためのクーポン券がついているもの である。利子は年2回支払われ、クーポンの表面にはこの利子支払日の日付が書かれている。
 このクーポンのことを日本語では利札(りさつ)という。日本国債などにもクーポンがついているものがあり、法律にも出てくる正式な言葉である。ここまで はいいが、Excelヘルプでは、そこから様々な造語を派生させる。次の例は、ODDFPRICE関数のヘルプの一部だが、これを読んで意味がおわかりの 方がおられるだろか。



Ai = 日数が半端な期に含まれる i 番目または最後の準利札期の初日か らの日数
DCi = 発行日から最初の準利札日 (i=1) までの日数、または準利札日の日数 (i=2,..., i=NC)
DSC = 受領日から次の利札日までの日数
E = 利息計算期間の日数
N = 最初の利札日と償還日の間の利息支払回数 (この数値に分数が含まれている場合は、次の整数に切り上げられます)
NC = 日数が半端な期と一致する準利札期の数 (この数値に分数が含まれている場合は、次の整数に切り上げられます)
NLi = 日数が半端な期に含まれる i 番目または最後の準利札期の初日 からの日数 (標準の値)
Nq = 受領日と次の利札日の間の完全な準利札期の数

 ご覧になっておわかりのように、「利札期」、「利 札日」「準利札期」「準利札日」などの聞いたこともない造語を乱発している。これらの単語の定義は、Excelのヘ ルプのどこを見ても書いていない。また、日本で出版されている金融用語辞典などを見ても、これらの言葉は出てこない。さらには、インターネットを検索して みても、Excelの関数の説明をしたページ以外にはこれらの言葉は出てこない。
 なおかつ、「準利札日の日数」(特定の日付の日数)などと、矛盾したことを書いている。つまり、自分で作った用語の使い方すら間違えている。結 果として、このヘルプは何が書いてあるかさっぱりわからない。(たとえ用語が正しく使われていても、説明不足で依然意味不明であるが。)

 MS社になりかわって、これらの単語の説明をしてみる。アメリカ国債などクーポン付きの債 権の場合、通常利子は年2回支払われる。たとえば、6月20日と12月20日のように。この利子支払日(受け取り日)をExcelヘルプでは「利札日」 (Coupon Date)と呼んでいる。また、N回目の利札日からN+1回目の利札日までの期間のことをExcelヘルプでは「利札期」(Coupon Period)と呼ぶ。
 また、通常は、債券の発行日から満期日までは、1年を360日で計算して、180日ごとの利札日 で同じ長さで区切られているが、中には変則的な債券があり、最初の利札期が180日より短かったり長かったりする場合がある。 ODDFPRICE関数は こうした債券を最初の変則的な利札期の間で売買する時に価格を計算する関数である。変則的な利札期がたとえば230日間あった場合、この日数は180日+ 50日と考えれば、もう1回本来なら利札日が含まれていてもいいはずである。こうした仮想の利札日をExcel関数ヘルプでは、「準利札日」(Quasi Coupon Date)と呼ぶ。また準利札日の利札期を「準利札期」(Quasi Coupon Period)と呼んでいる。

 上記説明を読んでおわかりのことと思うが、「準利札日の日数」は当然正しくは「準利札期の 日数」でなければならない。ちなみに、「準利札期の初日からの日数 (標準の値)」とあるのは、同じ(準)利札期の日数といっても、1年を360日とした場合の利子計算上の日数と、実際の日数があり、こちらは利子計算上の 日数ですよ、ということだが、ヘルプの説明では何のことか理解に苦しむ。

 ついでにつけくわえておくと、Excel関数で「利回り」を計算する関数、YIELD、 YIELDMAT、YIELDDISC、ODDFYIELD等々について、すべてアメリカ式複利という方式で計算されている。(受け取った利子を再投資す ると仮定し、その収益も利回りに加える。)通常日本 で使われる利回りと計算方式が異なるので注意が必要である。

 また、固定利付き証券で発行日から受領日までの経過利息を計算する関数で、ACCRINT 関数というのがある。その説明として、次のようなことがヘルプに書いてある。






 ここにも、「準利札期」が登場することからわかるように、この説明は「最初の利札期が半端な日数の債券を発行日から最初の利札日の間に売買する」時のも ので、ODDFPRICE関数が想定している状況と同じである。上記の計算式が成立するためには、発行日<受領日<最初の利札日、の順番でなければならな い。しかしながら、このACCRINT関数で、引数の「受領日」に「最初の利札日」以降の日付を設定してもエラーにならず正しく計算される。従って、上記 のヘルプの数式と説明は特殊な場合にのみ成立するものであり、この 関数全体の説明としては間違いである。さらについでにいうと、この関 数自体の説明として「定期的に利息が支払われる証券の未収利息額を返します。」とあるが、未収利息」(=受け取る予定があるが、まだ受け取っていない利息)も間違い。正しくは「経過利息」(=最後の利札日から受領日までに発生している利息)を計算するための関数。(この関数では1度 では経過利息は計算できない。発行日から受領日までの利息をまず求め、そこから発行日から最後の利札日までの利息を引く。)
 

(4) 手抜きとしか思えない適当な嘘説明!
 

 DOLLARDE関数というのがある。これは 113 25/60 など、アメリカで株価や相場を示すのに使われる分数表示を普通の十進法の表示になおす関数である。

(こうした分数表記が行われた理由についてはhttp://about.reuters.com/japan/trader/backnumber/td_2k1112_77/p48.html
を参照。)

Excelのヘルプは次の通り。


分数で表されたドル価格を、小数表示に変換します。この関数は、
証券の価格のように分数で表された数値を、小数に変更する場合に使用します。

書式

DOLLARDE(分子, 分母)

分子   分数で表された数値を指定します。

分母   分数の分母となる整数を指定します。


上記の説明は大嘘。大体、整数部をどうしたらいいの かまったく説明がない。正しくは、113 25/60 だったら、最初の引数は「整数部+分子部/(10^分母の桁数)」、次の引数が分母の数字で、この場合はDOLLARDE (113.25,60)と設定する。

 ちなみに、 http://msdn.microsoft.com/library/en-us/office97/html/SEB8C.asp?frame=true  にこのヘルプの英語版がある。それによるとこの部分の説明は、



  DOLLARDE(fractional_dollar,fraction)

  Fractional_dollar   is a number expressed as a fraction.

  Fraction   is the integer to use in the denominator of the fraction.



である。意味不明なのはこちらも同じであるが、fractional_dolloar(分数表現のドル)を分子と訳すのは無茶苦茶以外の何ものでもない。
 
 

結論:Excel関数ヘルプは信用してはいけない。

(Excelヘルプだけでなく、市販の解説本もほとんどExcelヘルプの間違いをそのまま孫引きしていることを最後に付け加えておく。そ れから、統計関数、財務関数以外にもたくさん間違いはあるので、機会があればまた取り上げてみたい。)
 

(2002年1月27日)
ホーム