- 締切済み
【VBScript】プログラム改良
VBScriptのプログラムについて、 回答頂きたく投稿しました。 以下を実行すると、 65行目で「'End'がありません。」とエラー表示されてしまいます。 End Ifは入れているはずですが、どこが問題なのでしょうか? またIfステートメントを少し減らしたいのですが、 どうすればシンプルな形になりますでしょうか? 恐れ入りますが、アドバイス頂ければ幸いです。 Option Explicit Dim intCount, strFile, strArg, strX, lonMsgBox, objFSO, objOpen, strText, strNewFile, objTS intCount = 0 If WScript.Arguments.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit End If For Each strArg In WScript.Arguments intCount = intCount + 1 strFile = strArg Next Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then If intCount > 1 Then MsgBox "2つ以上のファイルが指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit Else MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit End If Else strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If strX <> "" Then lonmsgbox = MsgBox (strX & "を抽出します。" & vbCr _ & "変換しますか?", 4 + 32 + 0, "確認") If lonmsgbox = 6 Then strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & "_New." & objFSO.GetExtensionName(strFile)) Set objTS = objFSO.OpenTextFile(strNewFile, 2, True) Set objOpen = objFSO.OpenTextFile(strFile, 1) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine If InStr(strText, strX) > 0 Then objTS.WriteLine strText End If Loop objTS.Close Set objTS = Nothing objOpen.Close Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。") Else MsgBox ("処理を中断します。") End If End If ElseIf IsEmpty(strX) then MsgBox ("キャンセルされました。") WScript.Quit Else MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", 0, "Error" WScript.Quit End If
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- watabe007
- ベストアンサー率62% (476/760)
参考に Option Explicit Dim intCount, strFile, strArg, strX, lonMsgBox, objFSO, objOpen, strText, strNewFile, objTS If WScript.Arguments.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit ElseIf WScript.Arguments.Count >= 2 Then MsgBox "2つ以上のファイルが指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit End If strFile = WScript.Arguments.Item(0) Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit End if strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If IsEmpty(strX) then MsgBox "キャンセルされました。" WScript.Quit ElseIf strX = "" Then MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", 0, "Error" WScript.Quit End If lonmsgbox = MsgBox (strX & "を抽出します。" & vbCr _ & "変換しますか?", vbYesNo + vbQuestion, "確認") If lonmsgbox <> vbYes Then MsgBox "処理を中断します。" WScript.Quit End If strNewFile = objFSO.BuildPath(objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & "_New." & objFSO.GetExtensionName(strFile)) Set objTS = objFSO.OpenTextFile(strNewFile, 2, True) Set objOpen = objFSO.OpenTextFile(strFile, 1) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine If InStr(strText, strX) > 0 Then objTS.WriteLine strText End If Loop objTS.Close Set objTS = Nothing objOpen.Close Set objFSO = Nothing MsgBox "文字列の抽出が完了しました。"
- Prome_Lin
- ベストアンサー率42% (201/470)
再び「No.2」です。 01:Option Explicit 02:Dim intCount, strFile, strArg, strX, lonMsgBox, objFSO, objOpen, strText, strNewFile, objTS 03:intCount = 0 04:If WScript.Arguments.Count = 0 Then 05: WScript.Echo "引数が指定されていません。" 06: WScript.Quit 07:End If 08:For Each strArg In WScript.Arguments 09: intCount = intCount + 1 10: strFile = strArg 11:Next 12:Set objFSO = CreateObject("Scripting.FileSystemObject") 13:If objFSO.GetExtensionName(strFile) <> "txt" Then 14: If intCount > 1 Then 15: MsgBox "2つ以上のファイルが指定されています。" & vbCr & "ファイルを指定し直してください。", 48, "Error" 16: WScript.Quit 17: Else 18: MsgBox "テキストファイル以外が指定されています。" & vbCr & "ファイルを指定し直してください。", 48, "Error" 19: WScript.Quit 20: End If 21:Else 22: strX = InputBox("抽出したい文字列を入力してください。", "変換処理") 23: If strX <> "" Then 24: lonmsgbox = MsgBox (strX & "を抽出します。" & vbCr & "変換しますか?", 4 + 32 + 0, "確認") 25: If lonmsgbox = 6 Then 26: strNewFile = objFSO.BuildPath(objFSO.GetParentFolderName(strFile), objFSO.GetBaseName(strFile) & "_New." & objFSO.GetExtensionName(strFile)) 27: Set objTS = objFSO.OpenTextFile(strNewFile, 2, True) 28: Set objOpen = objFSO.OpenTextFile(strFile, 1) 29: Do Until objOpen.AtEndOfStream = True 30: strText = objOpen.ReadLine 31: If InStr(strText, strX) > 0 Then 32: objTS.WriteLine strText 33: End If 34: Loop 35: objTS.Close 36: Set objTS = Nothing 37: objOpen.Close 38: Set objFSO = Nothing 39: WScript.Sleep 1000 40: MsgBox ("文字列の抽出が完了しました。") 41: Else 42: MsgBox ("処理を中断します。") 43: End If 44: End If 45: ElseIf IsEmpty(strX) then 46: MsgBox ("キャンセルされました。") 47: WScript.Quit 48:Else 49: MsgBox "文字列が入力されていません。" & vbCr & "入力し直してください。", 0, "Error" 50: WScript.Quit 51:End If まず、4~7行目ですが、「引数が指定されていない」場合、8行目以降のプログラム処理は何をしているのでしょう? すなわち、4行目の「If」は、このプログラム全体の「If」のおつもりではないのでしょうか? 従って、7行目で「End If 」をしても、プログラムは下の行を実行してしまいます。 4行目の「If」で、「引数が指定されていない」場合、7行目の「End If」でこのプログラムそのものが終了している、と勘違いされておられませんか?
- Prome_Lin
- ベストアンサー率42% (201/470)
見やすくしました。 01:Option Explicit 02: Dim intCount, strFile, strArg, strX, lonMsgBox, objFSO, objOpen, strText, strNewFile, objTS 03: intCount = 0 04:☆ If WScript.Arguments.Count = 0 Then 05: WScript.Echo "引数が指定されていません。" 06: WScript.Quit 07:☆ End If 08: For Each strArg In WScript.Arguments 09: intCount = intCount + 1 10: strFile = strArg 11: Next 12: Set objFSO = CreateObject("Scripting.FileSystemObject") 13:★ If objFSO.GetExtensionName(strFile) <> "txt" Then 14:○ If intCount > 1 Then 15: MsgBox "2つ以上のファイルが指定されています。" & vbCr & "ファイルを指定し直してください。", 48, "Error" 16: WScript.Quit 17:○ Else 18: MsgBox "テキストファイル以外が指定されています。" & vbCr & "ファイルを指定し直してください。", 48, "Error" 19: WScript.Quit 20:○ End If 21:★ Else 22: strX = InputBox("抽出したい文字列を入力してください。", "変換処理") 23:● If strX <> "" Then 24: lonmsgbox = MsgBox (strX & "を抽出します。" & vbCr & "変換しますか?", 4 + 32 + 0, "確認") 25:◎ If lonmsgbox = 6 Then 26: strNewFile = objFSO.BuildPath(objFSO.GetParentFolderName(strFile), objFSO.GetBaseName(strFile) & "_New." & objFSO.GetExtensionName(strFile)) 27: Set objTS = objFSO.OpenTextFile(strNewFile, 2, True) 28: Set objOpen = objFSO.OpenTextFile(strFile, 1) 29: Do Until objOpen.AtEndOfStream = True 30: strText = objOpen.ReadLine 31:◇ If InStr(strText, strX) > 0 Then 32: objTS.WriteLine strText 33:◇ End If 34: Loop 35: objTS.Close 36: Set objTS = Nothing 37: objOpen.Close 38: Set objFSO = Nothing 39: WScript.Sleep 1000 40: MsgBox ("文字列の抽出が完了しました。") 41:◎ Else 42: MsgBox ("処理を中断します。") 43:◎ End If 44:★ End If 45: ElseIf IsEmpty(strX) then 46: MsgBox ("キャンセルされました。") 47: WScript.Quit 48:● Else 49: MsgBox "文字列が入力されていません。" & vbCr & "入力し直してください。", 0, "Error" 50: WScript.Quit 51:● End If 回答No.1の方が言われているとおり、上記の場合、「45行目」の「ElseIf」がどの「If」に対応しているのか分かりません。 なお、あまり「If」を複雑にせず(見通しが悪い)、プログラムを工夫できないでしょうか?
- notnot
- ベストアンサー率47% (4900/10358)
Elseのあとに、ElseIfが出てきちゃってますね。これが原因です。 Option Explicit Dim intCount, strFile, strArg, strX, lonMsgBox, objFSO, objOpen, strText, strNewFile, objTS intCount = 0 If WScript.Arguments.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit End If For Each strArg In WScript.Arguments intCount = intCount + 1 strFile = strArg Next Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then If intCount > 1 Then MsgBox "2つ以上のファイルが指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit Else MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit End If Else strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If strX <> "" Then lonmsgbox = MsgBox (strX & "を抽出します。" & vbCr _ & "変換しますか?", 4 + 32 + 0, "確認") If lonmsgbox = 6 Then strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & "_New." & objFSO.GetExtensionName(strFile)) Set objTS = objFSO.OpenTextFile(strNewFile, 2, True) Set objOpen = objFSO.OpenTextFile(strFile, 1) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine If InStr(strText, strX) > 0 Then objTS.WriteLine strText End If Loop objTS.Close Set objTS = Nothing objOpen.Close Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。") Else MsgBox ("処理を中断します。") End If End If ElseIf IsEmpty(strX) then MsgBox ("キャンセルされました。") WScript.Quit Else MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", 0, "Error" WScript.Quit End If