• 締切済み

【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

みんなの回答

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

参考に 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.3

再び「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)
回答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 回答No.1の方が言われているとおり、上記の場合、「45行目」の「ElseIf」がどの「If」に対応しているのか分かりません。 なお、あまり「If」を複雑にせず(見通しが悪い)、プログラムを工夫できないでしょうか?

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

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