見出し画像

Access覚書き一 数字を漢数字に書き換える

最近、久しぶりにaccess用のデーベース開発を行ってます。
入力画面に一連のデータを入れてしまえば、そのデータを使いまわして様々な印刷物をプリントするというもの。
これまでは印刷物ごとに何度も同じ人の名前や年齢を入力して印刷していたらしい。
データベースなら一度入れた名前、年齢は使い回せるので、作業的にも楽になるし、ミスも軽減できるはずだ。

(毎回そうだけど、)当初、「簡単にできるだろうな」と思っていました。1データあたりの入力しないといけないデータの量はあまり多くないし、印刷用にレポートを設定するだけなので複雑な計算をする必要もない。「レポートのレイアウトに時間がかかるだけだなー。」と思っていました。

しかし、実際は全然違ったんです。ほとんどの文書で、縦書きが指示されていました。
入力時に漢数字を入れてもらえば簡単ですが、見栄えも視認性も悪くなるし、入力時に漢字変換が入るので効率も悪くなります。
なので、入力フォームは半角数字で普通に入れてもらってそれを後にプログラムで漢数字に変換する必要性が発生します。
更にいうと、「22」と入れられた数字も、
「二二”分”」
「二十二”歳”」
というふうに、使われる局面によって書き分けなければならないんです。
いろいろ、研究した結果、2つのアプローチがあることを発見しました。

1つ目は「22」⇒「二二」の「単純置き換え法」
「2」という数値を単純に「二」という漢数字に置き換えるだけなのでイベントプロシージャの中で簡単に実現できました。

Private Sub 住所_AfterUpdate()
Dim inputString As String
Dim outputString As String

inputString = Me.Controls("住所").Value

outputString = Replace(inputString, "1", "一")
outputString = Replace(outputString, "2", "二")
outputString = Replace(outputString, "3", "三")
outputString = Replace(outputString, "4", "四")
outputString = Replace(outputString, "5", "五")
outputString = Replace(outputString, "6", "六")
outputString = Replace(outputString, "7", "七")
outputString = Replace(outputString, "8", "八")
outputString = Replace(outputString, "9", "九")
outputString = Replace(outputString, "0", "〇")
outputString = Replace(outputString, "-", "の")

Me.Controls("たてがき").Value = outputString
End Sub

Replaceという置き換え関数を使って、数字を漢数字に、ハイフンを「の」に置き換えて、住所の番地を漢数字に置き換えました。
inputString = Me.Controls("住所").Value
文字列変数inputStringに「住所」に入っている値を代入。
outputString = Replace(inputString, "1", "一")
リプレイス関数を使って"1"を””一に置き換え、文字列変数outputStringに代入。
以後他の数字も同様に置き換えます。
outputStringという変数を書き換えたい文字の分だけ何度も変換にかけて最終的に
Me.Controls("たてがき").Value = outputString
で、「たてがき」というテキストボックスに入力しています。

リプレイスによる置き換えは、たとえば元の文字列inputStringに入っているすべての文字に、"1"が入っていない時も単純に無視されるので、エラー処理などしなくてもいいので、柔軟性の高いよき関数だと思います。

この置き換えを使いまわしたい場合は、public subとして引数を使って使い回しも可能だと思います。
ちなみに半角「-(ハイフン)」は置き換えを行わなくとも勝手に縦向きになるので、必ずしも置き換えなくとも変な表示にはならないことを今回知りました。

もう一つは「22」⇒「二十二」のような「漢数字置き換え法」です。
前述の方法に加えRight関数などを使って、右から2番目の数字だから「十」を加えて変換しよう。などというやり方も考えられたのですが、今回は年齢限定だったので、せいぜい0から120くらいまでのデータベースを作って置き換えてみてはどうか?とやってみました。

まずシンプルなテーブルを作ります。IDを数値にして同じ数字を漢数字としてテーブルを作成しました。
120までの数字を作成。データベースとしては極めて少ないレコード数なので負担も少なめです。

Dim nenrei As String
nenrei = DLookup("漢数字", "con_nenrei", "[ID]=[ねんれい]")

あとは、漢数字を入れたいコントロール「nenrei」に入れる漢数字をDLookup関数を用いて参照します。
DLookup関数は大変良く使う関数で現在のフォームやレポートとは無関係なテーブルやクエリからデータを参照して引き出してきて代入します。
今回はcon_nenreiテーブルからコントロール「ねんれい」に入っている数字と同じIDの漢数字を参照して変数「nenrei」に入れています。
この処理のいいところは、データベーステーブルを作成しておくことで、長いコードを書かなくとも簡単に漢数字への変換が出来ることですかね。

今回はaccess vbaにおける数字を漢数字に書き換える手法を2種類紹介(自分の覚書でもあるのですが)してみました。
アクセスのアプリ開発の過程で悩んでいる方の役に立てたら嬉しいです。

今回作成中のデータベースは一番最初に「簡単そうだ」と思ったときと、実際の躓きの落差が大変大きくて大変勉強になっています。自分の覚書として書いておきたいこともいくつか出てきたので、まとめておきたいと思います。
それでは、また。

この記事が気に入ったらサポートをしてみませんか?