Каждая автофигура имеет замечательное свойство .OnAction, на которую можно посадить любой макрос, к примеру типа диспетчера действий - реакция на изменение позиции, цвета, размеров, да на любое доступное свойство. Достаточно в модуле книги прописать:
[vba]
Код
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim Shp As Shape For Each Shp In ActiveSheet.Shapes Shp.OnAction = "Start" Next End Sub
[/vba]
В модуле соорудить макрос с именем "Start", в котором расписать все реакции. И ура все будет работать...
Каждая автофигура имеет замечательное свойство .OnAction, на которую можно посадить любой макрос, к примеру типа диспетчера действий - реакция на изменение позиции, цвета, размеров, да на любое доступное свойство. Достаточно в модуле книги прописать:
[vba]
Код
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim Shp As Shape For Each Shp In ActiveSheet.Shapes Shp.OnAction = "Start" Next End Sub
[/vba]
В модуле соорудить макрос с именем "Start", в котором расписать все реакции. И ура все будет работать...VovaK
На практике обратиться к Shape, который вызывает макрос оказалось не так просто, как думалось. Для реализации задуманного необходимо передавать в качестве аргумента имя этого самого Shape. Запись имени макроса в объявлении .OnAction при передаче параметра должна обязательно иметь апостроф в начале и в конце строки типа:
В прилагаемом файле левый клик выделяет фигуру, из которой вызван макрос.
На практике обратиться к Shape, который вызывает макрос оказалось не так просто, как думалось. Для реализации задуманного необходимо передавать в качестве аргумента имя этого самого Shape. Запись имени макроса в объявлении .OnAction при передаче параметра должна обязательно иметь апостроф в начале и в конце строки типа:
VovaK, чтобы обратиться к шейпу не нужно передавать его имя в аргументах - есть свойство Application.Caller Тогда можно вешать макрос (как Sub) просто вручную.
Зато теперь понял, как вешать макрос с аргументами, что тоже бывает полезно. Мерси.
VovaK, чтобы обратиться к шейпу не нужно передавать его имя в аргументах - есть свойство Application.Caller Тогда можно вешать макрос (как Sub) просто вручную.
Зато теперь понял, как вешать макрос с аргументами, что тоже бывает полезно. Мерси.Формуляр
Формуляр, всё поначалу так здорово получалось при использовании Application.Caller … А потом я ткнул мышкой в сгруппированный объект и сразу вылетел с ошибкой. Стал разбираться почему и выяснил, что для сгруппированного рисунка Application.Caller возвращает какое-то абсолютно левое его имя, которого, естественно, нет на листе… Вот и вылетает. Обидно.
Формуляр, всё поначалу так здорово получалось при использовании Application.Caller … А потом я ткнул мышкой в сгруппированный объект и сразу вылетел с ошибкой. Стал разбираться почему и выяснил, что для сгруппированного рисунка Application.Caller возвращает какое-то абсолютно левое его имя, которого, естественно, нет на листе… Вот и вылетает. Обидно.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Понедельник, 29.08.2011, 14:55
Alex_ST, Да, неожиданный получается эффект - Caller при клике на группу всё равно возвращает имя кликтнутого граф. объекта, входящего в группу. Обратиться к нему напрямую не удаётся, приходится искать перебором. Очень неудобно!
Alex_ST, Да, неожиданный получается эффект - Caller при клике на группу всё равно возвращает имя кликтнутого граф. объекта, входящего в группу. Обратиться к нему напрямую не удаётся, приходится искать перебором. Очень неудобно! Формуляр
Да, согласен, не удобно. Поэтому всё-таки проще прямо в OnAction для каждого шэйпа прописывать его название как предложил Володя. Хотя, конечно, как предлагали вы было бы намного удобнее: - выбираешь курсором несколько шэупов - по правой кнопке приписываешь на клик по ним один и тот же макрос прямо из списка макросов. И не нужно было бы при смене листа перепрописывать ДЛЯ ВСЕХ шэйпов листа действия OnAction... А идея-то изначально была в том, чтобы на схеме электрощита, нарисованной в Excel, подсвечивать при клике проводники...
Да, согласен, не удобно. Поэтому всё-таки проще прямо в OnAction для каждого шэйпа прописывать его название как предложил Володя. Хотя, конечно, как предлагали вы было бы намного удобнее: - выбираешь курсором несколько шэупов - по правой кнопке приписываешь на клик по ним один и тот же макрос прямо из списка макросов. И не нужно было бы при смене листа перепрописывать ДЛЯ ВСЕХ шэйпов листа действия OnAction... А идея-то изначально была в том, чтобы на схеме электрощита, нарисованной в Excel, подсвечивать при клике проводники...Alex_ST
Не понятно, к чему отказываться от простого решения из-за того, что оно применимо не всегда? Для групп можно использовать Володин вариант, а для одиночных фигур - простой и удобный Caller.
Не понятно, к чему отказываться от простого решения из-за того, что оно применимо не всегда? Для групп можно использовать Володин вариант, а для одиночных фигур - простой и удобный Caller.Формуляр
Ну, я всё-таки предпочитаю использовать макросы пусть немного более сложные, но зато накладывающие как можно меньше ограничений на содержимое обрабатываемых файлов. И я не хочу держать в уме, на какой странице можно группировать картинки, а на какой нельзя.
Ну, я всё-таки предпочитаю использовать макросы пусть немного более сложные, но зато накладывающие как можно меньше ограничений на содержимое обрабатываемых файлов. И я не хочу держать в уме, на какой странице можно группировать картинки, а на какой нельзя.Alex_ST
Если "немного более сложные", то можно взять за основу мой вариант из поста №5. Он должен оба варианта обрабатывавть. Только он расчитан на 1 уровень группировки. Если группы многоуровневые - придётся туда рекурсию забабахать.
Если "немного более сложные", то можно взять за основу мой вариант из поста №5. Он должен оба варианта обрабатывавть. Только он расчитан на 1 уровень группировки. Если группы многоуровневые - придётся туда рекурсию забабахать.Формуляр
Excel 2003 EN, 2013 EN
Сообщение отредактировал Формуляр - Понедельник, 29.08.2011, 21:46
С этим не поспоришь! Руками - оно завсегда универсальнее выходит. Но есть ещё призрачная надежда, что более опытные коллеги надоумят, как напрямую обратиться по имени к фигуре, входящей в группу.
С этим не поспоришь! Руками - оно завсегда универсальнее выходит. Но есть ещё призрачная надежда, что более опытные коллеги надоумят, как напрямую обратиться по имени к фигуре, входящей в группу. Формуляр
Excel 2003 EN, 2013 EN
Сообщение отредактировал Формуляр - Понедельник, 29.08.2011, 23:22
1. Я не пойму зачем вообще к ней (субфигуре сгруппированного рисунка) обращаться? 2. А разве макрос Володи прописывает макросы на фигуры не автоматически, а "руками"? Вовсе нет! Просто текст OnAction для каждой фигуры получается свой, передаваемый в аргументах одному и тому же для всех макросу.
1. Я не пойму зачем вообще к ней (субфигуре сгруппированного рисунка) обращаться? 2. А разве макрос Володи прописывает макросы на фигуры не автоматически, а "руками"? Вовсе нет! Просто текст OnAction для каждой фигуры получается свой, передаваемый в аргументах одному и тому же для всех макросу.Alex_ST
1. Я не пойму зачем вообще к ней (субфигуре сгруппированного рисунка) обращаться?
Так только в этом и весь затык: Caller даёт нам имя субфигуры, а получить по нему фигуру как объект мы не можем - ActiveSheet.Shapes(имя) субфигуры не находит. А если получить субфигуру, как объект, то дальше группу вытянуть - элементарно.
Quote (Формуляр)
1. Я не пойму зачем вообще к ней (субфигуре сгруппированного рисунка) обращаться?
Так только в этом и весь затык: Caller даёт нам имя субфигуры, а получить по нему фигуру как объект мы не можем - ActiveSheet.Shapes(имя) субфигуры не находит. А если получить субфигуру, как объект, то дальше группу вытянуть - элементарно.Формуляр
Excel 2003 EN, 2013 EN
Сообщение отредактировал Формуляр - Понедельник, 29.08.2011, 23:18
Я так понимаю, что интерес чисто теоретический... Ну какой смысл получать субфигуру, а потом уже по ней вычислять имя фигуры когда можно сразу в аргументах приписанных по OnAction макросов задавать имя фигуры? Единственный смысл, наверное, может быть в том, что тогда можно будет обойтись без цикла прописывания макросов при смене листа. А можно будет просто мышкой выделить необходимые рисунки и по ПКМ приписать к ним всем один и тот же макрос. Ну, если у вас получится без сильного усложнения, то будет, конечно, удобнее и универсальнее. Но в принципе можно обойтись и так как предложил Володя.
Я так понимаю, что интерес чисто теоретический... Ну какой смысл получать субфигуру, а потом уже по ней вычислять имя фигуры когда можно сразу в аргументах приписанных по OnAction макросов задавать имя фигуры? Единственный смысл, наверное, может быть в том, что тогда можно будет обойтись без цикла прописывания макросов при смене листа. А можно будет просто мышкой выделить необходимые рисунки и по ПКМ приписать к ним всем один и тот же макрос. Ну, если у вас получится без сильного усложнения, то будет, конечно, удобнее и универсальнее. Но в принципе можно обойтись и так как предложил Володя.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 30.08.2011, 10:11
Я проблему со сгруппированными объектами решил проще - копируем наш объект, вставляем в какой-нибудь граф. редактор, вырезаем в нем белые области, если есть (чтоб прозрачность была), копируем и вставляем обратно в эксель. Получаем простой объект картинку. На него навешиваем что надо и не паримся
Знаю, что сто лет ветке, но вдруг.
Я проблему со сгруппированными объектами решил проще - копируем наш объект, вставляем в какой-нибудь граф. редактор, вырезаем в нем белые области, если есть (чтоб прозрачность была), копируем и вставляем обратно в эксель. Получаем простой объект картинку. На него навешиваем что надо и не паримсяPATRI0T
Ну это же уметь надо... В 2003-ем, например, для этого нужно было после копирования перед вставкой нажать Shift тогда в меню "Вставить" появлялся пункт "Вставить рисунок..." Правда, наверное, это можно сделать и через Спец. вставку, но ей, опять же, далеко не все умеют пользоваться.
Ну это же уметь надо... В 2003-ем, например, для этого нужно было после копирования перед вставкой нажать Shift тогда в меню "Вставить" появлялся пункт "Вставить рисунок..." Правда, наверное, это можно сделать и через Спец. вставку, но ей, опять же, далеко не все умеют пользоваться.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Воскресенье, 01.10.2017, 10:18