【VBScript】列がズレない!コンソール出力の「文字幅」を完璧に制御する極意
こんにちは。現場で泥臭い自動化を支え続けるアーキテクトです。
VBScriptで業務ツールを作っていると、必ずぶつかる壁があります。それは「コンソール出力のレイアウト崩れ」です。
「CSVを読み込んで表形式で表示したいだけなのに、全角文字が混じると列がガタガタになる…」
そんな経験はありませんか?
今回は、Shift-JIS環境のVBScriptにおいて、全角を2、半角を1としてカウントし、どんな文字列でも完璧に整列させるための「文字幅算出ロジック」を伝授します。これさえ理解すれば、あなたのスクリプトは一段上のプロフェッショナルな品質に進化します。
—
なぜ「文字数」と「文字幅」を混同してはいけないのか
プログラミング初心者の方が陥りやすい最大の罠が、`Len()`関数の使用です。
VBScriptの `Len(“こんにちは”)` は「5」を返します。しかし、コンソール上では全角文字は半角2つ分のスペースを占有するため、実際には「10」の幅を使っていることになります。
これを見誤ると、以下のように表示が崩れます。
名前 点数
田中 100
佐藤さん 80 <-- ここで崩れる!
この原因は、プログラムが「文字の個数」しか数えていないからです。「コンソールでの視覚的な幅」を計算する関数を自作する必要があります。
—
核心:全角・半角を判別するロジック
VBScriptには「この文字は全角か?」を直接判定する関数はありません。そこで、「文字のコードポイント(Asc関数)」を利用します。
Shift-JIS環境において、特定の範囲を超えるコードを持つ文字は「全角(マルチバイト)」であるという性質を利用します。
文字幅算出関数:`GetDisplayWidth`
以下のコードは、文字列を1文字ずつ解析し、全角なら+2、半角なら+1を加算する関数です。
‘ 文字列の表示幅(全角=2, 半角=1)を計算する関数
Function GetDisplayWidth(str)
Dim i, char, width
width = 0
For i = 1 To Len(str)
char = Mid(str, i, 1)
‘ Asc関数で文字コードを取得
‘ 0~255の範囲(半角)かそれ以外(全角)かを判定
If Asc(char) < 0 Or Asc(char) > 255 Then
width = width + 2
Else
width = width + 1
End If
Next
GetDisplayWidth = width
End Function
—
実践:列を揃える「パディング(埋め込み)関数」
関数ができたので、次は指定した幅になるまで半角スペースを後ろに付け足す関数を作りましょう。これで表形式の出力が完璧になります。
‘ 指定した幅(targetWidth)になるまでスペースを埋める
Function PadRight(str, targetWidth)
Dim currentWidth
currentWidth = GetDisplayWidth(str)
‘ 目標幅に達するまでスペースを追加
If currentWidth < targetWidth Then
PadRight = str & Space(targetWidth - currentWidth)
Else
' すでに超えている場合はそのまま返す(切り詰め処理は必要に応じて追加)
PadRight = str
End If
End Function
---
実際に組み込んでみよう
これらを組み合わせると、綺麗な表が作れます。
‘ — メイン処理 —
Dim name1, name2, score1, score2
name1 = “田中”
name2 = “佐藤さん”
score1 = “100”
score2 = “80”
‘ 10桁の幅で揃えて出力
WScript.StdOut.WriteLine PadRight(“名前”, 10) & “点数”
WScript.StdOut.WriteLine “——————–”
WScript.StdOut.WriteLine PadRight(name1, 10) & score1
WScript.StdOut.WriteLine PadRight(name2, 10) & score2
実行結果
名前 点数
——————–
田中 100
佐藤さん 80
どうですか?綺麗に整列しましたね!
—
最後に:エンジニアとしてのステップアップ
このテクニックのポイントは、「OSや環境が勝手にやってくれないことを、自らコードで定義する」というエンジニア的な思考にあります。
- 陥りやすいエラー: `Len()`だけで文字幅を制御しようとする。
- 解決の鍵: `Asc()`関数による文字コード判定と、計算後のオフセット処理。
VBScriptは古い言語だと言われますが、Windows環境でこれほど軽量でパワフルに動く言語は他にありません。今回紹介した「文字幅制御」をマスターすれば、ログ出力やCSV整形など、現場の自動化ツールが一気に「職人の道具」に変わります。
ぜひ、あなたのスクリプトに取り入れてみてください。次は、もう少し踏み込んだ「エラーハンドリングの極意」についてお話ししましょう。頑張ってくださいね!
