• 締切済み

Vbscriptエラー

vbでメッセージBOXを用いてプログラムを起動できるようにしたいのですがエラーが出てしまいます。「インデックスが有効範囲にありません。」 どこが間違っているのでしょうか? ーーーーーーー Dim objWShell Dim a Dim b a = MsgBox (" 「」を利用。"&Chr(13)&Chr(13)&_ "    「」?    "&Chr(13)&Chr(13)&Chr(13)&_ " ---------------------------- "&Chr(13)&_ "  お問い合わせください。" , vbYesNo,"「r」") ' MsgBox vbYes&"="&a If a = vbYes Then Set objWShell = CreateObject("WScript.Shell") b = WScript.Arguments(0) If b = 0 Then objWShell.Run "C:\Windows\System32\notepad.exe" ,vbNormalFocus,False ' End If End If ーーーーー

みんなの回答

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

回答No.2です。 今、プログラムをコピー&ペーストして、実行してみました。 質問者のプログラムは、エラーが出る以外には、問題はないのですが、このように書いた方が分かりやすいですよ、というサンプルです。 Option Explicit Dim a, so, wa, ws Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "txt" Then MsgBox("ドラッグ&ドロップできるのは、txtファイル1つだけです") WScript.Quit End If Set ws = CreateObject("WScript.Shell") ws.Run "notepad.exe " & wa(0), 1, False a = MsgBox (" 「」を利用。" & vbCrLf & vbCrLf & _ "    「」?    " & vbCrLf & vbCrLf & vbCrLf & _ " ---------------------------- " & vbCrLf & _ "  お問い合わせください。", vbYesNo,"「r」") 簡単な説明です。 Set so = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしていますが、テキストファイルを開くのにも使えます。 今回は、メモ帳で開くので、それには使っていませんが。 Set wa = WScript.Arguments まず、処理手順として、ドラッグ&ドロップがあります。 このプログラムが動くのは、ドラッグ&ドロップされれば、ですから、何よりもまず、ドラッグ&ドロップを想定して(と言っておいて、最初に「Set so~」などとしていますが、これはこれで必要なのです)、プログラムのできるだけ冒頭に書きます。 If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "txt" Then ドラッグ&ドロップされた情報は、「wa」に入っています。 その情報の内、ドラッグ&ドロップされたファイルの数は、「wa.Count」で分かります。 「LCase()」関数は、英字を小文字にする関数です。 これで「Txt」や「TXT」ファイルがドラッグ&ドロップされても、すべて「txt」に統一されます。 「GetExtensionName()」は、「Scripting.FileSystemObject」の機能を使って(それで頭に「so.」が付いている)、拡張子を取得します。 「拡張子が、『txt』以外」となります。 総合して、「もし、ドラッグ&ドロップされたファイルが複数だったり、拡張子が『txt』以外なら」となります。 メッセージを表示して、「WScript.Quit」で、プログラムそのものを終了してしまいます。 そして、この「If」を抜けた、ということは、「txt」ファイルが1つだけドラッグ&ドロップされた、ということなので、次の処理へゆきます。 Set ws = CreateObject("WScript.Shell") ws.Run "notepad.exe " & wa(0), 1, False a = MsgBox (" 「」を利用。" & vbCrLf & vbCrLf & _ "    「」?    " & vbCrLf & vbCrLf & vbCrLf & _ " ---------------------------- " & vbCrLf & _ "  お問い合わせください。", vbYesNo,"「r」") 「notepad.exe」は、「C:\~」と記述しなくても大丈夫です。 ドラッグ&ドロップされた「txt」ファイルを「メモ帳」で開いています。 このとき、「exe "」というように、「"」の前に、半角スペースを入れるのを忘れないでください。 半角スペースがないと、「exe」とくっついてしまうので、実行されません。 「vbNormalFocus」は、「VBScript」では、そのまま使えないので「1」と記述します。 なぜ、「1」と分かるかというと、たとえばエクセルをお持ちなら(ワードでもかまいません)、エクセルを立ち上げ、「Alt+F11」(「Alt」(「オルト」と読みます)キーを押しながら「F11」キーを押す)で、「Visual Basic Editor」の画面を出します。 画面の右側の下に、白い部分がありますが、「イミディエイト・ウィンドウ」といいます。 この「イミディエイト・ウィンドウ」に「? vbNormalFocus」として、「Enter」すると、「1」と表示されます。 もし、これから、エクセルの操作なども「VBScript」でされる場合、この「イミディエイト・ウィンドウ」で、「? ~」は覚えておかれると便利です。 それから、できれば、「Windows」標準の「改行コード」は、「Chr(13)+Chr(10)」なので、「vbCrLf」と書くように心がけてください。 もちろん、今回の場合は、全く問題ないのですが、プログラム的には、美しいです。 「Chr(10)」は「vbLf」、「Chr(13)」は「vbCr」です。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

