職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

ExcelのMonthName

仕事で見事にハマったのでメモ。

Excelのマクロを書いていました。「Sydneyに来てまでExcelマクロなんか書いてるのかよww」という野次が飛んできそうではありますが、僕としては使いどころさえ誤らなければExcelというのは素晴らしいツールだと考えています。きっと多くの皆さんもそうお考えですよね?

月の名前

さて、本題。
こちらは当然ながら英語圏ですので、作るシステムも英語が基本です。Excelマクロも同様です。英語ですので、月を「9月」とか言うよりも「Sep」と言う方が望まれる場合も多いです。
この場合、マクロの動作としては月の数字を英語の名称に置き換えてあげる必要があります。ここで登場するのが、Excel VBA の MonthName関数。
第一引数には月の数字を取り、第二引数には「省略形」か否かの真偽値を取ります。Trueなら省略形です。便利そうな関数ですね。詳しくはこちら> http://www.techonthenet.com/excel/formulas/monthname.php

困ったこと

僕の職場マシンでの MonthName(8, True) の評価結果は Aug でした。この結果に満足して、出来上がったマクロを(Excel2003でのテストの目的で)同僚のマシンでテストしてみたところ、 MonthName(8, True) の評価結果として 8 が返されていました。
「ちょっ、Excel2003で動作しないんなら、8なんか返さずにエラーで死んでくれよー」
と思いましたが、よくよく調べてみるとこの MonthName という関数は、動作環境のロケール(OSではなくてExcelの)に依存した動作をするようです。Excel2003だから動作しない、という訳ではありませんでした。
試しに日本語のExcelで MonthName(8, False) を評価させてみると「8月」が返されてきます。

WorkAround

Excelの動作環境に依存せずに英語の月名を取るには、 Choose 関数を利用するのが良いかな、と思います。こんなところで switch-case (VBA だと select-case) 文なんて使いたくありませんものね。

動作確認環境

  • 環境1(筆者の職場マシン):Windows7(English) / Excel2007(English)
  • 環境2(同僚の職場マシン):WindowsXP(English) / Excel2003(Japanese)
  • 環境3(筆者の自宅仮想マシン):Windows7(Japanese) / Excel2003(Japanese)

おまけ その1(愚痴)

ここ数ヶ月ほど見ないうちに、Microsoft公式?のExcelVBAリファレンスが「更に」見にくくなった気がします。昔も読みにくくはあったけど、プロパティのデータ型とか必要な情報をきちんと載せてくれてた気がするのです。今ではそういう「リファレンス」が備えているはずの情報が無くなってしまってますね。解説文章だけ、みたいな感じ。
んで、その公式?リファレンスへのリンクをここに貼ろうとしたけど、なかなか見つけられなくて貼れないという(笑)
もしかしてGoogleにおける公式リファレンスのページランクが低くなってるのか…?

おまけ その2

Excelの「使いどころを誤っちゃった」例として、こんなのがありますね。
http://jp.fujitsu.com/platform/server/primergy/pccluster/excel-hpc/
これは富士通さんのサービスですが、まあ、富士通さんは悪くない。悪いのは、こういうサービスを利用せざるを得なくなってしまった顧客。