ここから本文です

エラーについて 以下のコードvbsをBATファイルから動かしたいのですが、...

kap********さん

2019/10/1523:16:33

エラーについて

以下のコードvbsをBATファイルから動かしたいのですが、10行目で
エラーになります。

Option Explicit
Dim a, cr, cv, so, x, strval
Set so = CreateObject("Scripting.FileSystemObject")
Set cv = so.OpenTextFile("01.csv", 1)
Set cr = so.OpenTextFile("02.csv", 2, True, True)

Do Until cv.AtEndOfStream
a = Split(cv.ReadLine, ",")

strval = left(a(4), 2) ここでエラー:インデックスが有効範囲にありません。
[number:4]
If strval = "AA" or strval = "AA" Then
a(14) = "BB" & a(14)
End If

cr.WriteLine Join(a, ",")
Loop

cv.Close
cr.Close
Set cv = Nothing
Set cr = Nothing
Set so = Nothing
MsgBox("Finished!")

エラーコード:800A0009
ソース :Microsofut VBScript実行時エラー

いろいろ試しみましたが、エラーが解消しません。
皆様の知恵を貸してください。

閲覧数:
36
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

hot********さん

2019/10/1600:11:52

a = Split(cv.ReadLine, ",")

strval = left(a(4), 2)
が「インデックスが有効範囲にありません。」
になる原因は2つあります。

1つ目は、a(4)はa(0)から始まる1行のcsvの中で5番目のデータです。
そのため
a,b,c,d,e
の場合は"e"になります。
ここで「インデックスが有効範囲にありません。」になるのはデータが4個以下の場合です。

2つ目はcsvの最後が改行で終わっている場合は、最後のデータは空データになると言う事です。
つまり
1,2,3[改行]
4,5,6[改行]
と言うデータの場合は
1,2,3
4,5,6
[空行]
と3行になります。

どちらに場合もデータが4個無い場合に問題になるので
1.無い場合に備えて空データを用意
2.無い場合はスキップ
のどちらかにします。

1.は
>a = Split(cv.ReadLine, ",")

a = Split(cv.ReadLine & ",,,,", ",")

1.は
>a = Split(cv.ReadLine, ",")
>・・・略・・・
>cr.WriteLine Join(a, ",")
>Loop

a = Split(cv.ReadLine, ",")
If UBound(a) >= 4 Then
・・・略・・・
End If
cr.WriteLine Join(a, ",")
Loop
にします。
場合によっては
a = Split(cv.ReadLine, ",")
If UBound(a) >= 4 Then
・・・略・・・
cr.WriteLine Join(a, ",")
End If
Loop
にします。

エラーの原因がどちらかによっては、処理自体を変える必要があります。

  • 質問者

    kap********さん

    2019/10/1707:55:21

    返信が遅くなりすみません。

    hot********さんの②のコードでエラーは出なくなりました
    ありがとうございます。

    しかし、最終データ以降に「・」行と[EOF]行が出き、次の処理で
    エラーになってしまいました。

    [EOF]はわかるのですが、「・」がなぜできるのか?
    もしよろしければ、こちらもご教授いただければ幸いです。

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

ベストアンサー以外の回答

1〜1件/1件中

Prometheusさん

2019/10/1609:55:38

「hot********さん」の素晴らしい説明がありますので、プログラム提供者の私としては、エラー箇所を調べるプログラムを組みましたので、どこでどんなエラーが出ているか確かめてください。

以下のプログラムは、「csv」ファイルを1つだけ、プログラムファイルにドラッグ&ドロップするだけです。

項目が5個未満の行があると、何行目と、その行の内容を表示します。

最後まで処理しますので、複数行あれば、複数回、メッセージが出ます。

最後に「Finished!」と表示されるまで、「OK」を押し続けてください。

Option Explicit
Dim a, c, cv, so, wa, x
Set so = CreateObject("Scripting.FileSystemObject")
Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then
MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです")
WScript.Quit
End If
Set cv = so.OpenTextFile(wa(0), 1)
c = 0
Do Until cv.AtEndOfStream
c = c + 1
x = cv.ReadLine
a = Split(x, ",")
If UBound(a) < 4 Then
MsgBox(c & "行目" & vbCrLf & x)
End If
Loop
cv.Close
Set cv = Nothing
Set so = Nothing
MsgBox("Finished!")

私は、エラーチェックのプログラムを組んだだけなので、ベストアンサーは、必ず「hot********」さんにお願いします。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる