Доброго времени суток! Имеется программа в Excel c макросами на VBA, состоит из нескольких модулей, процедур типа Sub. Проблема в том, что на некоторых компах запускаются нормально, а на моем не в какую выкидывает ошибку "run time error 9 subscript out of range" причем не запускается ни одна из всех процедур... Посмотрел много инфы про это, но все же разобраться не могу. В общем в коде не предусмотрено подгружать данные из других файлов, все выполняется на одном листе. Может библиотеки какие не подгруженны? или настройки Excel или Windows? Пример прилагаю
Что-то я сомневаюсь, что именно в таком виде работает...Либо этот код завязан на другие, либо где-то еще объявлена переменная br как массив:
Код
Dim br(0 to n) 'n - некое число
'или
Dim br()
'а далее в модулях нечто вроде
Redim br(1 to n)
'или
Redem Preserve br(n)
Без этого код просто по определению не может работать. А Ваша ошибка может быть вызвана тем, что не все модули скопированы или порядок вызова процедур неверен. В таком случае ни объявления, ни назначения массиву размерности не происходит. Отсюда и ошибка - попытка обратиться к несуществующему элементу массива.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Да объявлена как глобальная То что выше это блок ввода параметров
Код
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 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)
так то вроде "костыль" работает, но хотелось бы понять, почему переопределение массива через переменную не дает результата? заранее спасибо
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 лет назад не увидел толком вопроса к форуму, а не к гадалкам