<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002チョ〜入門部屋>クエリを極める
  



 menu

35.数字を漢数字にする

「154000」を「十五万四千」って表示させたい・・・。
これは、はっきりいってできないものと考えたほうが無難だと思います。
だって、漢字ですよ。数値じゃないですよ。コンピュータには理解できないことばかりです。
やめたほうがいい。

どうしても、どうしてもやらなくちゃならない場合は、自分で関数を作ります。
これからわたくし、ものすごくややこしいことを話しますので・・・・・・。
ほんとに、どうしても感じにしなくちゃならないんだ・・・という人だけ、読んでください。

「100」が「一○○」でもよければすぐにできるんですけどね・・・。
単に、数字をそれぞれ漢字に置き換えていけばいいんだし。
でも、「100」を「百」にしたい場合はかーなりめんどくさいです。
「1500」は「千五百」だけど「15000」は「万五千」じゃなくて「一万五千」でしょ?
例外がいっぱいありすぎ。コンピュータには難しいです。
しかも・・・「1500」は、わたしたちの目には「イチゴーゼロゼロ」って数字が並んで見えるだけですけれど、コンピュータ内部ではこう解釈されてるわけじゃないのです。「左から、イチ、ゴー、ゼロ、ゼロ」って数字が並んでるわけじゃないのさ。
数値型のフィールドの値を「左端から順番に漢字に置き換えていく」っていうこと自体、無理なんです。

と、愚痴っても始まらない・・・。とにかく例外がいっぱいあるんで、クエリだけでは無理です。
数字を漢字に置き換える関数を作っておいて、そいつをクエリで使うのがいいでしょう。

「15000」が「一五〇〇〇」と表示されるんでよければ、下のようなコードになります。


売上の金額が何桁か調べ、左端から1文字ずつ数字を読み取って、該当する漢字に置き換えているだけなんですけどね。
で、このコードをどうするかは、「34.」の下のほうの解説を参考にしてください。モジュールの中に貼り付ければすぐ使えるようにはなってます。まあ、今回はクエリの作り方がメインで、コードの書き方とかはオマケなので・・・。
そしてその後、クエリの中で使うわけなんですが・・・。

こんなふうにします。↑まあ、ふつうの出来合いの関数なんかと同じように使えるってわけなんです。
結果は↓こんな感じ。

うーん・・・。
まあ、これでも、使えないことはないかな・・・。



ただこれだと、「一万五千」という表示にはなりません。
これを満たすためには血のにじむような努力をしないとなりませんのです。
わたしも以前作ったことがありますので・・・。コードをそのまま下に載せますので、使ってみてください。
以前作ったもので、Access2000の「物置」というところに置いてるDBの中に置いてあるものです。
遊びで作ったもんなので「72桁まで対応」。なのでかなり処理が複雑です。でもまあ、そこそこ使えると思います。
かなり長いです。↓スクロールしますのでうまいことドラッグしてコピーしてください。
「15000」を「一万五千」とする関数です。

でも多分もっとすっきりと実用的な作り方を解説している本とか、あると思う(ないかな〜)ので探してみてください。

で、同じように、クエリの中でこんなふうに使います↓

本来ならこのように↑、[売上]の値をそのまま関数に渡して使いたいところなんですが・・・。
本来なら、これでオッケーなんですよ。そのまま使えると思います。
[売上]のデータ型を「長整数型」か「通貨型」にしていれば、以下の注意事項は読む必要はございませんです。
どうがんばっても15桁くらいまでしか入力できませんからね。問題は起こらないと思います。

今回ですね、使っているこのテーブルなんですけど、ちょっと遊び心を盛り込みたくて、[売上]にとてつもない金額が入ってるんですよね。しかも、データ型を「倍精度浮動小数点」にしてるので、入力しようと思えば308桁くらいまで入力できちゃいます。
それでも、売上の金額が999兆999億999万9999円を超えなければ(1000000000000000円未満)、特に問題は起こらないんですが、16桁以上になると「指数表示」になってしまうため、「1.0e+16」 という値が関数にわたってしまいます。
どうやらここでイタタタタになるらしいです。
ふつうは、16桁以上の数値なんか入力することもないでしょうから、こんなに気にすることはないと思いますけど、うっかり手が滑って・・・ってこともありますし・・・。

最初にお話したとおり、「数値」と「数字の並び」は、コンピュータ的には異なります。
このままだと、うっかり桁を間違えてとんでもない金額を入力してしまった場合、eとか+とかいう文字や記号まで関数に渡ってしまい、「型が一致しません」というエラーがガシガシ出てウザイです。

[売上]のデータ型を倍精度浮動小数点型にしている場合は、[売上]の金額を直接渡さないほうがよいでしょう・・・。
っていうか、倍精度浮動小数点型にする必要なんて、普通はないですよね。長整数型か通貨型にしておけばいいんだ・・。
すいません、わたしが面白がって変なテーブルを作ったばっかりに・・・しくしく(うそ泣き)

実際、16桁なんていう数値をテーブルの中に持つことはできないと思いますが・・・万全を期すならば、format関数とか使ってあらかじめ「数字の並び」にしておくのがよいと思います。

たとえば、こんな感じ↑

結果は↑こうなります。
式1の方は幅を狭めてしまえば、あまり気にならないのではないでしょうか。。。。
(関数に渡すので、式1を非表示にするわけにはいかないのですよこれが)

これならば、とりあえず桁が大きい数字を入れても、エラーにはならないと思います。

新規レコードとして何か入力して試してみるなら、主キー入力してくださいよ。
[番号]空っぽのままじゃ、エラー出ますからね

大変でやんしょ?
オススメは・・・よっぽどのことがない限り、漢字にするなんて、やらないことです。
いやマジで。大変です。