ツイッター出題回答
VBAで数値を漢数字に変換する方法

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2020-08-06 最終更新日: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がより小さいことはあり得るか
コレクションの要素を削除する場合
greeenはgreenに、greeeeeNをGReeeeNに変換
数値変数の値を別の変数を使わずに入れ替える


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

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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