VBAで数値を漢数字に変換する方法
ツイッターで出したVBAのお題です。
算用数字を漢数字に変換するVBAです。
最近シリーズで書き始めた「Excel将棋」で必要になったからです。
将棋の棋譜は「7七同飛成」このように書きます。
つまり漢数字が必要になったということで、問題にしてみました。
ちなみに「7七同飛成」は藤井棋聖(当時七段)が放ったAI越えといわれた、後世に語り継がれるような有名な一手です。
お題のツイート

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

https://twitter.com/hoehoe1234/status/1291314985683959808

https://twitter.com/yukiyama2003/status/1291319229023522817

https://twitter.com/yuuboku/status/1291330556676825088

https://twitter.com/blacklist_ryu/status/1291338677168173056

https://twitter.com/kyrtnyy/status/1291350074136465408
用意した回答
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行だけですね。
これ以上は短くはならないと思う(笑)

NUMBERSTRING関数(関数ダイアログに無い関数です)
TEXT関数
どちらでも可能です。
「セルの書式設定」の「ユーザー定義」で、上記TEXT関数の第2引数を指定すれば同様の表示になります。
書式は上図の黄色("[DBNum1]0")を使っています。
WorksheetFunctionではなく、Evaluateを使うならNUMBERSTRING関数も使えます。
Function Num2Kanji(num As Variant) As String
Num2Kanji = Evaluate("NUMBERSTRING(" & num & ",3)")
End Function
Excelには豊富かつ便利な関数・機能が沢山あります。
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がより小さいことはあり得るか
コレクションの要素を削除する場合
greeenはgreenに、greeeeeNをGReeeeNに変換
数値変数の値を別の変数を使わずに入れ替える
新着記事NEW ・・・新着記事一覧を見る
シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)
新旧マスタの差異比較|Power Query(M言語)入門(2023-02-28)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-26)
有効な最新単価の取得|Power Query(M言語)入門(2023-02-21)
グルーブ内の最小・最大|Power Query(M言語)入門(2023-02-17)
2つのテーブルのマージ|Power Query(M言語)入門(2023-02-15)
「売上」が数値の行のみ取り込む|Power Query(M言語)入門(2023-02-13)
A列のヘッダー名を変更する|Power Query(M言語)入門(2023-02-11)
CSVのA列が日付の行だけを取り込む|Power Query(M言語)入門(2023-02-10)
列数不定のCSVの取り込み|Power Query(M言語)入門(2023-02-09)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。