プロが教えるわが家の防犯対策術!

下記のコードを実行するとインデックスが有効範囲ではありません。となります。


Private Sub CSV読み込みボタン_Click()

Dim textData As String
Dim fileNo As Long
Dim myArray() As String '文字列型の配列変数myArrayを宣言する。
Dim myRecordSet As Recordset

Set myRecordSet = CurrentDb.OpenRecordset("CSV用顧客管理テーブル")

fileNo = FreeFile
Open "C:\access2013Data\顧客データ.csv" For Input As #fileNo

' 1行目の項目名部分を読み込むが、ここでは何もしないでおく。
Line Input #fileNo, textData

' 実際のデータの部分(2行目)からの処理を行う。
Do While Not EOF(fileNo)
Line Input #fileNo, textData

MsgBox textData

myArray = Split(textData, ",")
myRecordSet.AddNew

myRecordSet("氏名") = Replace(myArray(1), """", "")
myRecordSet("性別") = Replace(myArray(2), """", "")
myRecordSet("年齢") = Replace(myArray(3), """", "")
myRecordSet("郵便番号") = Replace(myArray(4), """", "")
myRecordSet("住所") = Replace(myArray(5), """", "")
myRecordSet("電話番号") = Replace(myArray(6), """", "")
myRecordSet.Update

Loop

Close #fileNo

CSV追加結果リストボックス.Requery
myRecordSet.Close
Set myRecordSet = Nothing

End Sub

A 回答 (4件)

ANo1です。



ACCESSはまったく知らないのですが(←しつこい(苦笑))、どうやら予定なさっているものと、とインデックスが異なっているようですね。

回答者には、質問文にご提示のコードしか情報がなくそれ以外はわかりませんので、どこが悪いのかの特定はできません。
データが正しいのであれば、その扱い方(=ご提示のコード)が間違っていることになりますし、コードが正しいとすれば、データが壊れている可能性も考えられます。
あるいは、両方ともおかしいのか・・・

いずれにしろ、データとその取扱い(=コード)がマッチしていないためにエラーが起きていると考えられます。
CSVの各レコードのデータ数が異なる可能性があるのであれば、それに応じた扱いをする必要があります。
存在しないかも知れないデータをいきなり、myArray(6)などで利用しようとすればエラーになる可能性がありますよね?
このような場合は、事前にデータが存在するかの確認を行うことと、存在しない場合の処置も併せて記述しておく必要があります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
CSVファイルの中身が悪かったようです。
データを修正し、エラー解消できました。
いろいろ助言頂きありがとうございました。

お礼日時:2016/06/02 09:19

LBound、UBound は要素数ではなく添字の最少/最大値です。


>myRecordSet("氏名") = Replace(myArray(1), """", "")
以降6行のレコードセットへの代入が正しいのか否かは実際のCSVファイルが謎なので不明です。

#1さんのアドバイスにあるように
前略
myArray = Split(textData, ",")
if ubound(myarray) = 6 then
  myRecordSet.AddNew

  myRecordSet("氏名") = Replace(myArray(1), """", "")
  中略
  myRecordSet.Update
end if
Loop

とすればよろしいかと。
ubound関数が-1になる原因は
改行コードだけの行があるとか、文字列中に問題があるとか・・・などじゃないですかね。
Excelで開いて確認するとともに、メモ帳でも開いてみて確認することが必要です。
    • good
    • 0

LBound、UBoundはともに配列の要素数になります。


0からなので、
myRecordSet("氏名") = Replace(myArray(0), """", "")になります。
さらに、UBoundで最大値が分かるので、上記のコードにIF文等判定する処理を追加してやると。
    • good
    • 0

こんにちは



ACCESSはまったく知らないのですが、「インデックスが有効範囲ではありません」とのことなので…
とりあえず、myArrayの引数の範囲を調べてみてください。
 MsgBox LBound(myArray) & " / " & UBound(myArray)
とか。
0~5(あるいは1~5とか)になっていたりしませんか?
    • good
    • 1
この回答へのお礼

調べた結果、0~6でした。
CSVファイルより3件のデータを読み込むのですが、
4件目のデータを読み込もう?とした時にエラーになるようです。
その時MsgBox LBound(myArray) & " / " & UBound(myArray)が0/-1になるので
こうならないようにするにはどうすればいいでしょうか?

お礼日時:2016/05/31 17:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています