エクセル雑感
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 ・・・新着記事一覧を見る

import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)
リスト内包表記|Python入門(9月22日)
Pythonの引数は参照渡しだが・・・|Python入門(9月21日)
lambda(ラムダ式、無名関数)と三項演算子|Python入門(9月20日)
関数内関数(関数のネスト)とスコープ|Python入門(9月18日)
関数の定義(def文)と引数|Python入門(9月18日)
組み込み関数一覧|Python入門(9月17日)
辞書(dict型)|Python入門(9月16日)
入力規則への貼り付けを禁止する|VBA技術解説(9月16日)


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

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




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


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



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