VBScriptを支配せよ:全角・半角混在文字列を「バイト単位」で美しく切り詰める極意
こんにちは。現場の最前線で自動化の荒波を乗りこなしているチーフアーキテクトです。
VBScriptで業務ツールを作っていると、必ずぶつかる壁があります。それが「全角文字(2バイト)と半角文字(1バイト)が混在する文字列の制御」です。画面の表示幅を制限したいとき、ただ文字数だけで数えると、全角が混じった瞬間にレイアウトが崩壊し、ユーザーから「見た目が汚い」と指摘を受けることになります。
今日は、VBScriptのポテンシャルを最大限に引き出し、「指定したバイト数に収め、溢れたら自動で三点リーダー(…)を添える」という、実務で死ぬほど役に立つプロのテクニックを伝授します。
—
1. なぜ「Len」ではなく「LenB」なのか?
VBScriptには、文字列を扱うための関数が二種類用意されています。
- `Len` / `Mid`: 「文字数」を数える。
- `LenB` / `MidB`: 「バイト数」を数える。
VBScriptの内部では文字はUnicodeとして扱われますが、`LenB`を使うことで、その文字がメモリ上で何バイト占有しているか(※厳密にはシステム標準のコードページ変換の結果)を判定できます。日本語環境のWindows(Shift-JIS)では、全角=2バイト、半角=1バイトとして計算するのが鉄則です。
—
2. 実践!安全な切り詰め関数のコード
さあ、現場でそのまま使える「職人のコード」を公開します。以下のコードをコピーして、あなたのスクリプトのライブラリに加えてください。
‘———————————————————
‘ 指定バイト数で切り詰め、超過分を三点リーダーにする関数
‘ @param strText 対象の文字列
‘ @param iLimitByte 最大バイト数
‘ @return 整形後の文字列
‘———————————————————
Function FormatStringByByte(strText, iLimitByte)
Dim iLen, iByteCount, i, strChar
‘ 既に制限内であればそのまま返す
If LenB(StrConv(strText, 128)) <= iLimitByte Then ' 128はvbFromUnicode
FormatStringByByte = strText
Exit Function
End If
' 一文字ずつ検証しながらバイト数をカウント
iByteCount = 0
For i = 1 To Len(strText)
strChar = Mid(strText, i, 1)
' 文字ごとにバイト数を判定(全角なら2、半角なら1)
If LenB(StrConv(strChar, 128)) = 2 Then
iByteCount = iByteCount + 2
Else
iByteCount = iByteCount + 1
End If
' 制限バイト数を超えたら、その前までを切り取って…を付与
If iByteCount > iLimitByte Then
FormatStringByByte = Left(strText, i – 1) & “…”
Exit Function
End If
Next
FormatStringByByte = strText
End Function
‘ — 実行例 —
Dim myText
myText = “VBScriptの世界へようこそ!”
WScript.Echo FormatStringByByte(myText, 10)
‘ 結果: VBScriptの…
このコードのポイント(知的な解説)
1. `StrConv(strChar, 128)`: ここが魔法のスパイスです。Unicodeの文字列を一旦システムのコードページ(Shift-JIS)に変換してから`LenB`で長さを測ることで、現実的なバイト数を正確に導き出しています。
2. 安全性: `Mid`で1文字ずつ分解しながら加算しているため、「全角文字のど真ん中でぶった切って文字化けさせる」という悲劇を物理的に回避しています。
—
3. 陥りやすいエラーと回避策
初心者がやりがちな「NGパターン」を共有しておきます。
- 「バイト数制限」を「文字数制限」と混同する:
`Left(str, 10)` を使うと、全角だけで構成された文字列なら5文字分しか表示されません。常に「この項目は何バイトまで許容されるか」を基準に設計してください。
- 三点リーダー(…)の文字化け:
`…` はUnicode文字です。VBScriptのソースコードを保存する際は、文字コードを「UTF-8 (BOM付き)」または「Shift-JIS」で保存してください。そうしないと、実行時に謎の記号に化けることがあります。
—
4. 最後に:エンジニアとしての心構え
「自動化」とは、単にコードを書くことではありません。「使う人が迷わない、見た目が整った出力を提供する」というホスピタリティのことです。
たかが文字列の切り詰めですが、ここにこだわることで、あなたの作るツールは「急造のスクリプト」から「堅牢な業務アプリケーション」へと進化します。
ここをクリアしたあなたは、もうVBScriptの基礎はバッチリです。自信を持って、より複雑なロジックの世界へ踏み込んでいってください。応援していますよ!
