Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
配列におけるインデックスが有効範囲にありませんというエラーについて
投稿日時: 23/03/30 14:41:36
投稿者: TATSUYA.ich

 
以下のコードで、CSVファイルを開き、配列に格納した後で、所定の配列の要素をエクセルに転記するというマクロを組んでいるのですが、何故か以下のエラー発生個所で必ずn=5の時にインデックスが有効範囲にありませんというエラーが発生してしまいます。
 
読み込むCSVファイルは一部空白などもありますが、n=4までは問題なく読み込めていますし、他のcsvファイルを作成して読み込ませても同じ場所(N=5)でエラーがでます。
 
最初は配列のサイズを定義してから読み込みをしておりましたが、動的配列の処理が問題かと思い、都度配列を定義しなおすようにコードを修正してもなお、エラーが治りません。
 
エラーの修正方法をご教示くださいませんでしょうか。
 
よろしくお願いします!
 
Sub import_Sales_Data()
 
Dim tFolder, tFile
 
Dim ws As Worksheet
Dim lastRow As Long
Dim max_n As Long
 
Dim buf As String, tmp As Variant, ary() As Variant
Dim i As Long, n As Long, val As Long
 
  
tFolder = ThisWorkbook.Path & "\データ\"
tFile = Dir(tFolder & "〇〇.csv")
Set ws = Worksheets("〇〇")
lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
max_n = CreateObject("Scripting.FileSystemObject").OpenTextFile(tFile, 8).Line 'ファイルの行数取得
Dim max_items As Long
 
'MsgBox tFile
 
    Open tFile For Input As #1
     
        Line Input #1, buf
        max_items = UBound(Split(buf, ","))
         
    Close #1
     
ReDim ary(0 To max_n, 0 To max_items) As Variant
 
 
n = 0
 
    Open tFile For Input As #1
     
        Do Until EOF(1)
         
            Line Input #1, buf
             
            If buf <> "" And n <= max_n Then
             
                tmp = Split(buf, ",")
                 
                If n > UBound(ary, 1) Then
                 
                    ReDim Preserve ary(0 To n, 0 To max_items) As Variant ' 配列の再設定
                     
                End If
                 
                For i = 0 To UBound(tmp)
                 
                    ary(n, i) = tmp(i) 'ここでエラーが発生
                     
                Next i
                 
                MsgBox n
                 
            End If
             
            n = n + 1
             
        Loop
    Close #1
 
    For i = 0 To max_n
     
       ws.Cells(lastRow + i + 1, 7).Value = ary(i, 0)
        ws.Cells(lastRow + i + 1, 4).Value = ary(i, 1)
        ws.Cells(lastRow + i + 1, 5).Value = ary(i, 2)
        ws.Cells(lastRow + i + 1, 8).Value = ary(i, 3)
        ws.Cells(lastRow + i + 1, 6).Value = ary(i, 4)
        ws.Cells(lastRow + i + 1, 11).Value = ary(i, 5)
        ws.Cells(lastRow + i + 1, 12).Value = ary(i, 6)
        ws.Cells(lastRow + i + 1, 9).Value = ary(i, 7)
        ws.Cells(lastRow + i + 1, 10).Value = ary(i, 8)
        ws.Cells(lastRow + i + 1, 20).Value = ary(i, 9)
        ws.Cells(lastRow + i + 1, 21).Value = ary(i, 10)
        ws.Cells(lastRow + i + 1, 14).Value = ary(i, 11)
         
      i = i + 1
       
    Next i
 
End Sub

回答
投稿日時: 23/03/30 16:00:10
投稿者: sk

引用:
読み込むCSVファイルは一部空白などもありますが、n=4までは問題なく読み込めていますし、
他のcsvファイルを作成して読み込ませても同じ場所(N=5)でエラーがでます。

引用:
max_items = UBound(Split(buf, ","))

引用:
ReDim ary(0 To max_n, 0 To max_items) As Variant

引用:
tmp = Split(buf, ",")

引用:
For i = 0 To UBound(tmp)
  
    ary(n, i) = tmp(i) 'ここでエラーが発生
      
Next i

その時の変数 max_items と変数 i のそれぞれの値、
UBound(tmp) の戻り値、そして CSV ファイルの 6 行目の
カンマの数をどうなっているかを調べれば、自ずと
原因が見えてくるのではないかと。

投稿日時: 23/03/30 16:13:05
投稿者: TATSUYA.ich

sk様
 
ご返信ありがとうございます。
 
max_itemsとtmpは78で、Ubound(tmp)も78です。
 
6行目のカンマの数はわかりませんが、エクセルで開いたときの列数は同じで、79列になっております。
 
カンマの数が6行目から多いのかとも思いましたが、rand関数で一定範囲に無作為に数値を発生させたCSVデータ
を作成し、それを代わりに読みこませた際も同じ行でエラーが発生しました。
 
何が理由なのかわからず困り果てております。。

回答
投稿日時: 23/03/30 16:24:05
投稿者: sk

引用:
max_itemsとtmpは78で、Ubound(tmp)も78です。

それはエラーが発生する直前( n の値が 5 である時)の
ことをおっしゃっているのでしょうか。

投稿日時: 23/03/30 16:25:39
投稿者: TATSUYA.ich

SK様
 
先程頂いた情報を元にtmpを見てみましたが、何故かtmpのデータがn = 5から78→80になっており、これが原因とんっていることがわかりました。。

投稿日時: 23/03/30 16:26:35
投稿者: TATSUYA.ich

sk さんの引用:
引用:
max_itemsとtmpは78で、Ubound(tmp)も78です。

それはエラーが発生する直前( n の値が 5 である時)の
ことをおっしゃっているのでしょうか。

 
 
はい、エラーが発生する直前の数値をMsgBoxで表示して確認してみました!
 
 
 
 

回答
投稿日時: 23/03/30 17:27:19
投稿者: sk

引用:
先程頂いた情報を元にtmpを見てみましたが、何故かtmpのデータが
n = 5から78→80になっており、これが原因とんっていることがわかりました。。

ならば読み込まれている CSV ファイル内において、
カンマの個数が異なる行が混在しているのでしょう。
 
とりあえず CSV ファイルの各行に記録されているデータを
精査されることをお奨めします。

投稿日時: 23/03/30 19:04:57
投稿者: TATSUYA.ich

sk さんの引用:
引用:
先程頂いた情報を元にtmpを見てみましたが、何故かtmpのデータが
n = 5から78→80になっており、これが原因とんっていることがわかりました。。

ならば読み込まれている CSV ファイル内において、
カンマの個数が異なる行が混在しているのでしょう。
 
とりあえず CSV ファイルの各行に記録されているデータを
精査されることをお奨めします。

 
SK様
 
有難うございます!
 
列数が同じだったので、当然TMPの中のデータも同じ数だと思っておりましたが
カンマの数が関係してくるのですね、知りませんでした!!
 
 
はい!csvのデータを精査してみて、Redimで必要に応じて配列のサイズを調整
するようなコードを記述します!!
 
因みに、動くようになったのですが、今度は数字の一部が消えたりしてしまったので
こちらの対策を今度は考えないといけないと思っております。。
 
また質問させて頂くこともあるかと存じますが、よろしくお願いします!!
 
有難うございました!!