<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000--VBAの小屋>数字を漢字にする関数
   1  2  3  4  5  6  7  8



たまに、ご質問いただくことがあるんですけれども・・・。

「12000を1万2千って表記させたいんですけど、どうすればいいですか?」

これですねぇ・・・。すっごく難しいんですよ。っていうか、基本的にデキマセン。
漢数字なんて、日本だけのもんですよね。それに、コンピュータって、漢字はワカリマセン。数値としての1と、漢数字の一は、コンピュータの中ではぜーんぜん結びついてないわけです。あたりまえのことなのに、こんなこともできないなんて、ほんとに使えないですよねぇ。
・・・って、ホントに思います???

前に登場した、「年齢を計算させる方法」とかも同じですけど、私たちがすんなり考えつくようなことでも、コンピュータにとっては困難なこと、無理なこともたくさんあるんですよ。Accessがどうのっていう以前のお話ですけどね・・・。

今日は、前回の続きでループのお話をしようと思うんですが、それに変数のお話も加えて、コイツに挑戦してみようかと思います。
でも、はっきりいって超めんどくさいので、どれくらい面倒くさいのか、というところを中心にご覧いただいて、果たして実用に耐えられるものかどうか、検討材料にしてみてください。システム開発において、「妥協」というのも大切な選択肢ですよね。

はっきり言ってめっちゃめちゃ大変です。
っていうか、いろいろ試行錯誤しながらがんばって作ってみますので、あんまり時間がないんだけど・・・という方は、物置きの方に、これから作るものとほぼ同じものを作って載せてます。多少、エラーの回避とか工夫してますので、もしよかったらこちらの方を紐解いてみてください。
でも、超めんどくさいことやってますよー。まったく、ニッポンチャチャチャって感じです。


まず考えなくちゃいけないことは、「数値型のフィールドには、漢字は入らない」ってことです。
まあ、あたりまえといえばあたりまえなんですが・・・。だから、全般的にはテキスト型(String)ということで考えます。これがまずポイントですね。
それと・・・これは、Accessに限らず、コンピュータ全般同様なんですけど、数値型のデータで、「12000」っていうのは、コンピュータの内部では、「1と2とゼロが3つ」という扱いではないのです。これが難しいんですけれど・・・いわゆる、わたしたちが肉眼で見るところの「数値型のフィールドに入っている値の一番右端の桁は、いくつ?」っていう考え方は、根本的にしてないんです<コンピュータって
もっと哀しいことを言ってしまうと、1とか2とかいう数字も、使ってないのです。いわゆる「2進数」ってやつで・・・。それを無理やり10進数にしてもらって、10進数にわざわざ変更してもらった値を、わたしたちは使わせてもらってるんです。
これは、CPUの処理のしくみにつながるお話なので・・・なるほどそういうものなのね、と、この辺で手を打って理解してください。

そういうわけで、数値をテキスト型として扱い、「一の位」ではなくて「一番左端の文字」っていう考え方になります。

それでは、まず、どういう規則性があるか、その辺から見ていきましょう。

1
10 
100
1000
10000 一万
100000 十万
12  十二
240  二百四十
2390  二千三百九十

・・・。
あ・・・わかります?・・・そう、もうすでにイヤになってきているわたし・・・・。
あーわかってますようがんばりますよう。どうやってったらいいか、みなさんも一緒に考えていきましょうよ。ねえ?


とにかく「日本語」って難しいですね。。。
年齢計算のファンクションのときもそうでしたが、これはまた例外と戦わなければならなそうです。

たとえば、

12000
↑これを例にとって考えてみますと・・・これは、5桁ですね。数字が5つならんでいます。

右から、一の位、十の位、百の位、千の位、万の位、です。
その文字が何の位か、という判断は、右から何文字目か、ということで判断できそうです。

そして、一の位が 
"1" なら "一" にします。
"2" なら "二" にします。
"3" なら "三" にします。
"4" なら "四" にします。

そんでもってここがミソ → "0" なら何もしません。

はー・・・これで一の位が終わった。つぎ、十の位。つまり、右から2文字目が"1" なら "一" 、"2" なら "二"…
万の位(5文字)までは、こういった考え方になります。が、しかし!!!

ここまで、1文字分ずつ、何かしら感じがあてがわれていました。したがって、

  数字の部分 + 位を表す漢字

という組み合わせで、各位とも成り立っていましたが、6桁以上の位になると、この法則が変わります。

112000  は  十一万二千
2128000 は  二百十二万八千

  数字の部分 & 十か百か一か(一なら何も出さない) & 位を表す漢字

という具合に、3桁ずつ変わっていくやりかたに変わるわけです。
しかも、
112000  は  十一万二千 であって、 一十一万二千 ではありません。ひー。もうわけわかんないっすー。

