Страницы: 1
RSS
Не вызывается макрос назначенный на сочетание клавиш при открытии нескольких копий этого файла
 
Добрый вечер коллеги.
Очередной вопрос поставил в ступор.  :sceptic:
Исправлял программу, в которой куча макросов и нашёл один нюанс, который пока не могу решить.
Набросал два примера, чтобы показать проблему, она полностью показана на примере.
Есть две абсолютно одинаковые книги с одинаковыми макросами внутри. Некоторые макросы вызываются на сочетание клавиш. В данном примере на английской раскладке Ctrl+Shift+A. Если открыть книгу1 и нажать комбинацию указанную выше на английской раскладке, то отрабатывает макрос "Опа". Но если открыть вторую книгу не закрывая первую, сделать книгу2 активной и нажать опять эти клавиши на Eng раскладке, то макрос не отрабатывает. Т.е. Макрос находящийся во второй книге не выполняется, хотя он там есть и назначен на те же клавиши. Если сделать активной опять книгу1, то макрос отрабатывает.
Если первой открыть книгу2, а книгу1 открыть второй, то макрос наоборот отрабатывает только во второй книге.
Виной всему строчка кода, которая была мной добавлена:
Код
If ThisWorkbook.Name = ActiveWorkbook.Name Then Application.Run ("Module2.Макрос2")
Если убрать эту строчку, то макрос отрабатывает. Но макрос отрабатывает из книги1, а не из книги2. Что категорически нельзя. (В реальности это старая версия кода и в новом файле совершенно изменённый другой код).
В общем целая дилемма. Как оставить комбинации клавиш, но чтобы они отрабатывали из текущей книги с правильным макросом.  :qstn:  
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
назначить эту комбинацию клавишь третьему макросу, а он определит откуда пуступил запрос и выполнит нужный... хотя, подозреваю, что правильно написанный макрос в 1 экземпляре может корректно работать в ЛЮБОЙ книге нужно только его написать именно для этой цели
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Alemox написал:
Виной всему строчка кода,
абсолютно справедливая фраза: виной всему - корявый код
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
макрос в 1 экземпляре может корректно работать в ЛЮБОЙ книге
Вот этого он как раз не может. Этот макрос написан был 3 года назад под первоначальную версию файла. За три года до настоящего момента и макрос поменялся и сам файл сильно изменился. Т.е. Смысл мне лезть в сотни файлов трёхлетней давности и править чтобы он работал под современный файл. Вопрос в том как вызвать макрос из текущей книги клавишами. И почему Excel этого сам не делает. Почему приоритет по клавишам отдаётся первому открытому экземпляру.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Ігор Гончаренко написал:
виной всему - корявый код
Корявого кода тут нет, есть только проверка на то, что макрос относится к нужной книге.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, Когда и как вы возвращаете горячую кнопку в состояние до? На мой, частично образованный взгляд - активна книга - "греется" кнопка, деактивируется, "остывает".
По вопросам из тем форума, личку не читаю.
 
БМВ, что-то я не понял о чём Вы, кто греется кто остывает. Может другими словами, я не понял Ваших слов.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
т.е. Вам облом влезать в дебри собственных макросов, а всем остальным - жутко интересно??
возможно, осталось только их дождаться... (это, кстати очень удобный вариант - при минимуме усилий и наличии терпения можно получить готовое решение, но есть один побочный эффект - можно и не получить)

а пока можно попытаться найти альтернативный вариант, который решит Вашу задачу. Только в этой ситуации может быть интересен не написанный Вами код, а решаемая Вами задача.
Изменено: Ігор Гончаренко - 16.07.2018 20:49:17
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Iгор, ещё раз повторю цель вопроса, а не моего макроса:
Вопрос в том как вызвать макрос из текущей книги клавишами. И почему Excel этого сам не делает. Почему приоритет по клавишам отдаётся первому открытому экземпляру.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox,  Назначение макроса на кнопку делайте при активации книги и при деактивации сброс
просто для примера, без претензий на качество, ибо не макрушник.
Код
Private Sub Workbook_Deactivate()
    HotKeyOFF
End Sub

'Private Sub Workbook_Open()
Private Sub Workbook_Activate()
    HotKeyON
End Sub

Private Sub HotKeyON()
    On Error Resume Next
    Application.OnKey "^q", "'" & ActiveWorkbook.Name & "'!ArticleSearshFormStart"
    Application.OnKey "^é", "'" & ActiveWorkbook.Name & "'!ArticleSearshFormStart"
