i-Vinci TechBlog
株式会社i-Vinciの技術ブログ

VBScriptのすゝめ

自己紹介

こんにちは。i-Vinciの下位と申します。
会社内では客先常駐エンジニアとして日々雑務を処理しています。

さて、自己紹介も済んだところで本題です。

皆さん。VBScript という言語をご存知でしょうか。
そう、Windows 上でのみ動作し、拡張子が[vbs]の例のアレです。

なぜ VBScript

客先常駐エンジニアとして働いていると、偶に困ってしまうことがあります。
それは、お客様環境に依存するため、利用可能なプログラミング環境が制限されることです。

Java や C#の様に高名なプログラミング言語が使える環境であればいいのですが、
使えるプログラミング言語環境は特に無し、なんて環境に当たってしまうことがあります。

そういった時、スクリプト化できそうな単純作業が発生したら困ります。
スクリプト化の算段はついていても、実現できる環境が無いわけですから。

そこで救世主となってくれるのが VBScript という言語です。

なんとこの言語。
OS が Windows であれば開発及び実行が可能です。

別途エディタは必要ですが、流石に[メモ帳]が入っていない Windows は存在しないでしょう。

VBScript ができること

ファイル操作、テキスト編集、外部プログラム起動など。
一般業務で求められる一通りのことは可能です。

勿論、Microsoft Office の起動や Database 接続等にも対応しています。

テキスト処理が行えて、Excel、Access とのデータ送受信が可能。
おや。色々悪いことができそうですね。

実装テーマ

それでは、VBScript を使った今回の実装テーマについて説明します。


テキストファイルが存在し、中にはファイルの格納先が絶対パスで記載。
件数はランダム。但し、0 件はないものとする。
1 行につき絶対パス 1 件のみ。
文字コードは SJIS。

このファイルに記載された絶対パスの先に、ファイルが存在するか確認する。


C:\workspace\data\出力ファイル.csv
...
C:\workspace\data\出力ファイル.xlsx

必要処理

今回テーマの場合、以下の API が利用できる言語であれば実現可能です。
そして、VBScript にはそれらの API が用意されています。

  1. テキストファイル I/O 制御
  2. ファイルシステムへのアクセス(ファイル存在確認)

では、実装してみましょう。

実装 - テキストファイル読込

ファイルパスが記載されたテキストファイルを読み込みます。
こちらは FileSystemObject を使うことで実現可能です。

Dim fs : Set fs = CreateObject("Scripting.FileSystemObject")
Dim file : Set file = fs.OpenTextFile("C:\workspace\data.txt")

ReadFile = Split(file.ReadAll(), VbCrLf)

file.Close

実装 - ファイルの存在確認

次はファイルの存在確認です。
こちらも FileSystemObject を利用することで実現可能です。

Dim fs : Set fs = CreateObject("Scripting.FileSystemObject")
Dim filePath : filePath = "C:\workspace\data\テスト.csv"

If (fs.FileExists(filePath)) Then
    Debug.Print "未存在"
End If

実装まとめ

今回実装したモジュールです。
単発実行を前提としている為、異常系は考慮していません。

example.vbs

Option Explicit

Const FILE_PATH = "C:\workspace\data.txt"

Call Main

Sub Main()
    Dim records : records = ReadFile()
    Dim rejectList : rejectList = FetchRejectFiles(records)

    ' 全ファイル存在
    If (UBound(rejectList) <= 0) Then
        Call MsgBox("全ファイルの存在を確認しました", VbInformation + VbOKOnly, "通知")
        Exit Sub
    End If

    Dim msg : msg = "一部ファイルの存在が確認できませんでした。" & VbCrLf & \_
    UBound(rejectList) & "件"

    Call MsgBox(msg, VbExclamation + VbOKOnly, "通知")

End Sub

Function ReadFile()
    Dim fs : Set fs = CreateObject("Scripting.FileSystemObject")
    Dim file : Set file = fs.OpenTextFile(FILE_PATH)

    ReadFile = Split(file.ReadAll(), VbCrLf)

    file.Close

End Function

Function FetchRejectFiles(records)
    Dim v
    Dim fs : Set fs = CreateObject("Scripting.FileSystemObject")
    Dim rejectList()
    Dim i : i = 0

    For Each v In records
        ' 存在が確認できないファイル
        If (Not fs.FileExists(v)) Then
            ReDim Preserve rejectList(i)
            rejectList(i) = v
            i = i + 1
        End If
    Next

    FetchRejectFiles = rejectList

End Function

入力ファイル

C:\workspace\data\出力ファイル.csv
C:\workspace\data\出力ファイル.pdf
C:\workspace\data\出力ファイル

実行結果



総括

いかがでしたか。

VBScript による作業の自動化を行ってみました。

今回の例は、実業務で活用したものに近い形でサンプルを作成してみました。
上記サンプルで VBScript の実力の一端はご紹介できたと考えています。

事前にご紹介した通り、Excel、Access とのデータ連携も可能なため、工夫次第で活用の幅は更に広がります。

Windows 端末があればいつでも開発可能な VBScript。
ぜひ、皆さんも習得してみてください。

きっと、いつか救われます。

実際のところ、VBScript に頼らざるを得ない程の極限環境に出会うことはほぼないですが、
使える技術が大いに越したことはありませんからね。

覚えておけば、「ないよ、環境無いよぉ!!」と情けない絶叫をしなくてもよくなる筈です。
まぁ、最近の筆者のことなんですけどね。