Excelの日付表示がおかしすぎる件


以下の文章を読む人のためにあらかじめ申し上げておくが、私は病的なまでに細かいことが気になって仕方がない。病的と言うか、ある意味本当に病気である。


そんな私が先日、Excelで日付を入力していた。日付は「2008/10/17」のようにスラッシュ区切りで入力していた。


縦に並ぶとスラッシュの位置がちぐはぐになるのに無性に腹が立った。



実は、以前からこの問題が気になってはいたのだが、これに関連して4つの問題があることを知っていたので見送っていた。その4つの問題はどれも激しく私の感情を害するものだ。


説明が長くなるが、私の考えをざっと書いていこう。


■ 1.「ユーザー定義書式でいいじゃん」と言う人がいるかも知れない。


ユーザー定義書式は確かにすぐれた表記を簡易な表記で提供する。
ユーザー定義書式で解決すれば言うことはない。


ユーザー定義書式を制覇しよう(前編)
http://allabout.co.jp/computer/msexcel/closeup/CU20070821A/


ユーザー定義書式を制覇しよう(後編)
http://allabout.co.jp/computer/msexcel/closeup/CU20070828A/


しかし、ゼロサプライは出来てもスペースサプライは出来ないのだ。(スペースサプライなんて言葉聞いたことがないって?そりゃそうだろう。いま私が作った。)


私がやりたいのは、yyyy/dd/mm じゃないんだ。###y/#d/#m なんだ。


y,d,mに対するスペースサプライを何故サポートしないのか。そもそも西暦にゼロサプライは必要か?1900年より以前の西暦を入力することすらない。仮に「0248/01/01 卑弥呼誕生」と書いたとしても、このようにゼロサプライして欲しいとは思わない。いや、そもそも1900/1/0以前の日付というのは入力しても日付として扱われない。そこで、実はyyyという表記はサポートされない。yyyと書けばyyyyの意味になる。また、yyはサポートされる。yyと書けば、西暦の下2桁の意味になる。


まあ、西暦の下2桁表示は使うとしても、日付のゼロサプライなんてサポートしなくていいから y,d,mへのスペースサプライを真っ先にサポートすべきだ。まず、このセンスのなさに無性に腹が立つ。


■ 2. Excelはdefaultでプロポーショナルフォントである


二つ目の問題は、ExcelがdefaultでMS Pゴシックだと言うことだ。


作表して数字を並べて表示することがわかっているソフトでプロポーショナルフォントをdefaultにする神経が理解できない。


でも、プロポーショナルフォントを作った人は、そのへんの事情はわかっていて、MS Pゴシックの数字は実はプロポーショナルフォントでも等幅なのだ。もちろん、半角スペースも等幅にしてある。わざとそうしてあるのだろう。


ところがExcelはまったくそれを駄目にする。わざわざ等幅にしてあるMS Pゴシックの半角スペースを60%ぐらいの幅に勝手に縮めてしまうのだ。そのような特殊な処理をしてくれるのだ。まったく信じられないことをする。


例えば、ユーザー定義書式で 「_e」という半角スペースを入れる表記がある。これを使うと半角スペースが入るが、その半角スペースはきちんと等幅なのだ。だけど、普通の半角スペースは60%ぐらいの幅しかないのだ。何故普通の半角スペースの幅だけ縮めてしまうんだ。Wordですらそんなことは勝手にしないと言うのに!おかしすぎる。


コメント欄で指摘があったので修正。ExcelではなくWordがMS Pゴシックの半角スペースを等幅に補整するが正しい。ExecelもWordと同じようにこの補整をして欲しい。


■ 3. ワークシート関数で何とかする


非表示のセル(例えばL1)に書いて、可視のセルに次のように書いておけばいいじゃないか?と言われるかも知れない。


=YEAR(L1) &"/"& RIGHT(" " & MONTH(L1),2) & "/" & RIGHT(" " & DAY(L1),2)


こんなものは論外だ。


