指定された全角換算の文字数分、文字列の先頭から切り出して返す関数
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文字ずつ検証:
Len関数で文字数を調べ、先頭から1文字ずつMid関数で取り出します。 - 独自の「幅(ウエイト)」を加算: 取り出した文字が全角(
IsFullWidthCharがTrue)なら累積幅に+1.0、半角なら+0.5します。型をDouble(倍精度浮動小数点型)にしているため、「0.5文字」のような小数も正確に計算できます。 - 上限手前でストップ: 文字を加算した結果、指定された
charCountを超えてしまう場合は、Exit Forでループを即座に抜けます。これにより、枠からはみ出るのを防ぎます。
🛠️ 合わせて必要な「全角判定関数」の例
上記マクロを動かすために必要な、1文字が全角かどうかを判定する IsFullWidthChar 関数のリンクです。 VBAの LenB(バイト数換算)と InStrB を組み合わせた、シンプルかつ高速に全角・半角を判別できる定番のロジックです。
✅ 使用例
' 例: 全角換算で 5文字分取り出す
Debug.Print GetFullWidthChars("アイウエオabc漢字カタカナ", 5)
' → 全角換算で5文字分だけ取り出された結果が返る("アイウエオabc漢")💡 ワークシート上で関数として使う方法
このマクロは、マクロのコード内(VBA)で使えるのはもちろん、エクセルのセルに直接数式として入力して使うことも可能です(ユーザー定義関数)。
セルの入力例:
=GetFullWidthChars(A2, 10)※A2セルの文字列を、全角10文字分(半角換算20文字分)の長さで切り出します。
印刷の枠線からはみ出させたくない名簿の整理や、文字数制限のある基幹システムへインポートするためのデータ一括加工にぜひ役立ててください。
🔒 安心・安全宣言 本マクロは、Excel内部での文字列計算のみを行うため、外部へのデータ送信やインターネット通信、広告表示などの処理は一切含んでいません。企業の重要なデータや個人情報が含まれるファイルでも、安全にお使いいただけます。

