指定された全角換算の文字数分、文字列の先頭から切り出して返す関数

Excelで帳票やラベル、CSV出力用のデータを作るとき、文字列を一定の長さに切り出したい(文字数制限をかけたい)ことはよくあります。 しかし、通常の Left 関数を使うと、以下のような問題が起こります。

  • Left("アイウエオ", 5) ➔ 5文字(全角5文字分)
  • Left("abcde", 5) ➔ 5文字(見た目の長さは全角2.5文字分しかない!

このように、全角と半角が混ざると「文字数は同じなのに、見た目の長さ(幅)がバラバラ」になってしまいます。

そこで、「全角を1文字、半角を0.5文字」としてカウントし、指定した「全角マスの数」に収まるように先頭からきれいに切り出すカスタム関数(UDF)を作成しました。

💡 このマクロでできること(切り出し例)

例えば、「全角5文字分(=半角なら10文字分)」で切り出すように指定した場合:

  • 「株式会社東京」「株式会社東京」(全角5文字なのでぴったり)
  • 「Tokyo株式会社」「Tokyo株式」(半角5文字+全角2文字 = 全角4.5文字分でストップ)
  • 「123456789012」「1234567890」(半角10文字 = 全角5文字分)

📌 ここがポイント! 切り出す際に、次に全角文字を追加すると指定幅をオーバーしてしまう場合は、自動的に手前でストップしてくれる安全設計です。

💻 ソースコード

以下のコードをVBAの標準モジュールに貼り付けてご使用ください。 ※この関数は、1文字が全角かどうかを判定する「IsFullWidthChar」関数が別途必要です。(記事の後半にリンク先を掲載しています)

'********************************************************
'* 関数名: GetFullWidthChars
'* 概要  : 指定された全角換算の文字数分、文字列の先頭から切り出して返す関数
'*
'* 引数:
'*   inputString [String] - 処理対象の文字列(全角/半角混在可)
'*   charCount [Long]     - 全角換算で何文字分切り出すかの指定値
'*
'* 戻り値:
'*   [String] - 全角文字を1文字、半角文字を0.5文字としてカウントし、
'*              指定された全角換算文字数分だけ先頭から切り出した文字列
'*
'* 使用される補助関数:
'*   - IsFullWidthChar: 1文字が全角かどうかを判定する関数
'*
'* 背景:
'*   - 日本語テキストでは、全角(例:漢字、ひらがな、カタカナ、全角英数字)と
'*     半角(例:半角英数字、記号など)の文字幅の違いにより、
'*     単純な文字数での処理が見た目上の長さに一致しない場合がある。
'*   - この関数は見た目の「幅」を考慮したテキスト処理に有効。
'********************************************************
Function GetFullWidthChars(ByVal inputString As String, ByVal charCount As Long) As String
    Dim result As String          ' 出力する結果文字列
    Dim totalWidth As Double      ' 全角換算の累積文字幅(半角は0.5、全角は1.0)
    Dim i As Long                 ' 文字位置インデックス
    Dim char As String            ' 文字を一時的に格納する変数

    totalWidth = 0   ' 初期化:全角換算の長さ
    result = ""      ' 初期化:出力用の文字列

    ' 入力文字列を1文字ずつチェック
    For i = 1 To Len(inputString)
        ' i番目の文字を取得
        char = Mid(inputString, i, 1)
        
        ' 全角なら+1、半角なら+0.5としてカウント
        If IsFullWidthChar(char) Then
            totalWidth = totalWidth + 1
        Else
            totalWidth = totalWidth + 0.5
        End If
        
        ' 全角換算文字数を超えた場合はそれ以上追加しない
        If totalWidth > charCount Then
            Exit For
        End If
        
        ' 結果文字列に現在の文字を追加
        result = result & char
    Next i

    ' 完成した結果文字列を返す
    GetFullWidthChars = result
End Function

🔍 処理の仕組み

  1. ループで1文字ずつ検証Len 関数で文字数を調べ、先頭から1文字ずつ Mid 関数で取り出します。
  2. 独自の「幅(ウエイト)」を加算: 取り出した文字が全角(IsFullWidthChar がTrue)なら累積幅に +1.0、半角なら +0.5 します。型を Double(倍精度浮動小数点型)にしているため、「0.5文字」のような小数も正確に計算できます。
  3. 上限手前でストップ: 文字を加算した結果、指定された charCount を超えてしまう場合は、Exit For でループを即座に抜けます。これにより、枠からはみ出るのを防ぎます。

🛠️ 合わせて必要な「全角判定関数」の例

上記マクロを動かすために必要な、1文字が全角かどうかを判定する IsFullWidthChar 関数のリンクです。 VBAの LenB(バイト数換算)と InStrB を組み合わせた、シンプルかつ高速に全角・半角を判別できる定番のロジックです。

✅ 使用例

' 例: 全角換算で 5文字分取り出す
Debug.Print GetFullWidthChars("アイウエオabc漢字カタカナ", 5)
' → 全角換算で5文字分だけ取り出された結果が返る("アイウエオabc漢")

💡 ワークシート上で関数として使う方法

このマクロは、マクロのコード内(VBA)で使えるのはもちろん、エクセルのセルに直接数式として入力して使うことも可能です(ユーザー定義関数)。

セルの入力例: =GetFullWidthChars(A2, 10) ※A2セルの文字列を、全角10文字分(半角換算20文字分)の長さで切り出します。

印刷の枠線からはみ出させたくない名簿の整理や、文字数制限のある基幹システムへインポートするためのデータ一括加工にぜひ役立ててください。

🔒 安心・安全宣言 本マクロは、Excel内部での文字列計算のみを行うため、外部へのデータ送信やインターネット通信、広告表示などの処理は一切含んでいません。企業の重要なデータや個人情報が含まれるファイルでも、安全にお使いいただけます。

Follow me!