エクセル雑感
VBAで数値を漢数字に変換する方法

ExcelマクロVBAとエクセル関数についての私的雑感
最終更新日:2020-08-07

VBAで数値を漢数字に変換する方法


ツイッターで出したVBAのお題です。
算用数字を漢数字に変換するVBAです。


滅多に必要になるものではないのに、なぜこんな問題を出したかと言うと、
最近シリーズで書き始めた「Excel将棋」で必要になったからです。
Excelで将棋を作ってみましょう。今やコンピューター将棋はプロをしのぐ強さです。しかし、Excelでそのようなソフトを作ろうと言うのではありません。と言いますか、残念ながら私には作れません、、、ExcelマクロVBAの学習素材として将棋を作ってみましょう。

将棋の棋譜は「7七同飛成」このように書きます。
つまり漢数字が必要になったということで、問題にしてみました。
ちなみに「7七同飛成」は藤井棋聖(当時七段)が放ったAI越えといわれた、後世に語り継がれるような有名な一手です。

お題のツイート

VBA 数値を漢数字 マクロ
https://twitter.com/yamaoka_ss/status/1291244485272166402

【Excel VBA問題】
久しぶりの問題です。
正の整数値を漢数字に変換してください。
単純に、
1234567890
数値を入れたら、
一二三四五六七八九〇
このように出力するだけです。
正の整数です。符号や小数点は気にしなくて良いです。
※とりあえず用意した回答は、とってもとっても短いコードです。

お題に対して頂いた回答

以下、回答をもらったじゅんに費用時しています。

用意した回答

書き方はいろいろありますが、特に凝らずに書いていった場合の一例です。



Sub sample()
  Debug.Print Num2Kanji(54321)
  Debug.Print Num2Kanji(1234567890)
End Sub

Function Num2Kanji(num As Variant) As String
  Dim cnsAry
  cnsAry = Array("〇", "一", "二", "三", "四", "五", "六", "七", "八", "九")
  
  Dim strNum As String
  strNum = CStr(num)
  
  Dim outAry() As String
  ReDim outAry(Len(strNum))
  
  Dim i As Long
  For i = 1 To Len(strNum)
    If IsNumeric(Mid(strNum, i, 1)) Then
      outAry(i) = cnsAry(Mid(strNum, i, 1))
    Else
      outAry(i) = Mid(strNum, i, 1)
    End If
  Next
  Num2Kanji = Join(outAry, "")
End Function

漢数字に変更できる部分のみ変更するようにしていたりするので、少し長くなっています。
どうという事もありませんね。
長いと言えば長いけど、まあ、実質的には数行のVBAです。
短いVBAにするために、少し凝った書き方をすると、

Function Num2Kanji(num As Variant) As String
  Dim cnskanji: cnskanji = "〇一二三四五六七八九"
  Num2Kanji = CStr(num)
  Dim i As Long
  For i = 1 To Len(Num2Kanji)
    Mid(Num2Kanji, i, 1) = Mid(cnskanji, Mid(Num2Kanji, i, 1) + 1, 1)
  Next
End Function

しかし、この程度の回答コードなら、わざわざツイッターで問題に出したりしません。
問題のツイートでも、
「※とりあえず用意した回答は、とってもとっても短いコードです。」
と書いているように、ものすごく短いVBAコードで済ませています。



Function Num2Kanji(num As Variant) As String
  Num2Kanji = WorksheetFunction.Text(num, "[DBNum1]0")
End Function

1行だけですね。
これ以上は短くはならないと思う(笑)

シートで数値を漢数字にする方法としては、以下になります。

VBA 数値を漢数字 マクロ

シート関数なら、
NUMBERSTRING関数(関数ダイアログに無い関数です)
TEXT関数
どちらでも可能です。
「セルの書式設定」の「ユーザー定義」で、上記TEXT関数の第2引数を指定すれば同様の表示になります。

WorksheetFunctionにNUMBERSTRINGは無いので、上記VBAではText関数を使っています。
書式は上図の黄色("[DBNum1]0")を使っています。
WorksheetFunctionではなく、Evaluateを使うならNUMBERSTRING関数も使えます。

Function Num2Kanji(num As Variant) As String
  Num2Kanji = Evaluate("NUMBERSTRING(" & num & ",3)")
End Function

Excelには豊富かつ便利な関数・機能が沢山あります。
VBAで、ちょっと面倒だなと思った処理でも、関数・機能で結構出来てしまったりします。
エクセルの関数・機能も調べてみると以外なものがあったりするかもしれません。

後日談ツイート:再帰でやってみる

VBA 数値を漢数字 マクロ
https://twitter.com/hoehoe1234/status/1291628498688200705

このようなツイートをいただきました。
せっかくなので私も再帰でVBA書いてみました>
ご参考まで

Function Num2Kanji(num As Variant) As String
  If Len(CStr(num)) = 0 Then Exit Function
  Const kansuuji = "〇一二三四五六七八九"
  Num2Kanji = Mid(kansuuji, Left(num, 1) + 1, 1) & Num2Kanji(Mid(num, 2))
End Function



同じテーマ「エクセル雑感」の記事

Variant仮引数のByRefとByValの挙動違い
100桁の正の整数値の足し算
「VBA Match関数の限界」についての誤解
VBAで数値を漢数字に変換する方法
囲碁で相手の石を囲んで取るアルゴリズム
VBAで「3Lと5Lのバケツで4Lの水を作る」を解く
言語依存の関数を使用できるFormulaLocal
配列のUBoundがLBoundがより小さいことはあり得るか
ショートカット(Ctrl+Shift+n)抜け番ばどれだ
コレクションの要素を削除する場合
入力規則で○△を入れる数を制限する方法


新着記事NEW ・・・新着記事一覧を見る

日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)
エクセルVBA 段級位 目安|エクセル雑感(2021-06-21)
ローカル版エクセルが「Office Scripts」に変わる日|エクセル雑感(2021-06-10)
新関数SORTBYをVBAで利用するラップ関数を作成|VBA技術解説(2021-06-12)
VBA今日のひとこと on Twitter|エクセル雑感(2021-06-10)
VBAの演算子まとめ(演算子の優先順位)|VBA技術解説(2021-06-09)
画像が行列削除についてこない場合の対処|VBA技術解説(2021-06-04)
エクセル関連で「いいね」の多かったツイート|エクセル雑感(2021-05-17)
キーボード操作だけで非表示列を表示|エクセル雑感(2021-05-11)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