Ошибка "Run-time error "9": Subscript out of range" - VB

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Программа выводит ошибку "Run-time error "9": Subscript out of range", но не могу понять почему. Помогите пожалуйста.
Листинг программы
  1. Sub Загрузка данных из файлов()
  2. ' папка, в которой будет производиться поиск файлов DAT для обработки
  3. ПапкаДляФайлов$ = "E:\Data"
  4. Dim ErrorsArray ' пустой массив для ошибок
  5. ' Считываем данные из всех файлов .DAT в папке в двумерный массив
  6. DataArr = DATfolder2Array(ПапкаДляФайлов$, 4, "", ErrorsArray)
  7. ' результаты выводим на листы "errors" и "result" (они должны существовать)
  8. 'Array2worksheet Worksheets("îøèáêè"), ErrorsArray, _
  9. Array("Имя файла", "Номер строки, "Данные из строки")
  10. Array2worksheet Worksheets("ðåçóëüòГ*ГІ"), DataArr, _
  11. Array("Столбец 1", "Столбец 2", "Столбец 3", "Столбец 4")
  12. End Sub

Сама функция DATfolder2Array

Листинг программы
  1. Function DATfolder2Array(ByVal FolderPath$, ByVal ColumnsCount As Long, _
  2. ByVal TextColumns$, ByRef ErrorsArr) As Variant
  3. ' получает путь FolderPath$ к папке с DAT-файлами
  4. ' считывает из файлов все строки, в которых число записей в строке равно ColumnsCount
  5. ' остальные (неподходящие) строки отправляет в массив ErrorsArr
  6. ' (столбцы ErrorsArr: 1-имя файла, 2 - номер строки, 3 - данные)
  7. ' в переменной TextColumns$ через запятую перечислены номера ТЕКСТОВЫХ столбцов
  8. ' Возвращает двумерный массив размером N*ColumnsCount
  9. ReDim ErrorsArr(1 To 1000, 1 To ColumnsCount + 2)
  10. On Error Resume Next
  11. Dim coll As New Collection, filename
  12. filename = Dir(FolderPath$ & "*.dat")
  13. While filename <> ""
  14. coll.Add filename ' считываем в коллекцию coll нужные имена файлов
  15. filename = Dir
  16. Wend
  17. Dim newtxt As String, ro As String, errIndex As Long
  18. For Each filename In coll
  19. Application.StatusBar = "ГЋГЎГ°Г*ГЎГ*òûâГ*ГҐГІГ±Гї ГґГ*éë: " & filename
  20. newtxt = Split(ReadTXTfile(FolderPath$ & filename), vbLf, 2)(1)
  21. tempArr = "": tempArr = Split(newtxt, vbNewLine)
  22. For i = LBound(tempArr) To UBound(tempArr)
  23. ro = tempArr(i): ro = Replace(ro, vbTab, ";")
  24. If UBound(Split(ro, ";")) <> ColumnsCount - 1 And Len(Trim(ro)) > 0 Then
  25. tempArr(i) = "": errIndex = errIndex + 1
  26. ErrorsArr(errIndex, 1) = filename
  27. ErrorsArr(errIndex, 2) = "ÑòðîêГ* " & i + 1
  28. ErrorsArr(errIndex, 3) = ro
  29. End If
  30. Next i
  31. newtxt = Join(tempArr, vbNewLine)
  32. txt = txt & newtxt & vbNewLine: DoEvents
  33. Next
  34. While InStr(1, txt, vbNewLine & vbNewLine) > 0
  35. txt = Replace(txt, vbNewLine & vbNewLine, vbNewLine)
  36. Wend
  37. txt = Replace(txt, vbTab, ";"): tempArr = Split(txt, vbNewLine)
  38. ReDim newArr(1 To UBound(tempArr), 1 To ColumnsCount)
  39. For i = LBound(tempArr) To UBound(tempArr)
  40. roArr = "": roArr = Split(tempArr(i), ";")
  41. For j = 1 To ColumnsCount
  42. newArr(i + 1, j) = roArr(j - 1)
  43. If "," & TextColumns$ & "," Like "*," & j & ",*" Then
  44. newArr(i + 1, j) = "'" & newArr(i + 1, j)
  45. End If
  46. Next j
  47. Next i
  48. DATfolder2Array = newArr
  49. Application.StatusBar = False
  50. End Function

Функция Arrayy2worksheet

Листинг программы
  1. Sub Array2worksheet(ByRef sh As Worksheet, ByVal arr, ByVal ColumnsNames)
  2. ' Получает двумерный массив Arr с данными,
  3. ' и массив заголовков столбцов ColumnsNames.
  4. ' Заносит данные из массива на лист sh
  5. If UBound(arr, 1) > sh.Rows.Count - 1 Or UBound(arr, 2) > sh.Columns.Count Then
  6. MsgBox "Массив не влезет на лист " & sh.Name, vbCritical, _
  7. "Размеры массива: " & UBound(arr, 1) & "*" & UBound(arr, 2): End
  8. End If
  9. With sh
  10. .UsedRange.ClearContents
  11. ColumnsNamesCount = UBound(ColumnsNames) - LBound(ColumnsNames) + 1
  12. .Range("a1").Resize(, ColumnsNamesCount).Value = ColumnsNames
  13. .Range("a1").Resize(, ColumnsNamesCount).Interior.ColorIndex = 15
  14. .Range("a2").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
  15. '.UsedRange.EntireColumn.AutoFit
  16. End With
  17. End Sub

Функция ReadTXTfile

Листинг программы
  1. Function ReadTXTfile(ByVal filename As String) As String
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. Set ts = fso.OpenTextFile(filename, 1, True): ReadTXTfile = ts.ReadAll: ts.Close
  4. Set ts = Nothing: Set fso = Nothing
  5. End Function

Функция CombineArrays

Листинг программы
  1. Function CombineArrays(Arr1 As Variant, Arr2 As Variant) As Variant
  2. 'функция CombineArrays объединяет 2 двумерных массива ОДИНАКОВОЙ ШИРИНЫ в один массив
  3. '(второй массив "дописывается" ниже первого, путем добавления строк из второго массива в первый)
  4. 'Функция возвращает массив той же ширины, что и исходные,
  5. 'а вертикальная размерность возвращаемого массива равна сумме количества строк исходных массивов
  6. '
  7. 'В случае, если один из массивов не задан, функция возвращает другой заданный массив (без изменений)
  8. 'ВНИМАНИЕ: все размерности массивов 1 и 2 должны совпадать (кроме первой размерности - по высоте)
  9. 'Подразумевается, что индексы массивов начинаются с 1 (директива Option Base 1)
  10.  
  11. ' если один из параметров не является массивом, функция возвращает другой параметр (массив)
  12. If (Not IsArray(Arr1)) And IsArray(Arr2) Then CombineArrays = Arr2: Exit Function
  13. If (Not IsArray(Arr2)) And IsArray(Arr1) Then CombineArrays = Arr1: Exit Function
  14. ' если оба параметра функции не являются массивами
  15. If (Not IsArray(Arr2)) And (Not IsArray(Arr1)) Then
  16. Debug.Print "ОШИБКА: Оба переданных значения не являются массивами!"
  17. CombineArrays = Null: Exit Function
  18. End If
  19. ' проверяем совпадение размерностей массивов Arr1 и Arr2
  20. On Error Resume Next: Err.Clear
  21. If (LBound(Arr1, 2) <> LBound(Arr2, 2)) Or (UBound(Arr1, 2) <> UBound(Arr2, 2)) Then
  22. Debug.Print "ОШИБКА: Размерности массивов (по ширине) не совпадают"
  23. CombineArrays = Null: Exit Function
  24. End If
  25. If Err.Number = 9 Then
  26. Debug.Print "ОШИБКА: Один из массивов не является двумерным!"
  27. CombineArrays = Null: Exit Function
  28. End If
  29.  
  30. ReDim arr(1 To UBound(Arr1, 1) + UBound(Arr2, 1), LBound(Arr1, 2) To UBound(Arr1, 2))
  31. For i = 1 To UBound(Arr1, 1)
  32. For j = LBound(Arr1, 2) To UBound(Arr1, 2)
  33. arr(i, j) = Arr1(i, j)
  34. Next
  35. Next
  36. For i = 1 To UBound(Arr2, 1)
  37. For j = LBound(Arr2, 2) To UBound(Arr2, 2)
  38. arr(i + UBound(Arr1, 1), j) = Arr2(i, j)
  39. Next
  40. Next
  41. CombineArrays = arr ' возвращаем объединённый массив
  42. End Function
Файлы перевел в .txt для того, чтобы выложить в тему. Они созданы для примера. Реальный массив, который нужно обработать, гораздо больше. Но хотелось бы для начала разобраться с этими файлами.

Решение задачи: «Ошибка "Run-time error "9": Subscript out of range"»

textual
Листинг программы
  1. Sub Загрузка данных из файлов()
  2.     ' папка, в которой будет производиться поиск файлов DAT для обработки
  3.    ПапкаДляФайлов$ = "E:\Data"
  4.  
  5.     Dim ErrorsArray    ' пустой массив для ошибок
  6.  
  7.     ' Считываем данные из всех файлов .DAT в папке в двумерный массив
  8.    DataArr = DATfolder2Array(ПапкаДляФайлов$, 4, "", ErrorsArray)
  9.  
  10.     ' результаты выводим на листы "errors" и  "result" (они должны существовать)
  11.    'Array2worksheet Worksheets("ошибки"), ErrorsArray, _
  12.                     Array("Имя файла", "Номер строки, "Данные из строки")
  13.    
  14.     Array2worksheet Worksheets("результат"), DataArr, _
  15.                     Array("Столбец 1", "Столбец 2", "Столбец 3", "Столбец 4")
  16. End Sub
  17.  
  18.  [/BASIC]
  19.  
  20. Подсвечивает строку:
  21. [BASIC]Array2worksheet Worksheets("результат"), DataArr, _
  22.                     Array("Столбец 1", "Столбец 2", "Столбец 3", "Столбец 4")

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут