Страницы: 1
RSS
Ошибка при присвоении значения переменной Range после вставки гиперссылки
 
Добрый день столкнулся с необъяснимой для меня проблемой - после вставки гиперссылки на лист не могу нормально работать с объектом 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. Если при отладке попробовать продолжить выполнение кода, то он выполнится.

Подскажите, пожалуйста, что тут не так?! Как эта ошибка возникает? Почему код, блин, выполняется при попытке продолжить?
Изменено: Wiss - 23.11.2018 15:35:20
Я не волшебник, я только учусь.
 
Не пойму в чём проблема. Как обходной путь замените:
Код
ActiveSheet.Cells(1, 1).Hyperlinks.Add Anchor:=ActiveSheet.Cells(1, 1), Address:="", _
    SubAddress:="", TextToDisplay:="Ссылка"
на:
Код
ActiveSheet.Cells(1, 1).Formula = "=HYPERLINK("""",""Ссылка"")"

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Здравствуйте, коллеги! Действительно, любопытно. Следующий (упрощенный) макрос:
Код
Sub test()
    ActiveSheet.Hyperlinks.Add Cells(1, 1), Address:=""
    Range("A2,A3").Select
End Sub

выдает ошибку на версиях 2007 (ru), 2016 (32-, ru), но корректно отрабытывает на 2016 (64-, en).
Владимир
 
2013 (32) ru - полёт нормальный.
 
Цитата
Юрий М написал: полёт нормальный
Взлетел только после замены русских А на латинские в строке
Цитата
sokol92 написал:  Range("A2,A3").Select
Согласие есть продукт при полном непротивлении сторон
 
А я ничего не менял - скопировал прямо из #3 )
 
Я имел ввиду файл. Менял в макросе, который в самом файле
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Юрий М написал:
скопировал прямо из #3
Извиняюсь, корректировка: я про файл говорю. Скачал и запустил макрос - выделил две ячейки. Ничего не менял ))
 
Цитата
Sanja написал:
Взлетел только после замены русских А на латинские в строке
А им вослед старуха: - Нет!
                   Пирог мой не сырой!
Владимир
 
Цитата
JayBhagavan написал:
Не пойму в чём проблема
проблема в том, что если в коде #1 строкае17-18 поставить Stop  - код работает
а если не ставиь - валится по ошибке!!!!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, это мне понятно. Мне не понятно, почему штатное выполнение макроса выдаёт ошибку, а пошаговое, в режиме отладки ошибки НЕ выдаёт.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо большое всем за участие! JayBhagavan, спасибо за решение. Буду тестить.

Извините, что не поддерживал беседу, думал, что пост уже загнулся. Возьму на себя наглость апнуть пост.
Для меня больший интерес представляет не непосредственное решение проблемы, а причины возникновения ошибки.
Больно уж она странная, там затронуты какие-то механизмы работы Excel о существовании которых я пока не знаю.
Я не волшебник, я только учусь.
 
Wiss, мне тоже интересна причина такого поведения.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
она интересна и тем, кто об этом не пишет но открывал файл и выполнил код в двух режимах.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Встречалась такая проблема несколько раз - пошагово работает, автоматически - нет. Причину не знаю.
 
У меня такое ощущение, что на выполнение строки нужно заметное время, но компилятор на это забивает и идёт дальше, пытаясь при этом использовать ещё не полученные данные. при работе с ARJ через Shell это точно так, Application.Wait спасло отца русской демократии.
 
StoTisteg, покажите код от ТСа с Application.Wait , который при запуске не вываливается в редактор макроса с ошибкой.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
В том-то и дело, что у меня нормально работает, так что пробуем наощупь:
Код
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
 
StoTisteg, у меня также вываливается с ошибкой Ваш код, как и код ТСа. Я ставил задержку 10 сек - тоже самое.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Значит, моя догадка была неверной или не там задержка... А на чём вываливается-то?
 
Попробуйте Do Events применить, перед строкой, где останавливается.
 
Цитата
Wiss написал:
затронуты какие-то механизмы работы Excel о существовании которых я пока не знаю
Трудно поставить диагноз при различной работе макроса на различных конфигурациях (см. #3, #4). Что касается отладчика, то у него, по-видимому, непростые отношения с гиперссылками - попробуйте поотлаживать макрос onmouse из интересного примера Михаила (БМВ). На моих конфигурациях оператор Stop, например, в этом макросе игнорируется.
Владимир
 
StoTisteg, на этом. Ошибка 1004.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Михаил С. написал: Попробуйте Do Events
Пробовал. Не помогло.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Нашёл комп, где не работает. Посмотрел. Дело во втором 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
Смотрим дальше...
 
Уточняю. Проблема в переменной sAdr, так
Код
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
тоже работает.
 
Я всегда знал, что лишние переменные — зло.
 
Замена избавляет от ошибки
Код
 'Set rngX = ActiveSheet.Range(sAdr).Offset(6)
    Set rngX = rngX.Offset(6)
но не решает проблему. Проблема не rngX.  Такое ощущение, что приложение оформляет гиперссылку и на это время  Range(sAdr) не доступен.
Изменено: БМВ - 26.11.2018 13:29:12
По вопросам из тем форума, личку не читаю.
 
Цитата
StoTisteg написал:
pplication.Wait спасло отца русской демократии.
Не помогло

Цитата
Михаил С. написал:
Попробуйте Do Events
Не помогло

Цитата
sokol92 написал:
попробуйте поотлаживать макрос onmouse из интересного  примера  Михаила ( БМВ )
Посмотрел на макрос Михаила ( БМВ ). Он супер. При отладке Stop не работает.
Я не волшебник, я только учусь.
Страницы: 1
Наверх