「インデックスが有効範囲にありません。」が出るのは、 b = WScript.Arguments(0) ですね(できれば質問するとき、何行目でエラーがでたか書いてください)。 Set b = WScript.Arguments If b.Count = 0 Then なら、分かりますが、今回は、「Count」ですから、「If b.Count = 1 Then」ですね。 「b.Count」は、ドラッグ&ドロップされた「数」ですが、「b()」は、「0」から始まります。 これで、ドラッグ&ドロップされたファイル(「フォルダ」?)の「数」での判断になります。 しかし、「b(0)」は、ファイルの情報になります。 すなわち、ドラッグ&ドロップされたファイルが「D:\Programming\abc.txt」なら、その「D:\Programming\abc.txt」が「b(0)」に入ります。 ただ、見た目は配列変数のように見えますが、通常の配列変数ではありません。 変数なら、「b(0)」の中身の文字を変更することができますが、「b(0)」は、ある意味、ファイルそのものを取得しているので、中身をいらうことはできません。 たとえば、たくさんドラッグ&ドロップして、そのファイルをファイル名でソートしたい場合、 For i = 0 to b.Count -1 For j = i + 1 to b.Count If b(i) < b(j) Then x = b(i) b(i) = b(j) b(j) = x End If Next Next などと、できないのです。 いったん、ドラッグ&ドロップし、「b(0)」に入った情報は、変更できません。 しかたないので、いったん、別の配列変数に入れて、それをソートするしかありません。 長々と、関係のない話までして申し訳ございません。 では、お勉強、がんばってください。

nbokan181
質問者

お礼

ありがとうございます。 勉強あるのみですね、いろいろ試してみます。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

> 期待する動作は 質問の仕方が悪かったですね。そういう抽象的な話じゃなくて具体的な話です。 引数が無いのにWScript.Arguments(0)を参照しているのがエラーの直接原因ですが、引数はどういう意味を持っているつもりですか? 引数の個数はWScript.Arguments.Lengthで参照できます。引数がないと0です。

nbokan181
質問者

お礼

ありがとうございます。 もっと勉強してから質問するべきですね。 自分でもいろいろ試してみます。

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

どういう動作を期待していますか? また、vbNormalFocus の値が未設定なので0とみなされ、ウィンドウは非表示になります。

nbokan181
質問者

補足

期待する動作は あるアプリケーションを使用するにあたりメッセージを表示し、メッセージ内容に対して合意した場合にプログラムを起動させたいと考えています。

