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 が用意されています。
- テキストファイル I/O 制御
- ファイルシステムへのアクセス(ファイル存在確認)
では、実装してみましょう。
実装 - テキストファイル読込
ファイルパスが記載されたテキストファイルを読み込みます。
こちらは 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 に頼らざるを得ない程の極限環境に出会うことはほぼないですが、
使える技術が大いに越したことはありませんからね。
覚えておけば、「ないよ、環境無いよぉ!!」と情けない絶叫をしなくてもよくなる筈です。
まぁ、最近の筆者のことなんですけどね。