Excelの熟練ユーザーがユーザー定義書式にこだわるのは、Excelの日付も時刻も単なる数値型であり、それがセルの書式設定によって“化けて”表示されていることを知っているからだ。これは、(プログラミングで言うところの)ModelとViewの関係だ。内部的には数値であるがゆえに、日付と時刻との四則演算だって出来るわけだ。その数値型であるところの日付を文字列として表示してしまうと四則演算が出来なくなるし、オートフィルタで「いついつからいついつまで」というような絞り込みが出来なくなる。だから、表示するにしてもExcelが日付として認識してくれる文字列でなければならない。


そこで、なるべくならユーザー定義書式で何とかするべきなのだ。
そのためには、ユーザー定義書式にワークシート関数を使えるようにすべきなのだ。


何故、そういう仕様になっていないのかユーザー定義書式を考えた奴をぶん殴ってやりたくなる。


■ 4. だけど日付として認識する


さらにおかしいことに、(本当にExcelはおかしいことだらけだ)セルに「'2008 / 1 / 25」のように先頭にアポストロフィを入力して明示的にこれが文字列であることを示して、かつ、半角スペースおよび全角スペースを混在させるとする。


何と、Excelはこのけったいな文字列を日付として認識する。(Excel賢すぎる!)


日付として認識している証拠に、このセル(いまA1にあるとして)を参照して「=A1 + 1」などと他のセルで入力してみるといい。次の日付が表示される。驚いたことに、きちんと演算されている。


ユーザー定義書式でスペースサプライをさせてくれないのに("_e"でスペース自体は入れることが出来るが)、parseはきちんと対応しているというこの非対称性に凄く腹が立つ。「なんでこっちをサポートしてそっちをサポートせーへんかな」という激しい苛立ちを感じる。(ひょっとすると他のソフトで書き出したCSVファイルを正しく読み込むための措置なのかも知れない。)


しかし、文字列と明示的に示してあるのに勝手に日付型として取り扱われていると言うのは何だか奇妙ではある。


このからくりはこうだ。Excelでは '+'という演算子は文字列に対しては定義されていない。(Excelでは、文字列の連結には'&'を用いる。) '+'演算子が文字列に対して使われようとすると、Excelは、その文字列を数値としてcast(型変換)出来ないかを試すのである。結果、上記の文字列は日付型にcastすることに成功し、日付型として扱われ、そして日付型に対する '+'演算子の処理が呼び出されるという仕組みになっている。(のだと思う)


ちなみに、日付型は、数値型の派生クラスであり、日付型に対する'+'演算子の振る舞いは単なる数値の加算である。つまり、日付に1を足せば、1日足されるし、0.5を足せば12時間足される。内部的には、日付型の保持する数値は1900/1/0からの経過日数である。2008/10/18なら39739である。このことはセルに39739と入力して表示形式を日付に変更してみればわかる。


■ まとめ


Excelの細かい仕様の数々は本当に私を苛立たせるものだ。まさか日付のスラッシュがちぐはぐにならないように揃えるだけのことがこんなに難しいとは誰も思いもしないだろう。


そして、私にはこの解決方法がわからない。このちぐはぐな位置になっているスラッシュのことが気になって気になって仕方がない。(セルの変更イベントをハンドルして、入力されたものが日付なら、セルの書式を非プロポーショナルフォントにして、「'2008/ 1/ 5」のように変更しても良いが、そこまでしなければならないのだろうか…)



それなのに、これに対して不満を言っている人の話を私は聞いたことがない。私は寝ていてもExcelのスラッシュのことが頭をよぎり、腹が立って仕方がないと言うのに!!ひょっとして驚くほど簡単に解決できたりするんだろうか?みんなはそのテクニックを知っているから、不満を言わないのだろうか?そんなことを考えると悔しくて寝てもいられない。


これが、病的と言うか、ある意味本当に病気であることは私は十分自覚しているので、「いい先生を紹介してあげるよ」とか書いたメールを私に送ってこないように読者の皆様にはお願いする次第であります。