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
同じテーマ「ツイッター出題回答 」の記事
囲碁で相手の石を囲んで取るアルゴリズム
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。