Страницы: 1
RSS
run-time error 9 VBA на некоторых компьютерах
 
Доброго времени суток!
Имеется программа в Excel c макросами на VBA, состоит из нескольких модулей, процедур типа Sub. Проблема в том, что на некоторых компах запускаются нормально, а на моем не в какую выкидывает ошибку "run time error 9 subscript out of range" причем не запускается ни одна из всех процедур... Посмотрел много инфы про это, но все же разобраться не могу. В общем в коде не предусмотрено подгружать данные из других файлов, все выполняется на одном листе. Может библиотеки какие не подгруженны? или настройки Excel или Windows?
Пример прилагаю
Код
Sub Gn()
br(0) = 0: br(7) = 0  '!!!!Тут сразу ошибка!!!
br(1) = 20: br(2) = 0.234: br(3) = 20: br(4) = 40: br(5) = 0.468: br(6) = 40
tr(1) = 0.1: tr(2) = 20: tr(3) = 0.1: tr(4) = 0.1: tr(5) = 20: tr(6) = 0.1
End Sub
Изменено: Lolik - 25.06.2015 22:18:18
 
Эм... ну у вас переменная не объявлена. Массив br без размерности.
Ну так, навскидку.
Кому решение нужно - тот пример и рисует.
 
Что-то я сомневаюсь, что именно в таком виде работает...Либо этот код завязан на другие, либо где-то еще объявлена переменная br как массив:
Код
Dim br(0 to n) 'n - некое число
'или
Dim br()
'а далее в модулях нечто вроде
Redim br(1 to n)
'или
Redem Preserve br(n)
Без этого код просто по определению не может работать.
А Ваша ошибка может быть вызвана тем, что не все модули скопированы или порядок вызова процедур неверен. В таком случае ни объявления, ни назначения массиву размерности не происходит. Отсюда и ошибка - попытка обратиться к несуществующему элементу массива.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
либо где-то еще объявлена переменная br как массив:
Тоже подозреваю, что в одном из модулей объявлена, как глобальная.
 
Да объявлена как глобальная
То что выше это блок ввода параметров
Код
Sub Stergen() 'la,et,ee,k0,k1,pi,ro,KN,KM,cN,cM
Dim v#
la = 250: et = 0.001619: ee = 0.8: k0 = 0: k1 = 0: pi = 4 * Atn(1)
'KN = 1 / 2: KM = Sqr(3): sma = 1
Gn
KNKMsma
     ro = KM / la: cN = KN * et * la ^ 2: cM = cN * ro
End Sub
 
Порядок тоже определен
Код
Sub Osnovnaja() 'bb,gg,qq
Stergen
Nachform
Nachvivod
Schet
End Sub
 
Слушайте, думаете мы тут сможем по двум совершенно разным кускам кода понять и дать ответ? В коде выше не видно ни объявления, ни что там дальше происходит. Я не хочу сидеть и гадать. Либо файл выкладывайте, либо вряд ли вообще получите ответ. Возможные причины я описал выше - сидите, ковыряйтесь...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Подозреваю что виновато Option Base
 
Тоже была такая мысль. Но гадать можно сколько угодно. Явно при миграции с одного ПК на другой что-то потерялось.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Слегка похожая проблема
ответа в данной ветке так толком и не увидел

вот код:
Код
Sub FreeIpAddress()
 Dim IpAddressArray(), NetworkArray() As Variant
 Dim Cell As Range
 Dim k As Integer
 Dim v As Variant
 'cells to array v1
 IpAddressArray = Sheets("PublicIntList").Range("B2:B" & Sheets("PublicIntList").Cells(Sheets("PublicIntList").Rows.Count, "B").End(xlUp).Row).Value
 'cells to array v2 notEmpty
 k = 1
 'ReDim Preserve NetworkArray(300, 1)
 For Each Cell In Sheets("PublicIntList").Range("C:C").SpecialCells(xlCellTypeConstants)
  ReDim Preserve NetworkArray(k, 1)
  NetworkArray(k, 1) = Cell.Value
  'NetworkArray(k, 2) = Cell.Address
  k = k + 1
 Next
End Sub

на второй итерации цикла For Each выходит ошибка:

Subscript out of range

ругается на строку:

Код
ReDim Preserve NetworkArray(k, 1)

при этом, если k заменить на число, к примеру 300 (заведомо выше, чем требуется), то все работает норм
Код
ReDim Preserve NetworkArray(300, 1)
так то вроде "костыль" работает, но хотелось бы понять, почему переопределение массива через переменную не дает результата?
заранее спасибо
Изменено: Hamit - 13.03.2020 16:08:31
 
Цитата
Hamit написал:
ругается на строку
ReDim Preserve может изменять только одну размерность, и только последнюю. Т.е. можно только так:
Код
ReDim Preserve NetworkArray(1, k)
а еще правильнее сначала определить размер для массива(Ваш код это позволяет):
Код
Dim rr as range,rc as range
on error resume next
set rr = Sheets("PublicIntList").Range("C:C").SpecialCells(xlCellTypeConstants)
on error goto 0
If not rr is nothint then
ReDim Preserve NetworkArray(1 to rr.Cells.count, 1 to  2)
k = 1
For Each rc In rr.cells
  NetworkArray(k, 1) = Cell.Value
  NetworkArray(k, 2) = Cell.Address
  k = k + 1
 Next
end if


P.S.
Цитата
Hamit написал:
ответа в данной ветке так толком и не увидел
а я еще 5 лет назад не увидел толком вопроса к форуму, а не к гадалкам :)
Изменено: Дмитрий(The_Prist) Щербаков - 13.03.2020 16:26:44
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему
Наверх