Страницы: 1
RSS
Адрес (ячейка) кнопки при ее копировании, Передать адрес нажатой кнопки в макрос
 
Добрый день!
в модуле Листа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
.... Где-то же фиксируется что новая кнопка-объект расположена в другом месте....
Изменено: Констатин Л - 09.03.2022 01:10:40
Лучше пишите на почту)
 
зачем это нужно:
80+ макросов одинаковы по выполнению одной логической задачи и различаются только адресом где происходят. разумнее  было бы :
сделать 1 макрос, 1 кнопку, задать Resize и Offset нужным диапазонам с привязкой к адресу активной кнопки, которая при копировании будет находиться всегда в верхней левой (например) ячейке обрабатываемого диапазона.

Может для этой задачи не элемент формы кнопка использовать, а какую-то другую штуку.... Например ячейку-кнопку? но там тоже вопрос что получается при копировании.....

в общем задача точно определить что сейчас нажали, не важно что это будет, лишь бы копировалось вместе выделением диапазона
Лучше пишите на почту)
 
80 кнопок на листе, каждая из которых делает одно и тоже но в другом диапазоне - это мягко говоря не рационально, а грубо говорить я не стану
скорее всего все решается перехватом двойного щелчка по определенной ячейке (одним макросом и СОВСЕМ без кнопок)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
Sub Кнопка1_Щелчок()
    Dim sha As Shape
    Set sha = Me.Shapes(Application.Caller)
    [a1] = sha.TopLeftCell.Address(0, 0)
End Sub
 
игорь, отлично, работает как часы. Очень помогли

и, главное, только на элемент управления формы срабатывает,
а если кнопка сделана из фигуры - то игнорируется

Не знаете как сделать тоже самое, только на фигуру с назначенным макросом?))
Изменено: Констатин Л - 09.03.2022 02:07:06
Лучше пишите на почту)
 
.
Изменено: Ігор Гончаренко - 09.03.2022 02:10:42
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
перехватом двойного щелчка
тут, наверное есть плюс в плане быстродействия (лишние кнопки = лишняя нагрузка на оперативку)
Как я понял - двойной щелчок вешается на определенную ячейку и при копировании диапазона нужно будет прописывать новый диапазон даблклик в макрос..., что не спортивно. или есть способ просто скопировать Общий диапазон, в состав которого входила ячейка с дабл кликом и он сам ее перенесет?

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, если другое решение полностью решило Вашу задачу:
Цитата
Констатин Л написал:
даблклик как событие с офсетом. классное решение, так и делаю
мне так показалось
Изменено: Дмитрий(The_Prist) Щербаков - 09.03.2022 14:06:21
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему
Наверх