こんにちは!VBScriptの世界へようこそ。
マクロの記録や単純な自動化から一歩進んで、本格的なシステム連携やファイル処理に挑戦しようとしているあなたへ。
今回は、業務システムの連携で避けて通れない「固定長テキスト(レガシーなフォーマット)の生成」をテーマに、VBScriptが誇る少しマニアックで強力な関数を使った桁揃えの極意を伝授します。
「全角と半角が混ざると文字数が狂う……」
「空白パディングがズレて基幹システムに怒られた……」
そんな現場の絶望を華麗に解決するテクニックを、優しく、そして本質的に解説していきましょう。ここをクリアすれば、あなたのVBScriptのスキルは間違いなくワンランク上のエンジニア領域に到達しますよ!
—
なぜ固定長テキスト生成で文字化け・ズレが起きるのか?
私たちが普段使っている文字(特に日本語)は、半角文字(1文字=1バイト)と全角文字(1文字=2バイト)が混在しています。
通常の `Len` 関数や `Left` 関数は、文字の「個数」数えます。
- `Len(“A”)` = 1
- `Len(“あ”)` = 1
しかし、基幹システムや古いメインフレームとの連携で使われる「固定長テキスト」の多くは、文字数ではなく「バイト数(空間の物理的な広がり)」で管理されています。
- 「商品名フィールドは、半角換算で20バイト分を確保しなさい」
ここに `Len` 関数を使ってしまうと、全角文字が含まれた瞬間にバイト計算が狂い、レイアウトが盛大に崩壊します。これが、多くの開発者がハマる最初の罠です。
—
救世主は「B付き関数」:LenB と AscB
この問題を解決するために、VBScriptには文字数ではなくバイト単位で文字列を操作する特別な関数が用意されています。それが `LenB` と `AscB` です。
- `LenB(str)`: 文字列の「バイト数」を返します。「あ」なら 2、「A」なら 1 です。
- `AscB(c)`: 先頭の1文字の文字コードをバイト単位で取得します。
これらを駆使すれば、「画面上の見た目の文字数」ではなく、「システムが要求する正確なバイト数」を完全にコントロールできるようになります。
—
実装:マルチバイト対応・固定長パディングモジュール
それでは、現場でそのままコピペして使える、堅牢な固定長パディング生成スクリプトをお見せしましょう。
このコードは、指定された文字列を指定されたバイト数に収まるよう、足りない分を半角スペースで右側を埋める(右パディング)プロフェッショナルな関数です。
Option Explicit
‘ メイン処理の実行例
WScript.Echo “[” & PadRightB(“Windows”, 10) & “]” ‘ 半角のみ
WScript.Echo “[” & PadRightB(“VBScript”, 10) & “]” ‘ ちょうど10バイト
WScript.Echo “[” & PadRightB(“業務自動化”, 10) & “]” ‘ 全角混じり(全角2文字=4バイト + 半角6バイト = 10バイト)
WScript.Echo “[” & PadRightB(“超超超長すぎる文字列”, 10) & “]” ‘ はみ出し切り捨てテスト
‘ =================================================================
‘ 関数名: PadRightB
‘ 概要: 指定されたバイト数になるよう、右側に半角スペースをパディングする
‘ 引数: strTarget (対象文字列), intTargetBytes (目標バイト数)
‘ 戻り値: 固定長に調整された文字列
‘ =================================================================
Function PadRightB(strTarget, intTargetBytes)
Dim currentBytes
Dim i
Dim char
Dim resultStr
resultStr = “”
currentBytes = 0
‘ 1文字ずつ走査し、目標バイト数を超えないように構築する
For i = 1 To Len(strTarget)
char = Mid(strTarget, i, 1)
‘ 1文字あたりのバイト数をLenBで正確に測る(半角は1、全角は2)
Dim charBytes
charBytes = LenB(char)
‘ 目標バイト数を超える場合は、そこで切り捨てる
If currentBytes + charBytes > intTargetBytes Then
Exit For
End If
resultStr = resultStr & char
currentBytes = currentBytes + charBytes
Next
‘ 足りない分のバイト数を計算し、Space関数で半角スペースを埋める
‘ Space(n) は n個の半角スペースを生成するVBScript標準の強力な関数です
Dim remainingBytes
remainingBytes = intTargetBytes – currentBytes
If remainingBytes > 0 Then
resultStr = resultStr & Space(remainingBytes)
End If
PadRightB = resultStr
End Function
—
コードのここがポイント! 押さえておきたい3つの技術
1. `LenB(char)` による正確な文字幅判定
ループの中で `Mid` 関数を使って1文字ずつ切り出し、その文字の `LenB` を取得しています。これにより、半角(1バイト)か全角(2バイト)かを完璧に判別できます。
2. `Space` 関数のスマートな活用
VBScriptの `Space(n)` 関数は、指定した数値分の半角スペースを一発で生成してくれます。足りないバイト数分だけ `Space(remainingBytes)` を後ろに連結するだけで、美しいパディングが完成します。
3. はみ出し(オーバーフロー)の安全対策
もし目標バイト数よりも長い文字列が渡された場合、容赦なく切り捨てる(`Exit For`)ロジックを入れています。これにより、基幹システムのレイアウト崩れを未然に防ぐ「防御的プログラミング」を実現しています。
—
初学者がやりがちな「罠」とエラー回避のコツ
罠:`Len` と `LenB` の混同
「文字数」を揃えたいのか、「バイト数」を揃えたいのかを混同すると大惨事になります。
- 画面表示やログ出力の桁揃え = `Len`
- レガシーファイル・DB・固定長データ連携 = `LenB` と今回のロジック
ここを意識するだけで、文字コードに起因するバグの9割は防げます。
—
まとめ
今回は、VBScriptを用いたマルチバイト対応の固定長テキスト生成について解説しました。
- 全角・半角が混ざる環境では `LenB` でバイト数を測る。
- 不足分は `Space` 関数でスマートに埋める。
- はみ出しを考慮した安全なループ処理を組む。
ここをクリアしたあなたなら、もうVBScriptの基礎で躓くことはありません。自動化の現場で「おっ、こいつできるな」と言われるような、堅牢で美しいスクリプトをぜひ書き上げてみてくださいね。
バッチリですよ、その調子で頑張りましょう!
