アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBScriptのプログラムについて、
質問させてください。

以下のコードで、テキストファイルから任意の文字列を抽出し、
必要に応じて変換し、別名のテキストファイルを作成しています。

Option Explicit

'引数の取得
Function GetArg()

Dim objParm

GetArg = ""
Set objParm = Wscript.Arguments

If objParm.Count = 0 Then
WScript.Echo "引数が指定されていません。"
ElseIf objParm.Count >= 2 Then
WScript.Echo "2つ以上のファイルが指定されています。"
Else
GetArg = objParm(0)
End If

End Function

'文字列入力
Function Search(Msg)

Search = InputBox(Msg, "整形処理")

If IsEmpty(Search) Then
MsgBox ("キャンセルされました。")
Search = ""
ElseIf Search = "" Then
MsgBox "文字列が入力されていません。" & vbCr _
& "入力し直してください。", vbOKOnly, "Error"
Search = ""
ElseIf Search = " " or Search = " " Then
MsgBox "空白が入力されています。" & vbCr _
& "入力し直してください。", vbOKOnly, "Error"
Search = ""
End If

End Function

'メイン処理
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim strFile, strSearch, strChange, strMsgBox
Dim objFSO, strText, objRead, objWrite, strNewText
Dim lonDate, strWork, strBuffer

strFile = GetArg()

If strFile = "" Then
WScript.Quit
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")

If LCase(objFSO.GetExtensionName(strFile)) <> "txt" Then
MsgBox "テキストファイル以外が指定されています。" & vbCr _
& "指定し直してください。", vbExclamation, "Error"
WScript.Quit
End If

strSearch = Search("抽出したい文字列を入力してください。")
If strSearch = "" Then
WScript.Quit
End If

strMsgBox = MsgBox("『" & strSearch & "』" & "を抽出します。" & vbCr _
& "変換しますか?", vbYesNo + vbQuestion, "確認")

If strMsgBox <> vbYes Then
MsgBox ("変換をスキップします。")
Else
strChange = Search("どの文字列に変換しますか?")
End If

Set objRead = objFSO.OpenTextFile(strFile, 1)
strBuffer = ""

Do Until objRead.AtEndOfStream = True
strText = objRead.ReadLine
If InStr(1, strText, strSearch, vbTextCompare) > 0 Then
If strMsgBox <> vbYes Then
strWork = strText
Else
strWork = Replace(strText, strSearch, strChange, vbTextCompare)
End If
strBuffer = strBuffer & strWork & vbCrLf
End If
Loop

objRead.Close
Set objRead = Nothing

If strBuffer <> "" Then
lonDate = "_" & Year(Now()) & right( "00" & Month(Now()),2) & right( "00" & Day(Now()),2)
strNewText = objFSO.BuildPath( _
objFSO.GetParentFolderName(strFile), _
objFSO.GetBaseName(strFile) & _
lonDate & "." & objFSO.GetExtensionName(strFile))
Set objWrite = objFSO.OpenTextFile(strNewText, 2, True)
objWrite.Write(strBuffer)
objWrite.Close
Else
MsgBox "『" & strSearch & "』" & "が見つかりませんでした。"
WScript.Quit
End If

Set objWrite = Nothing
Set objFSO = Nothing

If objFSO.FileExists(strNewText) = True Then
WScript.Sleep 1000
MsgBox ("文字列の抽出が完了しました。")
Else
MsgBox ("文字列の抽出が失敗しました。")
End If

最後に作成されたテキストファイルの存在有無の
処理を追加したく、修正しました。
110行目の1文字目でオブジェクトがありません、
とエラーが出てしまいました。
strNewTextは存在していますし、正常に処理されると
想定していたのですが、どこが誤っていますでしょうか?
どのように修正すれば、想定の動作になりますでしょうか?

恐れ入りますが、ご教示いただけますと幸いです。

A 回答 (1件)

>>Set objFSO = Nothing


108行目でオブジェクトを破棄しているのに

>>If objFSO.FileExists(strNewText) = True Then
110行目でファイルシステムオブジェクトを使用しようとしているので、エラーになります。


なので、下記のように破棄処理を最後に持ってくればいいと思います。

If objFSO.FileExists(strNewText) = True Then
WScript.Sleep 1000
MsgBox ("文字列の抽出が完了しました。")
Else
MsgBox ("文字列の抽出が失敗しました。")
End If

Set objWrite = Nothing
Set objFSO = Nothing
    • good
    • 0
この回答へのお礼

回答有難うございました!
問題を解決することが出来ました。

お礼日時:2015/12/28 19:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!