こんにちは、ふみです。みなさんは VBScript のテキストデータをファイルで保存しようと思ったことはありますか?
VBScript や Excel等の VBA ではテキストデータを保存する方法が一つだけではありません。また、テキストデータには「Shift-JIS(ANSI)」、「UTF-8」等の文字コードがあり、指定された文字コードで保存できていないとファイルを読み込むときに文字化けになってしまうので注意が必要です。
今回は VBScript のテキストデータを保存する方法や、VBAとの違いについて紹介します。
CONTENTS
テキストファイルの保存方法の違い
テキストファイルを保存する方法によって対応している文字コードが異なります。テキストファイルの保存方法と対応している文字コードは次のとおりです。
テキストファイルの保存方法 | 対応している文字コード |
ADO の Streamオブジェクト | インターネット文字セット名としてインターフェイスで渡される一般的な文字列(Shift-JIS(ANSI)、UTF-8、Unicode (UTF-16LE)、他) |
FileSystemObject の TextStreamオブジェクト | Shift-JIS(ANSI)、Unicode (UTF-16LE) |
表のとおり、文字コードの汎用性が高いのは ADO(ActiveX Data Objects)の Streamオブジェクトでテキストファイルを保存する方法です。
Shift-JIS(ANSI)は vbsファイルや Excel で読み込む為の csvファイルを作成するときに使います。
UTF-8は HTML や CSS、JavaScript で使うことが多いです。しかし、UTF-8で保存した vbsファイルで VBScript を実行したり、UTF-8で保存した csvファイルを Excel で開いたりすると、日本語入力した文字などが文字化けする可能性があります。
余談ですが、VBAで使用できる(VBScript では使えない)Openステートメント等によるファイル操作で保存されたファイルは、文字コードが Shift-JIS(ANSI)で保存されます。
テキストデータに文字コードを指定して保存する
テキストファイルを UTF-8で保存するには ADO の Streamオブジェクトを使います。
ADO の Streamオブジェクトを使ってテキストファイルを保存するプログラムは次のとおりです。
サンプルコード
With CreateObject("ADODB.Stream") .Charset = "UTF-8" '文字コード .Open .WriteText "領域展開" 'テキストデータ .SaveToFile "SavedText.txt", 1 '1 - 上書き不可、2 - 上書き可 .Close End With
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」を付けてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、同じフォルダ内(デスクトップ)に「SavedText.txt」というテキストファイルが保存されています。
このファイルをメモ帳等で開くと保存されたテキストデータ「領域展開」の文字を確認することができます。
解説
1行目は Withステートメントで2~6行目の ADO の Streamオブジェクトの記述を省略しています。
ADO の Streamオブジェクトは他のオブジェクトと同様に変数に代入して使うことができますが、このコードのように同じオブジェクトを連続で使う時は Withステートメントを使うのが効果的です。
Withステートメントは End With の記述まで省略できます。
2行目は Charset で Streamオブジェクトの文字コードを指定しています。vbsファイルや csvファイルを保存するときは「Shift-JIS」を指定します。省略した場合は Unicode (UTF-16LE)になります。
3行目は Streamオブジェクトを開いています。この時、テキストファイルはまだありません。
4行目は Streamオブジェクトにテキストデータを代入しています。
5行目は Streamオブジェクトのテキストデータを、指定したファイル名(相対パス)で保存しています。テキストファイルはここで生成されます。カンマの後ろは SaveOptions です。SaveOptions を省略した場合は1が適用されます。1は上書き保存ができないので、このサンプルコードを2回目実行するとエラーが発生します。
カンマの後ろのパラメータの数字を2に変更すると、上書き保存できるようになります。
6行目は Streamオブジェクトを閉じています。
このサンプルコードは Excel等のVBAでも動作しますが、Excelファイルを保存していない場合、保存先がカレントフォルダ(マイドキュメント)になります。
保存先をデスクトップにする
スクリプトの処理結果がメッセージで表示しきれない量の場合、テキストファイルで保存することがよくあります。
デスクトップの VBScriptを実行した場合、保存ファイル名で指定すればデスクトップに保存されます。しかし、マイドキュメント等から VBScriptファイルを実行した場合、同じフォルダに保存するよりもデスクトップに保存したほうが便利な場合があります。
上記サンプルコードでテキストファイルの保存先をデスクトップに固定する場合、プログラムは次のようになります。
サンプルコード
Option Explicit Dim objWshShell With CreateObject("ADODB.Stream") .Charset = "UTF-8" '文字コード .Open .WriteText "領域展開" 'テキストデータ Set objWshShell = CreateObject("WScript.Shell") .SaveToFile objWshShell.SpecialFolders("Desktop") & "\SavedText.txt", 1 .Close End With Set objWshShell = Nothing
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」を付けてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、デスクトップに「SavedText.txt」というテキストファイルが保存されますが、vbsファイルをデスクトップ以外の場所から実行してもテキストファイルはデスクトップに保存されます。
解説
8行目は WshShellオブジェクトを変数に代入しています。 デスクトップの絶対パスは WshShellオブジェクトから取得できます。
9行目は WshShellオブジェクトからデスクトップの絶対パスを取得して、保存するファイル名と組み合わせて保存先の絶対パスを指定しています。
このサンプルコードは Excel等のVBAでも動作します。
エラーが発生しても処理を中断させないようにする
ファイルを保存するときは上書き禁止になっていたり、上書き時にファイルが読み取り専用になっていたり等、エラーが発生しやすくなります。
Excel や Internet Explorer 等のアプリケーションを非表示起動している時にエラーが発生した場合、非表示のアプリケーションを起動したまま中断されてしまい、問題になります。
そこで、エラーが発生してもプログラムを止めない処理にして、アプリケーションを終了してからプログラムを停止するようにする必要があります。
テキストデータに文字コードを指定してデスクトップに保存するときに、エラーが発生しても中断させないようにしたプログラムは次のとおりです。
サンプルコード
Option Explicit Dim objWshShell, strSavePath, strSaveText, intErrNum, strDescription Set objWshShell = CreateObject("WScript.Shell") strSavePath = objWshShell.SpecialFolders("Desktop") & "\SavedText.txt" Set objWshShell = Nothing strSaveText = "領域展開" intErrNum = SaveTextFile(strDescription, strSavePath, strSaveText) Select Case intErrNum Case 0 MsgBox "テキストファイルがデスクトップに保存されます。" Case Else MsgBox "Err.No.=" & intErrNum & vbCrLf _ & vbCrLf _ & strDescription, vbCritical, "Function SaveTextFile のエラー" End Select WScript.Quit '****************************************************************************** '処 理:テキストファイルの保存(UTF-8) ' '戻 り 値:エラー番号 ' '引 数:strErrDesc - エラー内容 ' strFilePath - 保存するファイルパス ' strText - 保存するテキスト ' '備 考:上書き保存不可 ' Function SaveTextFile(ByRef strErrDesc, ByVal strFilePath, ByVal strText) strErrDesc = vbNullString On Error Resume Next With CreateObject("ADODB.Stream") .Charset = "UTF-8" '文字コード .Open .WriteText strText .SaveToFile strFilePath, 1 '1 - 上書き不可、2 - 上書き可 .Close End With SaveTextFile = Err.Number strErrDesc = Err.Description On Error GoTo 0 End Function
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」を付けてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、デスクトップに「SavedText.txt」というテキストファイルが保存されます。保存されたテキストファイルを削除せずに2回目を実行するとエラーになりますが、エラーの表示がプログラムによるメッセージ表示にかわり、プログラムは最後まで実行されます。
解説
5行目は WshShellオブジェクトからデスクトップの絶対パスを取得して、保存するファイル名と組み合わせて保存先の絶対パスを指定しています。
8行目は保存するテキスト内容を変数に代入しています。
9行目テキストファイルを保存するファンクションの戻り値を変数に代入しています。使用しているファンクションは22行目のアスタリスクから下にあります。
11~18行目はファンクションの戻り値に応じた条件分岐です。
22行目のアスタリスクから下はテキストファイルを保存するファンクションです。
37行目の On Error Resume Next はエラーを無視する命令です。この命令以降、エラーが発生してもプログラムは止まらずに続行し、エラー番号は Err.Number、エラー内容は Err.Description から情報を取り出すことができます。
47行目の On Error GoTo 0 はエラーを無視する命令を解除します。同時に Err.Number、Err.Description の情報は消去されます。
VBAでは「On Error GoTo ラベル名」によるエラーハンドリングがよく使われますが、VBScriptでは使用できません。
このファンクションは Excel等の VBAでも動作しますが、VBAで動作させる場合、戻り値、引数、変数、定数の型を「As ~」と記載したほうが良いです。VBA は引数の型が同じでないとエラーになります。
まとめ
- テキストデータは指定された文字コードで保存できていないとファイルを読み込むときに文字化けになる
- ADO(ActiveX Data Objects)の Streamオブジェクトでテキストファイルを保存する方法は文字コードの汎用性が高い
- デスクトップの絶対パスは WshShellオブジェクトから取得できる
- ファイルを保存するときはエラーが発生しやすい
- 「On Error GoTo ラベル名」によるエラーハンドリングは VBScriptに使用できない
ありがとうございました。
コメント