こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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
ーーーーー

投稿日時 - 2017-05-06 17:44:02

QNo.9326042

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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」です。

投稿日時 - 2017-05-07 21:24:29

ANo.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)」に入った情報は、変更できません。

しかたないので、いったん、別の配列変数に入れて、それをソートするしかありません。

長々と、関係のない話までして申し訳ございません。

では、お勉強、がんばってください。

投稿日時 - 2017-05-07 12:04:32

お礼

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

投稿日時 - 2017-05-07 15:30:07

ANo.2

> 期待する動作は
質問の仕方が悪かったですね。そういう抽象的な話じゃなくて具体的な話です。

引数が無いのにWScript.Arguments(0)を参照しているのがエラーの直接原因ですが、引数はどういう意味を持っているつもりですか?
引数の個数はWScript.Arguments.Lengthで参照できます。引数がないと0です。

投稿日時 - 2017-05-07 07:10:00

お礼

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

投稿日時 - 2017-05-07 15:31:02

ANo.1

どういう動作を期待していますか?

また、vbNormalFocus の値が未設定なので0とみなされ、ウィンドウは非表示になります。

投稿日時 - 2017-05-06 20:21:49

補足

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

投稿日時 - 2017-05-06 23:09:48

あなたにオススメの質問