Добрый день! в модуле Листа1 запрос адреса ячейки кнопки транслируется в А1. При нажатии кнопки запускается определение адреса и запускается макрос Если Копировать объект Кнопка, и нажимаю на дубликат - то макрос запускается, но адрес высчитывается первой кнопки. (верхнюю кнопку можно перемещать и адрес изменяется)
Как сделать, чтобы был 1 код (а не прописывать каждую кнопку) и при срабатывании поиска адреса в ячейке А1 появлялся адрес нажатой кнопки?
Код
Sub Кнопка1_Щелчок()
Dim sha As Shape
Set sha = Sheets("Лист1").Shapes("Button 1")
Range("A1") = sha.TopLeftCell.Cells.Address _
Call FFF
End Sub
.... Где-то же фиксируется что новая кнопка-объект расположена в другом месте....
зачем это нужно: 80+ макросов одинаковы по выполнению одной логической задачи и различаются только адресом где происходят. разумнее было бы : сделать 1 макрос, 1 кнопку, задать Resize и Offset нужным диапазонам с привязкой к адресу активной кнопки, которая при копировании будет находиться всегда в верхней левой (например) ячейке обрабатываемого диапазона.
Может для этой задачи не элемент формы кнопка использовать, а какую-то другую штуку.... Например ячейку-кнопку? но там тоже вопрос что получается при копировании.....
в общем задача точно определить что сейчас нажали, не важно что это будет, лишь бы копировалось вместе выделением диапазона
80 кнопок на листе, каждая из которых делает одно и тоже но в другом диапазоне - это мягко говоря не рационально, а грубо говорить я не стану скорее всего все решается перехватом двойного щелчка по определенной ячейке (одним макросом и СОВСЕМ без кнопок)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
тут, наверное есть плюс в плане быстродействия (лишние кнопки = лишняя нагрузка на оперативку) Как я понял - двойной щелчок вешается на определенную ячейку и при копировании диапазона нужно будет прописывать новый диапазон даблклик в макрос..., что не спортивно. или есть способ просто скопировать Общий диапазон, в состав которого входила ячейка с дабл кликом и он сам ее перенесет?
PS. понял. даблклик как событие с офсетом. классное решение, так и делаю
Изменено: Констатин Л - 09.03.2022 08:54:37(нуб))))
написал: а если кнопка сделана из фигуры - то игнорируется
ну вот как бы нет...Application.Caller будет работать и для фигур тоже. Так что игнор - это явно не проделки кода, а скорее различная интерпретация имени фигуры через Application.Caller - он возвращает локальное имя фигуры, а коллекция Shapes использует внутренние(глобальные) имена. Т.е. Вы создали фигуру и она называется у Вас в окне адреса "Скругленный прямоугольник 1" - это локальное имя, которое вернет Application.Caller, а коллекция Shapes воспринимает только внутренне имя - "Rounded Rectangle 1" и на попытку обратиться к "Скругленный прямоугольник 1" выдаст сообщение, что компонент не найден. Чуть подробнее про все нюансы Application.Caller расписывал здесь: Кто вызвал функцию или процедуру?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
да, это очень полезно. спасибо за наводку. получается, что именами объектов на которые влияют физическим действием можно группировать запускаемы макросы, а потом для запуска нужного макроса искать вхождения (имя объекта) без цифр через Caller и обращаться к ним согласно цифрового индекса.
Удивительно что при копировании переименованного прямоугольника со скругленными углами Application.Caller его распознает, хотя новое имя не задавалось.
И исходный объект и дубликат при запросе имени выдают одинаковые имена. (как это возможно? почему ячейки тогда нельзя назвать одинаково?) При Этом элемент формы с именами Button 1 при копировании получают порядковые номера Эксель их сам то как-то различает?
Код
Sub Кнопка1_Щелчок()
Dim x$
[a1].ClearContents
x = ActiveSheet.Shapes(Application.Caller).Name
[a1] = x
End Sub
Как узнать точное имя формы, бывшего прямоугольника со скругленными углами?))
Констатин Л написал: если так делать, то ничего не происходит
может все же внимательно прочитать статью? Вы сделали ровно то, что Caller распознать не может и об этом четко написано в статье:
Цитата
Если вызов был из любой другой процедуры (в том числе событийной - Workbook_Open и им подобные), либо процедура была вызвана через Alt+F8 - Caller вернет ошибку REF
и именно для этого приведен пример кода, в котором так же были и комментарии - для каждой процедуры свой, в котором говорилось может ли там сработать Caller или нет. Я уже молчу про Sub и End Sub, накиданные у Вас в коде в хаотичном порядке. Такое вообще не может работать. Вам надо создать всего одну процедуру и её привязать ко всем объектам. Не надо делать еще какие-то вызовы. Да и вообще не очень понятно зачем Caller, если другое решение полностью решило Вашу задачу:
Цитата
Констатин Л написал: даблклик как событие с офсетом. классное решение, так и делаю