こんにちは!VBScriptの世界へようこそ。
業務の自動化を進めていると、Excelのマクロ(VBA)でおなじみの便利な関数が、純粋なVBScript(`.vbs`ファイル)の環境では使えなくて「あれ?」と頭を抱えた経験はありませんか?
特に代表的なのが、文字列の全角・半角変換や大文字・小文字の統一をしてくれる `StrConv` 関数です。この関数、実はExcelなどのVBA専用の機能なんです。メモ帳で書くような素のVBScript環境には、デフォルトでは用意されていません。
「じゃあ、純粋なVBScriptではデータのクリーニングは諦めるしかないの?」
いいえ、そんなことはありません!今回は、VBAに一切依存せず、VBScriptの基本関数(`AscW`や`ChrW`など)の組み合わせだけで、全角半角や大文字小文字を自在に料理する「文字列クリーニングモジュール」の作り方を、優しく徹底的に解説していきます。
ここをクリアすれば、VBScriptの文字コード処理の基本はバッチリですよ。さあ、一緒にプロの技を身につけましょう!
—
1. なぜ `StrConv` が使えないのか?(環境の壁を知る)
私たちが普段何気なく使っている `StrConv(text, vbNarrow)` などの機能は、裏側でMicrosoft Office(VBAのランタイム)のライブラリに依存しています。
しかし、Windowsの標準機能であるWSH(Windows Script Host)上で動くVBScriptは、もっと軽量で単体で動作する仕組みです。そのため、Officeがインストールされていないサーバー環境などでは、VBA特有の関数がエラー(「プロシージャの呼び出しまたは引数が不正です」など)を起こしてしまいます。
だからこそ、「OS標準の機能(文字コード変換関数)だけでロジックを自作する」というアプローチが、どんな環境でも絶対に壊れない最強の自動化スクリプトを作るカギになるのです。
—
2. 文字列クリーニングの核心:Unicodeの仕組みと武器
VBScriptで文字を加工するためには、文字の「背番号」である文字コードを操作します。ここで使う主役の関数は以下の2つです。
- `AscW(文字)`:文字をUnicodeの数値(10進数)に変換する
- `ChrW(数値)`:Unicodeの数値を文字に戻す
図解:全角英数から半角英数への変換の仕組み
Windows(UTF-16)の世界では、全角の英数字と半角の英数字の間には、「一律の差(オフセット)」という美しい規則性があります。
[全角の ‘A’ (U+FF21)] ──( 数値から 65248 を引く )──> [半角の ‘A’ (U+0041)]
- 全角英数のUnicode範囲:`FF21`(A)〜 `FF3A`(Z)、`FF41`(a)〜 `FF5A`(z)、`FF10`(0)〜 `FF19`(9)など
- 半角英数のUnicode範囲:`0041`(A)〜 `005A`(Z)、`0061`(a)〜 `007A`(z)、`0030`(0)〜 `0039`(9)など
実は、全角の英数文字コードから `65248`(16進数で `FF00`) を引き算するだけで、綺麗に半角の英数に変換できてしまうのです!スペースについても同様に、全角スペース(`3000`)から半角スペース(`0020`)への変換(差は `12248` / `3000 – 0020 = 2FE0 = 12248`)が成り立ちます。
—
3. 実装!ポータブル・文字列クリーニングモジュール
それでは、実際の現場でそのままコピペして使える、完全自作の文字列クリーニングスクリプトを公開します。
拡張子を `.vbs` にして保存すれば、ダブルクリックですぐに実行できます。
‘ ===================================================================
‘
‘ VBScript 文字列クリーニングモジュール
‘ (VBA非依存・純粋なWSH環境対応版)
‘
‘ ===================================================================
Option Explicit
‘ テスト実行用のメイン処理
Dim sampleText, cleanedText
sampleText = “ ABCDEFG 12345 sample ”
‘ クリーニング実行(半角変換 & 小文字統一)
cleanedText = CleanString(sampleText, True, “lower”)
WScript.Echo “【変換前】: [” & sampleText & “]”
WScript.Echo “【変換後】: [” & cleanedText & “]”
‘ ——————————————————————-
‘ 関数名: CleanString
‘ 概要 : 全角英数・スペースの半角変換および大文字小文字の統一を行う
‘ 引数 :
‘ strIn (String) – 処理対象の文字列
‘ toHalf (Boolean)- Trueの場合、全角英数を半角に変換する
‘ caseMode (String) – “upper”(大文字統一), “lower”(小文字統一), “”(そのまま)
‘ ——————————————————————-
Function CleanString(ByVal strIn, ByVal toHalf, ByVal caseMode)
Dim i, c, code, result
result = “”
For i = 1 To Len(strIn)
c = Mid(strIn, i, 1)
code = AscW(c)
‘ 1. 全角英数・全角スペースの半角化処理
If toHalf Then
‘ 全角英字 (A〜Z: 65313〜65338, a〜z: 65345〜65370)
If (code >= 65313 And code <= 65338) Or (code >= 65345 And code <= 65370) Then
code = code - 65248
c = ChrW(code)
' 全角数字 (0〜9: 65296〜65305)
ElseIf code >= 65296 And code <= 65305 Then
code = code - 65248
c = ChrW(code)
' 全角スペース (U+3000 = 12288)
ElseIf code = 12288 Then
c = " "
End If
End If
' 2. 大文字・小文字のケース統一処理
' ※一度半角に変換された、あるいはもともと半角のアルファベットを対象にする
code = AscW(c) ' 変換後のコードを再取得
Select Case LCase(caseMode)
Case "upper"
' 小文字 (a〜z: 97〜122) なら 大文字 (65〜90) に変換
If code >= 97 And code <= 122 Then
c = ChrW(code - 32)
End If
Case "lower"
' 大文字 (A〜Z: 65〜90) なら 小文字 (97〜122) に変換
If code >= 65 And code <= 90 Then
c = ChrW(code + 32)
End If
End Select
result = result & c
Next
CleanString = result
End Function
---
4. 現場で陥りやすい罠とエンジニアの知見(Tips)
ここで、VBScript特有の「ハマりポイント」と、それを回避するプロの知見をいくつかシェアしておきます。
罠1: サロゲートペア(絵文字や環境依存文字)による `AscW` の暴走
最新のWindowsやWebデータには、4バイトで表現される絵文字やレアな漢字(サロゲートペア)が含まれることがあります。純粋な `AscW` は2バイト単位で文字を処理するため、サロゲートペアをそのまま通すと、文字化けや意図しない数値の誤判定を引き起こします。
- 対策: 入力データにあらかじめ想定外の特殊文字が含まれないかバリデーション(弾く処理)を入れるか、英数・記号・日本語の基本文字に絞った処理系を設計することが、現場での安定稼働の秘訣です。
罠2: 文字列連結のパフォーマンス劣化
上記のコードでは `result = result & c` という形で1文字ずつ文字列を結合しています。短い文字列であれば全く問題ありませんが、もし数万行のCSVデータなどを1文字ずつループさせると、VBScriptではメモリの再割り当てが発生し、処理が急激に重くなります(パフォーマンスの低下)。
- 対策: 大規模なデータを扱う場合は、`Scripting.Dictionary` や、後々配列(Array)や `Join` 関数を駆使したメモリ効率の良いアルゴリズムにリファクタリングするとプロフェッショナルです。
—
まとめ
今回は、VBA非依存の組み込み関数(`AscW` / `ChrW`)だけで、全角半角変換や大文字小文字の正規化を行うポータブルな文字列クリーニングモジュールを解説しました。
- `StrConv` はOffice(VBA)環境専用。純粋なVBScriptでは使えない。
- Unicodeの規則性(オフセット:`-65248`)を利用すれば、自前で簡単に半角変換ロジックが書ける。
- 環境に依存しないスクリプトを書くことが、真の自動化エンジニアへの第一歩。
ここをクリアできれば、VBScriptの文字コード周りの恐怖心はもう消えているはずです。ぜひ、日々の業務自動化スクリプトに組み込んで、その快適さを体験してみてくださいね。それでは、また次回の高度なテクニックでお会いしましょう!
