英単語帳スクリプトを作成してみよう

テキストファイル操作の基本が理解できたところで、冒頭で紹介した英単語帳スクリプトを作成してみましょう。既にテキストファイル読み込みの基本的な手順は理解できていると思いますので、ここでは英単語帳スクリプト固有のコードに注目してみます。

word.vbs

' データファイルが格納されているフォルダ
Const DATA_FOLDER="C:\tmp"  ' データファイルが格納されているフォルダ(1)
Dim line, answer, cnt, correct
cnt = 0 ' 問題数のカウンタ
correct = 0 ' 正解数のカウンタ

    ' データファイルを読み込み専用で開く
Set fs = WScript.CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile(fs.BuildPath(DATA_FOLDER, "data.dat"), 1, True)    ' テキストファイルの末尾に到達するまで一行ずつ読み込み(2)


Do While Not ts.AtEndOfStream
  cnt = cnt + 1 ' 問題数をカウント
  line = Split(ts.ReadLine(), Chr(9))   ' 読み込んだテキストをタブ文字で分割(3)

  answer = InputBox(line(0), "第" & cnt & "問")   ' 問題(英語)をインプットボックスで表示(4)

  If line(1) = Trim(answer) Then    '文字列の前後から余計な空白を取り除く(5)
    WScript.Echo("正解!")            ' 解答が正しい場合は「正解!」と表示し、正解数をカウントアップ
    correct = correct + 1
  Else
    WScript.Echo("残念!正解は'" & line(1) & "'でした...")   ' 間違っていた場合には正解をメッセージ表示
  End If
Loop

ts.Close()  ' テキストファイルをクローズ

WScript.Echo(cnt & "問中、正解は" & correct & "問でした。")    ' 結果を表示

ポイントとなる部分を順に解説していくことにしましょう。

(1)環境依存の情報は定数として定義する

ここではデータファイルを格納しているフォルダのパスを定数として、スクリプトの先頭で定義しています。このように環境によって変動するような情報は、定数としてスクリプトの先頭にまとめておくとよいでしょう(*)。これによって、値を変更する場合にもスクリプトの中をいちいち探し回る必要がなくなります。

*定数は変数とも似ていますが、最初に設定した値をあとから変更することのできない点で変数とは異なります。

VBScriptで定数を定義するには、以下のようにConst命令を使います。

[構文]Const命令

Const 定数名 = 値

(2)パス文字列を生成するのはBuildPathメソッドの役割

ここでは、定数DATA_FOLDERと文字列data.datとを連結して、「C:\tmp\data.dat」のようなパスを生成しています。この場合、文字列連結演算子「&」を使って「DATA_FOLDER & data.dat」のように書いてもよいのですが、今回のように、DATA_FOLDERが「C:\tmp」だったりすると、連結の結果は「C:\tmpdata.dat」となってしまい、正しくパスが作成できません。逆に「C:\tmp\」と「\data.dat」とを連結しようとすると、「C:\tmp\\data.dat」のような文字列ができてしまう恐れもあります。

もちろん、パスを書く人間がこれをきちんと意識しても良いのですが、いちいち「パスの最後は\をつけること(つけないこと)」と注意するのも面倒です。そこで、このようなパス文字列を連結する場合には、BuildPathメソッドを使いましょう。

fs.BuildPath(DATA_FOLDER, "data.dat")

BuildPathメソッドは指定されたパス文字列に適当な「\」を補って(または「\」を省いて)パス文字列を生成します。