Добрый день столкнулся с необъяснимой для меня проблемой - после вставки гиперссылки на лист не могу нормально работать с объектом rngX - не могу присвоить ему новый диапазон.
Код
Option Explicit
Sub ProverkaProtocols()
Dim sAdr
Dim rngX
ActiveSheet.UsedRange.Clear
sAdr = "$A$2:$B$3,$C$4"
' sAdr = "$A$2:$B$3" 'с таким диапазоном работает
Set rngX = ActiveSheet.Range(sAdr)
rngX.Value = 1
ActiveSheet.Cells(1, 1).Hyperlinks.Add Anchor:=ActiveSheet.Cells(1, 1), Address:="", _
SubAddress:="", TextToDisplay:="Ссылка"
'если на следующей строчке поставить прерывание, то код выполнится без ошибки
Set rngX = ActiveSheet.Range(sAdr).Offset(6)
rngX.Value = 1
End Sub
Код странный и совершенно бесполезный потому что упрощён так, чтобы оставить только то, что нужно чтобы вызвать ошибку. Хочу поделиться следующими наблюдениями: 1. Ошибка возникает только для несвязанного диапазона. 2. Если при отладке попробовать продолжить выполнение кода, то он выполнится.
Подскажите, пожалуйста, что тут не так?! Как эта ошибка возникает? Почему код, блин, выполняется при попытке продолжить?
Спасибо большое всем за участие! JayBhagavan, спасибо за решение. Буду тестить.
Извините, что не поддерживал беседу, думал, что пост уже загнулся. Возьму на себя наглость апнуть пост. Для меня больший интерес представляет не непосредственное решение проблемы, а причины возникновения ошибки. Больно уж она странная, там затронуты какие-то механизмы работы Excel о существовании которых я пока не знаю.
У меня такое ощущение, что на выполнение строки нужно заметное время, но компилятор на это забивает и идёт дальше, пытаясь при этом использовать ещё не полученные данные. при работе с ARJ через Shell это точно так, Application.Wait спасло отца русской демократии.
В том-то и дело, что у меня нормально работает, так что пробуем наощупь:
Код
Option Explicit
Sub ProverkaProtocols()
Dim sAdr
Dim rngX
ActiveSheet.UsedRange.Clear
sAdr = "$A$2:$B$3,$C$4"
' sAdr = "$A$2:$B$3" 'с таким диапазоном работает
Set rngX = ActiveSheet.Range(sAdr)
rngX.Value = 1
ActiveSheet.Cells(1, 1).Hyperlinks.Add Anchor:=ActiveSheet.Cells(1, 1), Address:="", _
SubAddress:="", TextToDisplay:="Ссылка"
'если на следующей строчке поставить прерывание, то код выполнится без ошибки
Application.Wait Now + TimeValue("00:00:01")
Set rngX = ActiveSheet.Range(sAdr).Offset(6)
rngX.Value = 1
End Sub
Wiss написал: затронуты какие-то механизмы работы Excel о существовании которых я пока не знаю
Трудно поставить диагноз при различной работе макроса на различных конфигурациях (см. #3, #4). Что касается отладчика, то у него, по-видимому, непростые отношения с гиперссылками - попробуйте поотлаживать макрос onmouse из интересного примера Михаила (БМВ). На моих конфигурациях оператор Stop, например, в этом макросе игнорируется.
Нашёл комп, где не работает. Посмотрел. Дело во втором Set'е. Так работает:
Код
Sub ProverkaProtocols()
Dim sAdr
Dim rngX
ActiveSheet.UsedRange.Clear
sAdr = "$A$2:$B$3,$C$4"
' sAdr = "$A$2:$B$3" 'с таким диапазоном работает
Set rngX = Range(sAdr)
rngX.Value = 1
ActiveSheet.Cells(1, 1).Hyperlinks.Add Anchor:=ActiveSheet.Cells(1, 1), Address:="", _
SubAddress:="", TextToDisplay:="Ссылка"
'если на следующей строчке поставить прерывание, то код выполнится без ошибки
rngX.Offset(6).Value = 1
End Sub
Sub ProverkaProtocols()
Dim sAdr
Dim rngX
ActiveSheet.UsedRange.Clear
sAdr = "$A$2:$B$3,$C$4"
' sAdr = "$A$2:$B$3" 'с таким диапазоном работает
Set rngX = Range(sAdr)
rngX.Value = 1
ActiveSheet.Cells(1, 1).Hyperlinks.Add Anchor:=ActiveSheet.Cells(1, 1), Address:="", _
SubAddress:="", TextToDisplay:="Ссылка"
'если на следующей строчке поставить прерывание, то код выполнится без ошибки
Set rngX = rngX.Offset(6)
rngX.Value = 1
End Sub