Страницы: 1
RSS
Как макросом в модулях вызвать макрос из листов?
 
Если оба макроса находятся на Листе, то все работает, если вызывающий макрос находится в Модулях - не работает. Можно ли вызвать из модуля макрос с листа?
Изменено: Михаил - 03.03.2021 16:42:14
 
В модулях листов должны бытть макросы событий. Остальное - в общий модуль. Тогда не будут возникать такие вопросы.

И посмотрите, что у Вас под спойлером...
 
Попробуйте заменить слово Private на Public в модуле листа
P.S. Процедуры Private - не видны из других модулей.
Изменено: New - 03.03.2021 16:43:59
 
vikttur, Я как раз хочу из модуля вызвать макрос, который на листе. Это реально? (картинку под спойлер не могу вставить).
New, Заменил на Public, то же самое. В пределах листа работает, из модуля - нет
 
Макрос из модуля листа должен вызывать макрос из общего модуля. В макросе из общего модуля прописать все то, что было в макросе листа.
Теперь макрос из общего модуля можно вызвать откуда угодно.
 
В Вашем случае можно так:

Код
Лист1.PressButton1
Владимир
 
Интересный вопрос :) Нажать неизвестную кнопку (пусть она будет в переменной) на неизвестном листе (пусть он будет в переменной) из стандартного модуля (расширил вопрос, т.к. интересна сама задача). Т.е. в конечном итоге - из стандартного модуля назначить событие листа (и => последующие действия). Копилка идей давно не обновлялась :)
 
sokol92, Спасибо, работает! Нужно было просто указать местонахождение макроса.
Код
Лист1.CommandButton1_Click
 
Цитата
_Igor_61 написал:
пусть она будет в переменной
Код
Sub Test2()
  Dim shName, macroName
  shName = "Лист1" ' кодовое (!) имя листа
  macroName = "PressButton1"
  Application.Run shName & "." & macroName
End Sub
Владимир
 
sokol92, +++ !!! :) А то я уже чуть было не начал думать, что бывают в Excel неразрешимые задачи :)  
 
sokol92, PressButton1 уже не нужен, можно напрямую обращаться к кнопке CommandButton1_Click.
 
Цитата
Михаил написал:
Лист1.CommandButton1_Click
Если изменится название листа, опять работать не будет
Вам же во втором посту написали
Цитата
vikttur написал:
В модулях листов должны бытть макросы событий. Остальное - в общий модуль. Тогда не будут возникать такие вопросы.
В модуле листа
Код
Private Sub CommandButton1_Click()
  Call PressButton1
End Sub

В общем модуле
Код
Public Sub PressButton1()
  MsgBox "Кнопка 1 нажата"
End Sub
Так правильно будет
 
Цитата
_Igor_61 написал:
бывают в Excel неразрешимые задачи
Бывают.   :D  
Изменено: sokol92 - 03.03.2021 17:23:05
Владимир
 
TSN, Спасибо, я просто не понял этой подсказки. А листы с кнопками рисуются не для того, чтоб их юзеры меняли туда-сюда :)
 
А еще правильнее вообще не использовать элементы кнопок из группы ActiveX. Для кнопок есть и элементы форм и фигуры, и картинки и все в этом духе. А ActveX в какой-то момент может подкинуть радостей, вроде этой: Элементы ActiveX перестали работать или ведут себя непредсказуемо
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Михаил написал:
А листы с кнопками рисуются не для того, чтоб их юзеры меняли туда-сюда
Зря Вы так о юзерах, эти товарищи очень любопытные и зачастую лезут куда попало. Ексель в плане защиты очень слаб.
 
Цитата
sokol92 написал:
Бывают .
Ну, это уже из области философии: что было раньше - курица или яйцо (и данная теорема и "что было раньше" - чистые предположения) :) А Excel - для решения практических офисных задач, это я и имел в виду :) Хотя, если иметь достаточное количество данных, может быть в Excel можно рассчитать и траектории всех спутников Маска и траекторию движения ракеты "Земля-Марс", просто подольше считать будет :)
А насчет обращения к модулю листа из стандартного модуля - очень полезная штука, многим может пригодиться.
 
Цитата
TSN написал:
эти товарищи очень любопытные и зачастую лезут куда попало.
Пароля на книгу и на листы вполне достаточно, чтоб случайно не сломали. А целенаправленно ломать не станут, им же эти кнопки и нажимать :)
 
Цитата
_Igor_61 написал:
А насчет обращения к модулю листа из стандартного модуля - очень полезная штука, многим может пригодиться.
За 10 лет ни разу не пригодилось, а вот наоборот постоянно
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, это потому, что Вы знаете для чего Excel и как с ним обходиться. А когда "ребенок" 5 лет провалял дурака в институте и устроился на работу т.к. мама с папой ему сказали наконец-то: "Давай дальше сам", может и стоит помочь и объяснить причины, почему так можно а так лучше не стоит, глядишь - и начнет думать работать, учиться пользоваться инструментами и пользу приносить :). А насчет
Цитата
Nordheim написал:
За 10 лет ни разу не пригодилось, а вот наоборот постоянно
Всему свое время :) Может MS упростит способы взаимодействия между объектами (классами) :)
 
Цитата
vikttur: модулях листов должны бытть макросы событий. Остальное - в общий модуль. Тогда не будут возникать такие вопросы
Цитата
Nordheim: За 10 лет ни разу не пригодилось, а вот наоборот постоянно
+++
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
_Igor_61 написал:
Может MS упростит способы взаимодействия между объектами (классами)
куда уж дальше упрощать? :) В любом другом языкехотя не так - в  большинстве продвинутых языков Вы вообще не можете обратиться к функции другого модуля, не поколдовав при этом или не указав целевой модуль с этой функцией.
Изначально вызов функций из других модулей и выглядит следующим образом:
Код
ИмяМодуля.ИмяФункции
И только благодаря MS нам позволено опустить имя модуля, если функция с таким именем единственная в проекте. VBE сам пройдет по всем модулям и найдет эту функцию. Если же в двух разных модулях одного проекта есть функция/процедура с одинаковым именем - то при вызове обязательно указывать имя модуля, в котором функция находится. Или переименовывать одну из функций.
Как-то так...
Но это не означает, что вызов функций из листа нельзя использовать. Это такие же модули, но использовать их надо с умом. Например, как и любой модуль класса, модуль листа всегда будет считать своими все объекты в коде, для которых явно не указан родитель. Если это не учесть, то некоторые процедуры при вызове дадут не совсем тот результат, который ожидается.
Изменено: Дмитрий(The_Prist) Щербаков - 04.03.2021 09:52:16
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх