Страницы: 1
RSS
Как узнать имя стандартного модуля?
 
Мне нужно в .OnAction процедуры модуля ЭтаКнига прописать имя процедуры, размещённой в стандартном модуле и определённой как Private Sub (Private - чтобы не мозолила глаза в "Макросах"  ;)  . Модуль пока называется по умолчанию Module1, но при "причёсывании" кода скорее всего будет переименован. Вот я и хотел .OnAction сделать составным из программно задаваемого (через переменную) имени модуля и имени процедуры.
А узнать имя модуля что-то не получается  :(  

Указать в коде имя модуля листа, где работает процедура, просто:
Код
Sub Module_Name()
Debug.Print Me.Name
End Sub

А как указать имя стандартного модуля?
Изменено: Alex_ST - 22.02.2013 14:28:15 (Сплющился в одну строку код... Долбаные тэги!)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алекс, а зачем это? Какая разница - в каком модуле будет процедура?
Может быть это поможет?
Код
MsgBox Application.VBE.ActiveVBProject.VBComponents(5).Name
 
Как-то так:
Код
MsgBox ActiveWorkbook.VBProject.VBE.ActiveCodePane.CodeModule.Parent.Name

Кодо покажет имя модуля, из которого запущен код.

Однако, если необходимо на OnAction вешать, то проще задать однозначное имя проекта(Tools-VBAProject Properties). Например - AlexStVBP. И тогда на OnAction можно вешать так:
AlexStVBP.ИмяПроцедуры
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Юрий, Дмитрий, спасибо за советы.
В .VBProject забираться не хотелось, но придётся, наверное...
Дмитрий, кто-то кого-то не понял, наверное...
У меня в модуле Private Sub, которую я хочу вызывать по OnAction из модуля ЭтаКнига
Разве ЛОКАЛЬНО видную только а в текущем модуле Private Sub будет видно из другого модуля, когда она будет указываться как процедура проекта?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Цитата
Юрий М пишет:
Какая разница - в каком модуле будет процедура?
В том-то и дело, что Private Sub, размещённая а стандартном модуле, не хочет вызываться в OnAction процедуры, расположенной в модуле ЭтаКнига, если не указать имя модуля перед именем процедуры.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Цитата
Alex_ST пишет:
Разве ЛОКАЛЬНО видную только а в текущем модуле Private Sub будет видно из другого модуля
Имя_модуля.Имя_процедуры

Еще Run() "прикольная" штука. Вызывает даже без имя модуля.
Изменено: nerv - 23.02.2013 01:43:03
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Цитата
Alex_ST пишет:
(Private - чтобы не мозолила глаза в "Макросах")
Alex_ST,
option private module не поможет?
в списке по Alt+F8 не видать, и вызывается без проблем, без указания имени модуля.
только private перед sub не надо писать.

другой вариант - объявить обычную (т.е. по дефолту public) процедуру с  "фальшивым" аргументом.
в списке макросов ее тоже не будет.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
В том-то и дело, что Private Sub, размещённая а стандартном модуле, не хочет вызываться в OnAction процедуры, расположенной в модуле ЭтаКнига, если не указать имя модуля перед именем процедуры.
Алексей, с чего это не хочет вызываться? Должен же!
Назначение Obj.OnAction = "MyMacro" в модуле ЭтаКнига при Private Sub MyMacro() в стандартном модуле работает, что для Shape, что для CommandBarButton в качестве Obj.
Нужно только позаботиться, чтобы имя макроса было уникальным, т.е. чтобы не было макросов с таким же именем в других модулях этой же книги.
Может, уже пора и примерчик, а то видите, как тяжело по праздникам угадывается  ;)
 
гм... может быть, я чего недопонял...
я понял так: есть какие-то процедуры "OnAction" (т.е. обработчики событий), расположенные в модуле книги.
Workbook_Open
Workbook_SheetChange

ну или какие-то другие...

и вот из них есть нужда вызвать процедуру, расположенную в стандартном модуле.
причем не просто процедуру, а объявленную сгоряча как Private
причем объявленную так только лишь для того, чтобы это процедура не светилась в списке макросов.
(без обид, но - это как для борьбы с перхотью записаться в очередь на гильотину)

да, VBA ругается. пишет Sub or Function not defined

мои предложения были исходя из этого.
например, при объявлении Option Private Module - и овцы цели, и волки сыты.

но если вопрос в другом...
ждём-с.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Да скрыть можно и:

1. Заменой: Private Sub
на: Function (без Private)

2. Добавлением неиспользуемого аргумента:
Sub MyMacro(Optional Dummy)

Насчет .OnAction - так в первом сообщении же слева точка стоит.
Без Алексея с бутылкой все равно не разберемся :)
Изменено: ZVI - 23.02.2013 04:36:40
 
Цитата
ZVI пишет:
2. Добавлением неиспользуемого аргумента:
Sub MyMacro(Optional Dummy)
не знаю, как в других версиях, но в Excel 2003 этот способ не работает.
вообще, при объявлениях
Код
Sub t1()
End Sub

Sub t2(x)
End Sub

Sub t3(Optional x)
End Sub

Sub t4(ParamArray x())
End Sub


в списке макросов доступны: t1, t3, t4
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Да, точно, правильнее так:
Sub t3(Optional x = 0)
End Sub

или так
Sub t3(Optional x As Long)
End Sub
 
Ребята, спасибо за помощь.
У меня дома ремонт, поэтому до компа добрался только сейчас и то не надолго (уже вон на меня ворчат, что немного прибрать инструменты было бы не плохо, а не в интернете копаться без дела).
Так что проверить ваши рекомендации смогу только в понедельник на работе.
Я на досуге пытаюсь часть своих нужных макросов с кнопочками сделать создаваемыми программно внутри стандартных менюшек Excel'я и оформить в виде надстроек, а то Personal.xls уж больно большой стал. Да и на 2010-й переползать так удобнее.
Поэтому все "труды плодов" на рабочем компе.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Наверх