つまり・・・
右端から数えて1文字目がどういう数字だったらどういう表示をさせて、
右端から数えて2文字目がどういう数字だったらどういう表示をさせて、
右端から数えて3文字目がどういう数字だったらどういう表示をさせて、

と、こんなことをやる関数を作るわけです。
めんどくさいでしょう?

数字の表示の仕方は、国によって異なりますから、こういうのは自分たちでいろいろ工夫して作ってあげないといけないですよね。
そして、ここで第1の判断です。ここまで工数をかけて作るべき機能かどうか?ということです。
「どうしても漢数字で表記しなければならないので、少しばかり時間がかかっても作りたい」、という方と、「なんだよ、もっと簡単に書式プロパティとかでできるかと思ってたのになんか妙に大げさだし、やっぱやめとく」という方と、いらっしゃるでしょう。こういう判断を的確にするのも、データベース作りの大切な要素だと思います。

やめましょう。

うそうそ。がんばります。がんばりましょう。
面倒くさいですけど、規則性がまったくないわけじゃないので、うまく例外を見つけて(例外ばっかしって感じもしますが)作っていきましょう。
まずは、5桁まで(万の位まで)限定のプロシージャとして考えてみますかね。


では、材料集めをいたしましょう。
前にもちょこっとお話したと思いますが、データベースというものは、テーブルの各フィールドやプロシージャ内で使用する変数などに、「データ型」という指定が必要です。
わたしたちの目には、画面上に 12000 と表示されている場合でも、コンピュータ内部で 12000 という形で扱われているかというと、必ずしもそうではないんです。
前に、日付時刻型のお話をしました。 2001年3月1日 と表示されていても、これが日付時刻型である場合は数値扱いで、「年」とか「月」とか「日」とかいう漢字が入力されているわけではないんでしたよね。
こういうのはみんな「書式」という考え方のもとに、表向きそんな感じに見えるような設定をしているだけです。だからこそ、書式によって曜日を求めたり、「30日後」とかいう計算をさせることができたりするわけです。テキスト型のフィールドに 2001年3月1日 と入力しても、見た目はおんなじですけど、こちらは「にーぜろぜろいちねんさんつきいちひ」という、文字のならびに過ぎません。「にせんいちねんさんがつついたち」ではないのです。
それと同じで、「その値がどういう値なのか=データ型は何か」ということは、すっごく大切なことなのです。
Accessで扱われるデータ型の一覧です。もう一度おさらいしときましょう。


データ型 記憶領域の
サイズ

範囲>

バイト型 (Byte) 1 バイト 0 〜 255
ブール型 (Boolean) 2 バイト 真 (True) または偽 (False)
整数型 (Integer) 2 バイト -32,768 〜 32,767
長整数型 (Long) 4 バイト -2,147,483,648 〜 2,147,483,647
単精度浮動小数点数型 (Single) 4 バイト -3.402823E38 〜 -1.401298E-45 (負の値)。
1.401298E-45 〜 3.402823E38 (正の値)。
倍精度浮動小数点数型 (Double) 8 バイト -1.79769313486231E308 〜 -4.94065645841247E-324 (負の値)。
4.94065645841247E-324 〜 1.79769313486232E308 (正の値)。
通貨型 (Currency) 8 バイト -922,337,203,685,477.5808 〜 922,337,203,685,477.5807
10 進型 (Decimal) 14 バイト 小数部分を持たない数値の場合、-79,228,162,514,264,337,593,543,950,335 〜 79,228,162,514,264,337,593,543,950,335 の範囲の値をとります。
小数点以下 28 桁の数値の場合、-7.9228162514264337593543950335 〜 7.9228162514264337593543950335 の範囲の値をとります。
絶対値の最小値は 0 を除いた場合、0.0000000000000000000000000001 です。
日付型 (Date) 8 バイト 西暦 100 年 1 月 1 日〜西暦 9999 年 12 月 31 日
オブジェクト型 (Object) 4 バイト オブジェクトを参照するデータ型
文字列型 (String) (可変長) 10 バイト + 文字列の長さ 0 〜 2GB
文字列型 (固定長) 文字列の長さ 1 〜 2GB
バリアント型 (Variant) (数値) 16 バイト 倍精度浮動小数点数型の範囲と同じ。
バリアント型 (Variant) (文字列) 22 バイト + 文字列の長さ 可変長の文字列型の範囲と同じ。
ユーザー定義型 要素に依存 それぞれの要素の範囲はそのデータ型の範囲と同じ。


 いろんなのがありますね。。。。
vba以外のところで、テーブルを作るときとかクエリ作るときとかなら、まあ・・・数値かテキストか日付か、くらいの区別がつけば、あとはそんなに難しいことを考えなくても問題ないと思うんですが、自分でコードを書いて処理を作るとなったら、こういうところもしっかり理解しておかないといけないかもしれないです。でもまあ、焦らず、その都度必要な事柄をヘルプで引くとかしながら、少しずつ範囲を広げていきましょう。