関連するQ&A

  • マクロ 記述が悪くエラーがかかります。

    いつも回答ありがとうございます。 最後らへんの記述で実行時エラー【型が一致しません】がかかります。 Worksheets("集計用").Range(b1, b2).Copy _ Destination:=Worksheets(b3).Range("B2") ← ここでエラーがかかる。 ワークシート名に変数を使用しているせいだと思います。 解決する方法を御指導して頂けないでしょうか?宜しくお願い致します。 Sub グラフの作成() Dim Date1 As Date Dim Date2 As Date Dim SName As String Dim b1 As Variant Dim b2 As Variant Dim b3 As Variant Dim d1 As Variant Dim d2 As Variant Dim d3 As Variant With Worksheets("集計用") s1: Date1 = Application.InputBox("最初の日付を2012/12/1のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b1 = .Columns("B").Find(Date1, , xlValues, 1) If b1 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s1 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d1 = b1.Row s2: Date2 = Application.InputBox("最初の日付を2012/12/31のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b2 = .Columns("B").Find(Date2, , xlValues, 1) If b2 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s2 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d2 = b2.Row s3: SName = Application.InputBox("商品名を入力して下さい。") If SName = "False" Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b3 = .Rows("3").Find(SName, , xlValues, 1) If b3 Is Nothing Then If MsgBox("入力した商品名が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s3 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d3 = b3.Column End With Worksheets.Add After:=Worksheets("集計用") ActiveSheet.Name = b3 Worksheets("集計用").Range(b1, b2).Copy _ Destination:=Worksheets(b3).Range("B2") Worksheets("集計用").Range(Cells(d1, d3), Cells(d2, d3)).Copy _ Destination:=Worksheets(b3).Range("C2") End Sub

  • 【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

  • VBscriptを実行するとコマンドコンソールウインドーが表示されてしまう

    VBscript初心者です。 VBscripでinputbox入力したものをmsgboxで表示するプログラムを 自作して、仕事で使用していました。 option explicit dim strmessage,y strmessage=("メッセージを入力してください。","メッセージ入力") if isempty(strmessage) then wscipt.quit y=msgbox("""" & strmessage & vbcrlf & "このメッセージを警告にしますか?",vbquestion + vbyesno,"メッセージ確認") if y=vbyes then msgbox strmessage,vbexclamation,"メッセージ" else msgbox strmessage,vbinformation,"メッセージ" end if 今日から、これを実行したときにコマンドコンソールのウインドーが 表示されるようになってしまいました。 このウインドウーを表示させなくするにはどうしたらよいでしょうか? また、Wscript.echoを使用したときにウインドーが表示されません。 初心者の私にもわかりやす回答をよろしくおねがいいたします。

  • 【VBScript】文字列変換&抽出

    VBScriptで以下の動作を実現させたいと思っています。 ・vbsファイルにテキストファイルをドラッグする ・InputBoxに任意の文字列を入力する ・変換しますか?と問われるため、 「はい」を押したらTextStreamオブジェクトを1行ごとに読み込む ・見つかった文字列を置換し、その文字列が含まれた全ての行を  別名のテキストファイルに抽出する  例:(ファイルA)    asdfghjk.vbs    1:あいうえお     2:かきくけこ 3:あいうえお ⇒ (ファイルB)    asdfghjk_20151217.vbs    1:をふうえお 2:をふうえお ・「いいえ」を押したら変換しないで別名のテキストファイルに 見つかった文字列が含む行をそのまま抽出する ・見つからなかった場合、何もしない (別名のテキストファイルを作成しない) 前のプログラムだと、文字列が見つからなかった場合でも 空のテキストファイルを作成していました。 これを防ぐために、以下のように修正したのですが、 オブジェクトが存在しない旨のエラーが出て機能してくれません。 どこが問題なのでしょうか? また、次のステップとして、変換処理を加えたいのですが、 InputBoxを再び使用せずに置換することは可能なのでしょうか? 恐れ入りますが、回答いただけますと幸いです。 Option Explicit Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim objParm, strFile, strX, lonMsgBox Dim objFSO, objOpen, strText, strNewFile, objTS Dim lonDate, v, strBuffer Set objParm = Wscript.Arguments If objParm.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit ElseIf objParm.Count >= 2 Then WScript.Echo "2つ以上のファイルが指定されています。" WScript.Quit Else strFile = objParm(0) End If Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then WScript.Echo objFSO.GetExtensionName(strFile) MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", vbExclamation, "Error" WScript.Quit End If strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If IsEmpty(strX) Then MsgBox ("キャンセルされました。") WScript.Quit ElseIf strX = "" Then MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", vbOKOnly, "Error" WScript.Quit End If lonMsgBox = MsgBox(strX & "を抽出します。" & vbCr _ & "変換しますか?", vbYesNo + vbQuestion, "確認") If lonMsgBox <> vbYes Then MsgBox ("変換をスキップします。") End If lonDate = "_" & Year(Now()) & right( "00" & Month(Now()),2) & right( "00" & Day(Now()),2) strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & _ lonDate & "." & objFSO.GetExtensionName(strFile)) Set objOpen = objFSO.OpenTextFile(strFile, ForReading) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine v = strText.ReadLine If InStr(v, strX, vbTextCompare) > 0 Then strBuffer = strBuffer & v & VBCrLf End If Loop objOpen.Close Set objOpen = Nothing If IsEmpty(strBuffer) Then MsgBox strX & "が見つかりませんでした。" WScript.Quit End If Set objTS = objFSO.OpenTextFile(strNewFile, ForWriting, True) objTS.WriteLine strBuffer objTS.Close Set objTS = Nothing Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。")

  • マクロがエラーになります

    下記のようなマクロ使いたいのですがエラーになり   動作しません 実行時エラー'1004': アプリケーション定義またはオブジェクト定義エラー のエラーになりますどのように直せばよいのでしょうか? よろしくお願いします。 Sub test() Dim ReturnMessage As VbMsgBoxResult ReturnMessage = MsgBox("VBEを閉じますか?", vbYesNo, "確認") If ReturnMessage = vbYes Then Application.VBE.MainWindow.Visible = False End If End Sub

  • エクセル/BeforeCloseイベントで保存できない!?

    エクセル2000です。 以下の_BeforeCloseイベントのマクロ(非常に簡略化してますが)ですが、標準モジュールに設定した Sub 終了() ActiveWorkbook.Close End Sub から終了させた場合、ActiveWorkbook.Saveの部分だけが働かないようです。 エクセル画面右上の×で終了させた場合は保存されます。 どうしてでしょうか? Private Sub Workbook_BeforeClose(Cancel As Boolean) With Sheet1 If .Range("A1") <> .Range("B1") Then ret = MsgBox("変更を保存しますか?" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "新:" & .Range("A1") _ + Chr(&HD) + Chr(&HA) + "旧:" & .Range("B1"), vbYesNo + vbQuestion, " 確認") If ret = vbYes Then ActiveWorkbook.Save '←なぜ保存されないの?! MsgBox "保存しました" ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If Else ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If End With End Sub

  • 【VBScript】ファイル整形

    以下の流れのプログラムを作成したく、 進めています。 下記コードの続きは、どういった感じで作りこんでいけば、 この操作が実現しますでしょうか。 恐れ入りますが、ご教示いただけますと幸いです。 ・vbsファイルにテキストファイルをドラッグする ・インプットボックスに抽出したい文字列を入力する ・テキストファイルを読み込んで、抽出した文字列を含む行を注した  別名のテキストファイル(末尾に_YYYYMMDDをつける)を生成する Option Explicit Dim intc, strf, strArguments, strInput, strmsgbox intc = 0 If WScript.Arguments.Count = 0 Then WScript.Echo "引数が指定されていません。" Else For Each strArguments In WScript.Arguments intc = intc + 1 strf = strArguments Next If intc > 1 Then MsgBox "2つ以上のファイルが指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" Else WScript.Echo strf strInput = InputBox("抽出したい文字列を入力してください。") strmsgbox = MsgBox strInput & "を抽出しました。" & vbCr _ & strInput & "を変換しますか?", 4 + 32 + 0, "確認" End If End If

  • VBAでの不明な点

    いつもお世話になっております。当方まだVBAを始めて3日ほどの新参者です。 以下のようにVBAにコードを書いたのですがどうしてもYESNO型になりません。 OKボタンしか表示しないのでぜひご指導頂けたらと思います。 バージョン:アクセス2010 Private Sub コマンド12_Click() Dim Rei As String Rei = MsgBox("【" & Format([Forms]![frm1200:合計金額]![合計金額], "#,###" & "円" & "】" & Chr(13) & Chr(13) & "金額は正しいですか?", vbYesNo)) If Rei = vbYes Then MsgBox ("OK") End If よろしくお願いします。まだ新参者なので他にご質問があればいくらでも補足しますので教えて下さい。 End Sub

  • VBScriptでのDBのエラー取得

    VBScriptでADO(ADODB)接続により、SQLServer(2012)に接続して クエリを発行し、結果をファイルに出力するVBScriptを作成して います。 SQL実行時のエラーに対応する為、VBScriptにてエラーオブジェクトのプロパティ (Err.Number、Err.Description)を使用し、エラー番号と内容を取得しているの ですが、SQL Serverから発行しているエラー番号、エラー内容を取得したいので すが、取得できません。 どのようにすれば、データベース固有のエラーを取得ができますか。 是非ご教示いただきたく、 お手数をおかけ致しますが、宜しくお願い致します。 ------------------------------------------------- Option Explicit Dim objADO Dim objRS Dim Sql if WScript.Arguments.Count <> 1 then WScript.echo("usage: script.vbs arg1") WScript.Quit(-1) end if arg1 = WScript.Arguments(0) Set objADO = CreateObject("ADODB.Connection") objADO.Open "Provider=SQLOLEDB;" & _ "Data Source=hoge;" & _ "Initial Catalog=hoge;" & _ "Integrated Security=SSPI;" sql = "" sql = "select ~ where column ='"&arg1&"'" set objRS = objADO.Execute(sql) If Err.Number <> 0 Then objADO.Close Set objADO = Nothing WScript.Quit(-1) End If sql = "" sql = "update ~ ~ where column ='"&arg1&"'" objADO.Execute(sql) If Err.Number <> 0 Then 更新の破棄とエラー内容の表示 Else 更新を反映 End If objADO.Close Set objADO = Nothing

  • VBS から BAT を起動させたい

    いつも参考にさせてもらっています。 下記vbsファイルのコード ********** 部分に何かをかいて YESを押したとき ソフト(実際にはソフトを起動させるためのbatですが) が起動するようにしたいのですがどうすれば良いでしょうか? Dim rc rc = MsgBox("起動しますがよいですか?", vbYesNo) If rc = vbYes Then ********************* End If