VBAを単体の実行ファイル化する (VBScript化)

VBAマクロをExcelやWordと切り離して単体ファイル化し、ダブルクリックで実行できるようにする方法を説明します。言い換えると、WSH (Windows Scripting Host) のVBScript ファイルにする、ということになります。

VBAマクロとVBScriptのコードは共通点が多いので、作成済みのマクロを流用して一部を書き換えることで変換できます。コンパイラーなどのソフトは不要ですし、別の言語を習得する必要もありません。

新たにVBScriptファイルを作成する場合でも、いったんExcelやWordのVBAマクロとして作成し、動作確認ができてから流用するのがお勧めです。VBEのコーディング補助機能やデバッグ機能を利用できるので、二度手間になる点を差し引いても効率面・精度面で有利です。

ここでは、以下のトピックで扱ったVBAマクロをVBScript化する場合を例に説明していきます。

VBE上でVBScriptコードに適応させる

VBScriptのルールでコーディングを加工していきます。ここでの加工は、VBAマクロとしても実行可能な範囲なので、VBE上で適宜デバッグすることもできます。

Sub Word文書を連続置換VBS()  '★VBScriptには不要

  '(改1)変数のデータ型を除去
  Dim appWD 'As Word.Application
  Dim docWD 'As Word.Document
  Dim appXL 'As Excel.Application
  Dim wbXL 'As Excel.Workbook
  Dim aryRep 'As Variant
  Dim r 'As Long

  '(改2)Word、ExcelをCreateObjectでインスタンス化
  Set appWD = CreateObject("Word.Application")
  Set docWD = appWD.Documents.Open("D:\test\サンプルレポート.docx")
  appWD.Visible = True
  Set appXL = CreateObject("Excel.Application")
  Set wbXL = appXL.Workbooks.Open("D:\test\置換リスト.xlsx")
  appXL.Visible = True
  aryRep = wbXL.Worksheets("リスト").Range("置換リスト")

  'Word文書の処理
  With docWD.Content.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .MatchWildcards = False
    .MatchFuzzy = False
    '(改3)名前付き引数、組み込み定数を排除
    For r = 1 To UBound(aryRep)
      .Execute aryRep(r, 1), , , , , , , , , aryRep(r, 2), 2 'wdReplaceAll
    Next 'r  '(改4)For Next を調整
  End With
  appWD.Quit True '(改3)と同 SaveChanges:=True

End Sub  '★VBScriptには不要

改1. 変数宣言のデータ型を除去する

VBScript ではデータ型の区別がありません。このため「As ~」以降を除去します。削除の代わりにコメントアウトしておくと後でわかりやすくできます。

改2. Word、ExcelをCreateObjectでインスタンス化

VBScript からはWordやExcelは外部のアプリなので、インスタンス化してオブジェクトとして扱えるようにします。ライブラリ参照がないため、CreateObject を用います。

OK : Set appXL = CreateObject("Excel.Application")
NG : Set appXL = New Excel.Application

また、appXL.Workbooks のようにどのアプリのオブジェクトかを明示します。これ以降、オブジェクトに対するプロパティやメソッドの扱いはVBAと同じです。

ユーザーによる確認・操作がない場合は「アプリケーションオブジェクト.Visible = True」で可視化する必要はありません。ただし、エラーで中断すると不可視のアプリが起動したまま残ってしまいます。テスト時には可視化するようにしておき、完成後に外すようにすると安全です。

改3. 名前付き引数、組み込み定数を排除

ライブラリ参照がないため、名前付き引数や組み込み定数を使用しないように書き換えます。

変更前 : .Execute FindText:=検索文字列, ReplaceWith:=置換文字列, Replace:=wdReplaceAll

変更後 : .Execute 検索文字列, , , , , , , , , 置換文字列, 2

名前付き引数の名前部分を削除(この例では FindText:=など)
代わりに、何番目の引数なのかを明示します。指定を省略する引数は「,」のみを書きます。
この例のように引数が多いものだと少しややこしいところです。

組み込み定数を使用しない(この例では wdReplaceAll
代わりに組み込み定数に対応する値に書き換えます。
値は、VBEのオブジェクトブラウザーで検索して確認できます。

改4. For Next 文を調整

Next 変数」を「Next」のみに書き換えます。VBAではどちらでも可ですが、VBScriptでは「Next 変数」はエラーになります。

ここまで完了したら、VBScript化はおおよそ完了した状態です。いったんVBAマクロとしてテストしてみましょう。

VBScriptをファイル化して実行する

ファイル保存と実行

VBAのコードをコピーして、テキストエディターに貼り付ける

Sub 行と End Sub 行(’★の行)を削除する
VBScriptファイルでは最上位のプロシージャは宣言しません。ファイル自体が宣言のようなものになります。

Shift-JIS エンコードで、拡張子「.vbs」でファイルを保存する
日本語を含む場合はShift-JISでエンコードされている必要があります。
Windows 10 のメモ帳の場合は、保存時に[文字コード]に「ANSI」を指定するとShift-JISになります。

作成したファイルをダブルクリックして実行する

WSHのデバッグは、エラー位置が示されるだけの実行エラーに基づいて行うことになります。
WSHエラー
タイトルとURLをコピーしました