今回はVBScriptでいつものようにちまちまとバッチを作っていたところ、よくわからないエラーが出て、若干ハマったので紹介しておきます。尚、VBScriptで紹介していますが、VBAでも同じ挙動になると思うので、VBAでも同様に参考になればと思います。
今回作成していたバッチの処理内容
今回は以下の様な処理を作っていました。
- データベースにADOで接続。
- 所定のパスにあるテキストファイルを読み込んで値を取得。
- 取得した値を元に、データベースの特定のテーブルをSELECTしレコードセットを取得。
- レコードセットの値を項番2のテキストファイル上書きで書き込む。
といった流れです。
項番2のコードは以下にしていました。※抜粋
Dim objFS
Dim objFile
Dim TargetFaileName
Dim TextValue
TargetFaileName = "テキストファイルのフルパス"
'FileSystemObjectを生成します。
Set objFS = CreateObject("Scripting.FileSystemObject")
'テキストファイルを上書きモードで開きます。
'※後ろの処理で上書きしたいので読取専用ではなく上書きモードを指定
Set objFile = objFS.OpenTextFile(TargetFaileName, 2)
'テキストファイルの値を変数に代入します。
'※↓ここで謎のエラー発生
TextValue = objFile.ReadLineこのサンプルコードの最終行の位置で以下のエラーが出ます。
エラーメッセージ:データベースコンテキストは‘〇〇’に変更されました。※〇〇はデータベース名
エラーコード:800A0036
確かに実際のコードでは、上記の処理の前にデータベースに接続だけはしていますが、エラーが出ている処理では、テキストファイルから取得した値を変数に代入しようとしているだけなので、データベースはまったく関係ないのです。
なんでだろう・・・
原因:読み取りは読取専用モードで開かないとダメらしい
ReadLineメソッドはOpenTextFileでテキストファイルを開く際の引数で、読取専用を指定しないとエラーになるようです。
具体的には上記のコードの13行目を以下に修正します。
Set objFile = objFS.OpenTextFile(TargetFaileName, 1)
読取専用モードで開くと、当然後から対象のテキストファイルに書き込む際にエラーになるので、読取専用モードで開いて、必要な値を取得したらいったん対象のテキストファイルは閉じて、また値を書き込む際に、今度は上書きモードで開きなおさないとダメとのこと。
横着をするなということです。
原因がわかってしまえば「なんだそんな簡単なことか」という感じですが、スクリプトのエラーメッセージがまったくそんな内容ではないので、手間取りました。もっとまともなエラーメッセージを出してほしかった・・・。
そんな訳で、今回もありがとうございました。