【VBAリファレンス】ツイッター出題の難問を攻略する!VBAで漢数字を算用数字へスマートに変換する技術

スポンサーリンク

概要

SNS、特にX(旧Twitter)上で頻繁に見かける「漢数字が含まれる難問」。これをExcel上で管理したり、自動回答プログラムを作成したりする際、最大の障壁となるのが「漢数字」の存在です。コンピュータは「一」「二」「三」を数値として認識しません。これらを「1」「2」「3」といった算用数字(アラビア数字)に変換するロジックを組み込むことは、データ分析や自動化の第一歩です。本記事では、ベテランVBAエンジニアの視点から、文字列に含まれる漢数字を正確に算用数字へと変換する、堅牢かつ拡張性の高いVBA実装手法を詳細に解説します。

詳細解説:なぜ漢数字の変換は難しいのか

漢数字の変換が単なる置換作業で済まない理由は、日本語の数字表現の構造にあります。「一〇二」は「102」ですが、「百二」は「102」であり、「百二十」もまた「102」です。また、桁数が増えると「一億二千三百四十五万六千七百八十九」のように、位(くらい)を示す「万」「億」「兆」が絡み合い、単純な辞書引き(一対一の置換)では対応できない構造を持っています。

効率的な変換アルゴリズムを構築するためには、以下のステップを踏むのが定石です。
1. 各漢数字(一〜九)と、位(十、百、千、万、億)に重み付けを行う。
2. 文字列を左から順に解析し、現在の位の状態を保持しながら数値を積算する。
3. 「万」「億」といった大きな単位が出現した際に、それまでの積算値を一度確定させ、全体の合計値に加算する。

このロジックをVBAで実装することで、ツイッター上の複雑な表記揺れにも対応可能な「変換エンジン」が完成します。

サンプルコード:漢数字変換エンジン

以下のコードは、標準的な漢数字文字列をLong型(整数)に変換する汎用的な関数です。


Function KanjiToLong(ByVal KanjiStr As String) As Long
    Dim i As Long, res As Long, temp As Long, unit As Long
    Dim ch As String
    Dim val As Long, place As Long
    
    res = 0
    temp = 0
    unit = 1
    
    For i = 1 To Len(KanjiStr)
        ch = Mid(KanjiStr, i, 1)
        
        Select Case ch
            Case "一": val = 1
            Case "二": val = 2
            Case "三": val = 3
            Case "四": val = 4
            Case "五": val = 5
            Case "六": val = 6
            Case "七": val = 7
            Case "八": val = 8
            Case "九": val = 9
            Case "十": place = 10
            Case "百": place = 100
            Case "千": place = 1000
            Case "万": place = 10000
            Case "億": place = 100000000
            Case Else: val = 0: place = 0
        End Select
        
        If place > 0 Then
            If place < 10000 Then
                If val = 0 Then val = 1
                temp = temp + (val * place)
            Else
                temp = (temp + val) * place
                res = res + temp
                temp = 0
            End If
            val = 0
        Else
            temp = temp + val
        End If
    Next i
    
    KanjiToLong = res + temp
End Function

実務アドバイス:変換精度を高めるためのテクニック

実務レベルでツイッター上のデータを扱う場合、ユーザーによって「一二三」と書く人もいれば「百二十三」と書く人もいます。さらに「0」を「〇(ゼロ)」と書くか「零」と書くかによっても挙動が変わります。

ここで重要なのは「前処理」です。
1. 全角数字を半角数字に変換する(StrConv関数のvbNarrowを使用)。
2. 文字列から不要なスペースや改行コードを削除する。
3. 未知の文字列(「合計」や「答え:」などのノイズ)をあらかじめ正規表現(RegExp)で除去する。

特に、ツイッター上のテキストは予測不可能なゴミデータが含まれがちです。VBAの「Microsoft VBScript Regular Expressions 5.5」ライブラリを参照設定し、漢字と数字以外の文字を徹底的にフィルタリングする工程を挟むことで、変換エラーを大幅に減らすことができます。また、変換できない文字列に対しては、エラーを出すのではなく「エラー値」や「Null」を返すようにし、後続の処理で例外処理を行う設計がプロフェッショナルです。

まとめ

漢数字を算用数字に変換する技術は、単なる文字列操作の域を超え、日本語特有の論理構造を解析する高度なプログラミング能力を養うための絶好の題材です。今回紹介したロジックをベースに、さらに「兆」を超える単位や、小数点の扱いなどを追加することで、自分だけの強力な解析ツールに育て上げることができるでしょう。

ツイッターでの出題回答はもちろんのこと、業務における古い手書き資料のデジタル化や、日本語OCR結果のクレンジングなど、このスキルは多方面で応用が効きます。VBAは古い言語だと言われがちですが、こうした泥臭いテキスト処理において、その柔軟性と即時性は他のモダンな言語にも決して引けを取りません。ぜひ、ご自身の業務効率化のためにこのエンジンを実装し、Excelの可能性をさらに広げてみてください。

タイトルとURLをコピーしました