VBScriptを掌握する:MSXML2.DOMDocumentで挑む「Base64変換」の極意
こんにちは。自動化の現場でVBScriptの枯れた、しかし強力な技術と長年向き合ってきたエンジニアです。
皆さんは「VBScriptでバイナリデータを扱いたい」と思ったことはありませんか?通常、VBScriptはテキスト処理に特化しており、バイナリの扱いは鬼門です。しかし、Windowsに標準搭載されている`MSXML2.DOMDocument`という「隠し玉」を使えば、外部ライブラリを一切インストールすることなく、極めて安全かつ高速にBase64変換が可能になります。
今日は、マクロの記録から一歩踏み出し、OSの深淵を操るための「Base64相互変換」の極意を伝授します。
—
なぜ「MSXML2.DOMDocument」なのか?
VBScriptでBase64を扱う際、よくある失敗は「自前で変換ロジックを書く」ことです。これは車輪の再発明であるだけでなく、パフォーマンス的にも非常に非効率です。
`MSXML2.DOMDocument`は、本来XMLをパースするためのオブジェクトですが、これには`dataType`プロパティを`bin.base64`に指定することで、バイナリと文字列を自動変換する機能が備わっています。これを利用すれば、OSが提供するネイティブな変換アルゴリズムを呼び出せるため、高速かつ正確です。
—
実践:Base64エンコード&デコードのコード
以下のコードは、文字列をBase64に変換し、それを再び元の文字列に戻す一連の処理です。現場でそのまま使えるように、堅牢な設計にしています。
‘ — Base64変換モジュール —
‘ 文字列をBase64にエンコードする関数
Function EncodeBase64(strInput)
Dim xmlDoc, node
‘ XMLドキュメントを作成
Set xmlDoc = CreateObject(“MSXML2.DOMDocument”)
Set node = xmlDoc.CreateElement(“root”)
‘ データタイプをバイナリ(Base64)に指定
node.DataType = “bin.base64”
‘ 文字列をバイト配列として書き込む
node.NodeTypedValue = StrToBytes(strInput)
‘ Base64文字列を取得
EncodeBase64 = node.Text
Set node = Nothing
Set xmlDoc = Nothing
End Function
‘ Base64を文字列にデコードする関数
Function DecodeBase64(strBase64)
Dim xmlDoc, node
Set xmlDoc = CreateObject(“MSXML2.DOMDocument”)
Set node = xmlDoc.CreateElement(“root”)
node.DataType = “bin.base64”
node.Text = strBase64
‘ バイナリから文字列に戻す
DecodeBase64 = BytesToStr(node.NodeTypedValue)
Set node = Nothing
Set xmlDoc = Nothing
End Function
‘ 補助関数:文字列をバイト配列に変換
Function StrToBytes(str)
Dim adoStream
Set adoStream = CreateObject(“ADODB.Stream”)
adoStream.Type = 2 ‘ adTypeText
adoStream.Charset = “utf-8”
adoStream.Open
adoStream.WriteText str
adoStream.Position = 0
adoStream.Type = 1 ‘ adTypeBinary
StrToBytes = adoStream.Read
adoStream.Close
End Function
‘ 補助関数:バイト配列を文字列に変換
Function BytesToStr(bytes)
Dim adoStream
Set adoStream = CreateObject(“ADODB.Stream”)
adoStream.Type = 1 ‘ adTypeBinary
adoStream.Open
adoStream.Write bytes
adoStream.Position = 0
adoStream.Type = 2 ‘ adTypeText
adoStream.Charset = “utf-8”
BytesToStr = adoStream.ReadText
adoStream.Close
End Function
—
陥りやすいエラーとその回避策
1. 文字コードの罠(重要!)
VBScriptの文字列は内部でUnicode(UTF-16)として扱われますが、Base64に変換する際は「どの文字コードとして保存するか」が重要です。上記コードでは `ADODB.Stream` を使用して明示的に UTF-8 を指定しています。ここを省略すると、日本語環境では文字化けが確実に発生します。
2. オブジェクトのライフサイクル
`CreateObject` は非常に強力ですが、ループ内で大量に生成して破棄し忘れるとメモリリークの原因となります。必ず `Set obj = Nothing` で明示的に解放する習慣をつけてください。これが「できるエンジニア」の嗜みです。
3. DOMDocumentの初期化エラー
極めて稀ですが、環境によってはMSXMLのバージョンが古く、`MSXML2.DOMDocument` が使えない場合があります。その場合は `MSXML2.DOMDocument.6.0` のようにバージョンを明記するか、`MSXML2.DOMDocument.3.0` を試してください。
—
まとめ:ここをクリアすればVBScriptは怖くない
Base64変換を自力で実装できるようになったということは、単に「文字列を変換できる」ようになっただけではありません。
- バイナリデータの扱い方(ADODB.Stream)
- XMLオブジェクトの隠れた機能(dataType)
- 適切なメモリ管理(Nothingの解放)
これら3つの「VBScriptの基本」をマスターしたことになります。これさえあれば、Web APIとの通信や、ローカルでのバイナリファイル操作など、自動化の幅は劇的に広がります。
VBScriptは古い言語と言われますが、WindowsというOSの心臓部を直接叩ける稀有な言語です。ぜひ、このロジックを手に、自動化の旅を楽しんでください。何か詰まったら、またいつでも聞きに来てくださいね。応援しています。
