Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2010, 18:21   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Вызов макросов из меню с параметрами

Есть созданная панель инструментов, в ней меню запускающее макросы. Указываем имя макроса - работает. Все просто. Но не могу вызывать макросы из меню с параметрами. Excel выдает сообщение, что макрос не найден. Он воспринимает имя макроса и параметры для вызова как одно имя большое имя, да же не смотря на пробелы, запятые или скобки. Параметр caption, при создании меню имеет тип string.Может мой косяк... Для создания меню используется макрос:
Код:
Function AddItemIntoMenu(ByRef Comm_Bar, ByVal B_Type As Integer, ByVal B_Face As Integer, _
                          ByVal On_Action As String, ByVal B_Caption As String, _
                          Optional ByVal Begin_Group As Boolean = False, Optional Tag As String = "") As CommandBarControl
' добавляет контролы в меню Comm_Bar ' type=1 - это кнопка, type=4 - это комбобокс, 10 - popup
    On Error Resume Next
    Set Add_Control = Comm_Bar.Controls.Add(Type:=B_Type)
    With Add_Control
        If B_Face > 0 Then .FaceId = B_Face:
        .Tag = Tag: .OnAction = On_Action: .Caption = B_Caption: If Begin_Group Then .BeginGroup = True
        'If надо_сделать_пункт_недоступным Then .Enabled = False
    End With
End Function
Можно ли из пользовательских меню вызывать макросы с параметрами?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 21.09.2010, 18:58   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

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

Пример (только не для меню, а для нескольких кнопок, которым назначен один и тот же макрос) можно найти в соседней теме:
http://programmersforum.ru/showpost....55&postcount=8

Вам же надо использовать свойство CommandBars.ActionControl, чтобы узнать, которая из кнопок запустила макрос.
Пример: http://programmersforum.ru/showpost....24&postcount=4
Еще по теме: http://forum.developing.ru/showthrea...ll=1#post25042

Способ распознавания параметра макроса по ActionControl используется в этой надстройке:
http://excelvba.ru/dimensions
Код:

Sub SizeVertical()
    On Local Error Resume Next:
    Set ac = Application.CommandBars.ActionControl: If ac Is Nothing Then Exit Sub
    ДобавитьРазмерПоВертикали Shape, ac.Text & " мм"
End Sub

Последний раз редактировалось EducatedFool; 21.09.2010 в 19:05.
EducatedFool вне форума Ответить с цитированием
Старый 22.09.2010, 18:14   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Да, можно. Но немного не так, как вы делаете...
При вызове макроса параметр не указывается - вызываемый макрос должен сам определить значение параметра, отталкиваясь от названия кнопки, его вызвавшей.
Пока так и делаю. Но сложность в том что я могу узнать только имя меню вызвавшего макрос, а мне этого не достаточно.
Меню организовано так:
Код:
Договор/.../Договор №1/Договор №2/Договор №nn
Доп.Соглашения/.../Договор №1/Доп.Соглашения от дд.мм.гггг/Доп.Соглашения от дд.мм.гггг/...
                               /Договор №2/Доп.Соглашения от дд.мм.гггг/Доп.Соглашения от дд.мм.гггг/...
                               /Договор №nn/Доп.Соглашения от дд.мм.гггг/Доп.Соглашения от дд.мм.гггг/...
Меню "договор" служит для управления договорами и переключения между ними. Договора определяются по номеру, и меню имеет линейную структуру. Тогда как меню "доп.соглашения" служит для управления доп.соглашениями. У каждого договора может быть несколько доп.соглашений, и все бы ни чего только вот доп.соглашения к разным договорам могут быть от одного числа. И доп.соглашения определяются по номеру договора и дате заключения. Что уже отображать в линейном меню не удобно. То есть макрос который вызывается в меню доп.соглашения должен уметь не только определить имя меню которое его вызвали, но имя меню на уровень выше. А вот как это сделать я не знаю... Из ходя из этого я подумал что было бы хорошо уйти от порочной практики анализа названия вызвавшего меню, и при создании меню указывать дополнительные параметры. Которые уже позволили бы макросу выполнить свою работу.
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Пример (только не для меню, а для нескольких кнопок, которым назначен один и тот же макрос) можно найти в соседней теме:
http://programmersforum.ru/showpost....55&postcount=8
Внимательно изучил пример. В нем опять же уже макрос определяет откуда он был вызван, а ни каких параметров в него не передается.
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вам же надо использовать свойство CommandBars.ActionControl, чтобы узнать, которая из кнопок запустила макрос.
Собственно я делаю так же.
Код:
Дата = Application.CommandBars.ActionControl.Caption
Дата = word(Дата, words(Дата))  'Берем последнее слово в названии меню. "01.08.2010"
А потом беру последнее слово и анализирую его.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 22.09.2010, 18:41   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
было бы хорошо уйти от порочной практики анализа названия вызвавшего меню
А зачем анализировать "название"?
Если вы внимательно посмотрите эту функцию, то обнаружите наличие у кнопок панелей инструментов свойства Tag, в которое можно записать любую текстовую строку.

Далее - всё просто:
ПолныйПутьКФайлуДоговора = Application.CommandBars.ActionContr ol.Tag
EducatedFool вне форума Ответить с цитированием
Старый 22.09.2010, 22:59   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
А зачем анализировать "название"?
Если вы внимательно посмотрите эту функцию, то обнаружите наличие у кнопок панелей инструментов свойства Tag, в которое можно записать любую текстовую строку.
Далее - всё просто:
ПолныйПутьКФайлуДоговора = Application.CommandBars.ActionContr ol.Tag
Спасибо!!! Вы снова оказались правы. :))) Теперь все встало на свои места.
С уважением, Алексей.

Последний раз редактировалось tae1980; 23.09.2010 в 11:36.
tae1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов макросов из другой книги. tae1980 Microsoft Office Excel 2 08.07.2010 22:45
Вызов программы с параметрами bgmd.win Общие вопросы Delphi 2 05.01.2010 14:40
Создать свое меню для макросов nikolai_P Microsoft Office Excel 13 23.04.2009 09:35
Автоматический запуск макросов с листа на котором указан перечень макросов с параметрами и без Neoli Microsoft Office Excel 2 09.03.2009 14:31
Меню с Items в виде набора Bitmap (как меню редактирования в Word'е) chandrasecar Мультимедиа в Delphi 7 14.01.2009 09:20