Страницы: 1
RSS
Ошибка определения размерности массива
 
Добрый день!
Уважаемые участники форума, помогите пожалуйста, не понимаю в чем может быть ошибка при выполнении кода:
Код
n = Worksheets("SQL Results").Cells(Rows.Count, 2).End(xlUp).Row
n1 = Worksheets("Выкладка").Cells(Rows.Count, 1).End(xlUp).Row
ReDim arrV(n1, 1) As Variant
ReDim arrMp(n, 2) As Variant

'Заполняем массивы
arrMp = Range(Cells(2, 2), Cells(n, 2))
Worksheets("Выкладка").Select
arrV = Range(Cells(2, 1), Cells(n1, 1))
Worksheets("SQL Results").Select

'Загружаем по минимальным выкладкам
For i = 2 To n
    For i1 = 2 To n1
        If arrMp(i, 2) = arrV(i1, 1) Then
            Cells(i, 35) = "Да"
            Cells(i, 36) = Worksheets("Выкладка").Cells(i1, 2)

Вылетает subscript out of range
 
If arrMp(i, 2) = arrV(i1, 1) Then
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, а разве при присвоении массиву диапазона ячеек, значения массива не принимают индексы ячеек? То есть ячейка B2 в массиве будет как 2, 2...

Попробовал  изменить на If arrMp(i, 1) = arrV(i1, 1) Then, ошибка сохранилась.  
 
Цитата
DopplerEffect написал: значения массива не принимают индексы ячеек?
Нет. Значения массива принимают значения ячеек, а вы мучаетесь с РАЗМЕРНОСТЬЮ. Файл-пример покажите
Согласие есть продукт при полном непротивлении сторон
 
на Ваш вопрос дает ответ простой фрагмент кода
Код
sub Test
  dim ar1, ar2
  ar1 = [a1:a5].value
  ar2 = [d1:d5].value
  stop
end sub
и посмотрите размерность полученных массивов
а что там у Вас не так... нужен файл
Изменено: Ігор Гончаренко - 12.04.2018 10:06:57
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
DopplerEffect написал:
ошибка сохранилась
Когда пишите про ошибку, не забывайте так же упомянуть текст этой ошибки. Потому что файла Вашего ни у кого нет, а ошибки могут быть разные.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Создал пример файла по аналогии.  
 
Судя по коду, ошибка на последнем проходе цикла - Вы же в массив загоняете данные со 2-ой строки. Значит по факту массив заканчивается на строку раньше, чем n и n1. Т.е. Вам надо либо в массивы с 1-ой строки данные загонять, либо цикл уменьшать(и делать с 1-ой строки). Так должно работать без сюрпризов:
Код
'Заполняем массивы
arrMp = Range(Cells(1, 2), Cells(n, 2)).Value
Worksheets("Выкладка").Select
arrV = Range(Cells(1, 1), Cells(n1, 1)).Value
Worksheets("SQL Results").Select
 
'Загружаем по минимальным выкладкам
For i = 2 To n
    For i1 = 2 To n1
        If arrMp(i, 1) = arrV(i1, 1) Then
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Sub Пример()
  n = Cells(Rows.Count, 1).End(xlUp).Row
  n1 = Cells(Rows.Count, 7).End(xlUp).Row
  ReDim arrMp(n, 1) As Variant
  ReDim arrV(n1, 7) As Variant
  'Çàïîëíÿåì ìàññèâû
  arrMp = Range(Cells(2, 1), Cells(n, 1))
  arrV = Range(Cells(2, 7), Cells(n1, 7))
  'Çàãðóæàåì ïî ìèíèìàëüíûì âûêëàäêàì
  For i = 1 To UBound(arrMp)
      For i1 = 1 To UBound(arrV)
          If arrMp(i, 1) = arrV(i1, 1) Then
              MsgBox "ðàáîòàåò"
          End If
      Next i1
  Next i
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, arrV берется с другого листа :) И n и n1 для разных листов вычисляются.
Наверное, надо тогда так:
Код
n = Cells(Rows.Count, 1).End(xlUp).Row
arrMp = Range(Cells(2, 1), Cells(n, 1))
ReDim arrMp(n, 1) As Variant
With Worksheets("Выкладка")
  n1 = .Cells(.Rows.Count, 7).End(xlUp).Row
  ReDim arrV(n1, 7) As Variant
  arrV = .Range(.Cells(2, 7), .Cells(n1, 7))
End with
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
а по определению размерности массива, то
arr = [D3:D5].value
получает размерность (1 to 3, 1 to 1)
такую же как и
arr = [AA100:AA102].value
индекс 1-го элемент будет (1,1) и он не зависит от того с какого диапазона получены данные с D3:D5  или  AA100:AA102,
а размерность получаемого массива зависит от размеров диапазона.
Изменено: Ігор Гончаренко - 12.04.2018 10:53:45
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо, теперь понял в чем ошибка! Разобрался.  
Страницы: 1
Наверх