End Sub

Private Sub HotKeyOFF()
    On Error Resume Next
    Application.OnKey "^q"
    Application.OnKey "^é"
End Sub


Ігор Гончаренко, Игорь, Вот уж ТС в данном случае не тянет на лентяя или иждивенца. Видимо просто в тупик зашел.
Изменено: БМВ - 16.07.2018 21:52:25 (Исправлен код по замечанию в следующем посте.)
По вопросам из тем форума, личку не читаю.
 
Одно уточнение:
Код
Private Sub Workbook_Activate()
    HotKeyON
End Sub
чтобы при каждом переключении между книгами, горячие клавиши ссылались на макросы в активной в текущий момент книге.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
чтобы при каждом переключении между книгами,
Да конечно, я не обратил  внимание. просто пример попался такой :-(.

Игорь, вот теперь тебя ценю я, вот теперь тебя люблю я , наконец то програмуля, ты ТСу угодил :-).
По вопросам из тем форума, личку не читаю.
 
полно-те Вам, сударь! я, право, обескуражен...
а вот помогло-ли это ТС - скажет сам ТС)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
у него уже и так кода наворочено, что страшно модули открывать чтобы он случайно не вырвался наружу!
а тут нужно еще дописывать
да еще во все файлы (подозреваю, что их не два))
а можно было макрос в личную книгу макросов, в одном экземпляре, кнопку на панель быстрого запуска и в каком файле запустил -  в том и работает. хоть их 2, хоть 2002.
Изменено: Ігор Гончаренко - 16.07.2018 22:02:48
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Off
Ігор Гончаренко, Игорь ну так и надо передавать положительный опыт. Есть как минимум два хорошо всем известных форумчанина , которым я завидую по хорошему, так как поражен их терпению и снисходительности, даже к глупым вопросам и непонятливым ТС. Беру с них пример ( не с последних :-) ), хотя после тупых вопросов на работе, с трудом это получается.
По вопросам из тем форума, личку не читаю.
 
БМВ, Iгор, спасибо огромное. Вариант помог:
Код
Private Sub Workbook_Deactivate()
    HotKeyOFF
End Sub

Private Sub Workbook_Activate()
    HotKeyON
End Sub

Private Sub HotKeyON()
    On Error Resume Next
    Application.OnKey "^+A", "'" & ActiveWorkbook.Name & "'!Макрос1"
End Sub

Private Sub HotKeyOFF()
    On Error Resume Next
     Application.OnKey "^+A"
End Sub

Private Sub Workbook_Open()
    HotKeyON
End Sub
Цитата
Ігор Гончаренко написал:
кнопку на панель быстрого запуска
Кнопка имеется, с ней проблем нет (в списке ПКМ). Горячие клавиши для быстроты выполнения операции, чтобы на кнопку не лазить.
Если мой вопрос показался глупым, то извините. Не хотел никого напрягать. Спасибо ещё раз за помощь.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, мы тут для этого и сидим, чтоб помогать. Ну иногда еще шутить.
Однако есть в решении один минус. Предположим две книги и одна сделана не так хорошо и при её активации кнопка не прописывается, но была назначена при открытии. Былоб правильным возвращать на место предыдущее назначение, если оно было, запомнив его. Как это сделать не знаю, не делал, но вдруг кто подскажет.
По вопросам из тем форума, личку не читаю.
 
Лучше поздно чем никогда (#11).
Спасибо что есть такой замечательный форум, а главное - люди.
 
Сегодня протестировал. Всё работает безошибочно. Пока претензий к коду не имею. Ещё раз благодарю.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, теперь у меня есть :-)
Цитата
БМВ написал:
Было б правильным возвращать на место предыдущее назначение, если оно было, запомнив его.
По вопросам из тем форума, личку не читаю.
 
Здравствуйте, Михаил! Доверенное лицо Excel VBA говорит, что "прочитать сочетания клавиш из VBA невозможно".
Изменено: sokol92 - 17.07.2018 21:12:56
Владимир
 
sokol92, Владимир, и вам добрый вечер. Ну за последние 8 лет доверенное лицо могло и стать еще более доверенным, и честно говоря как раз ждал его вмешательства, ведь реально могут быть настройки которые надо вернуть назад. Наткнулся на что-то близкое,но все ж не то.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх