Popup на форме
Модератор: Naeel Maqsudov
Подскажите как можно создать свой попап для формы. Есть ли такой в VBA или прийдется создавать класс?
- EducatedFool
- Сообщения: 197
- Зарегистрирован: 06 апр 2008, 14:03
- Откуда: Россия, Урал
- Контактная информация:
Класс создавать не надо. Microsoft его уже создал 
Вот один из вариантов: (проверено в Excel 2003)
В код формы пишем следующее:
Создаём модуль, и вставляем в него такой код:
Потом запускаем форму, и щелкаем на ней правой кнопкой мыши.

Вот один из вариантов: (проверено в Excel 2003)
В код формы пишем следующее:
Код: Выделить всё
Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 2 Then СозданиеМеню_ЗаполнениеЭтогоМенюЭлементами_и_ЕгоОтображение
End Sub
Код: Выделить всё
Sub [B]СозданиеМеню_ЗаполнениеЭтогоМенюЭлементами_и_ЕгоОтображение[/B]()
On Error Resume Next: Application.CommandBars.Add "Моё контекстное меню", msoBarPopup
Dim p As CommandBar: Set p = Application.CommandBars("Моё контекстное меню")
'p.Reset - почему-то не работает ' очистка меню от прежних пунктов (если каждый раз добавляем разные пункты)
For Each ctrl In p.Controls: ctrl.Delete: Next ' а вот так пункты меню удаляются
AddItemIntoPopup p, 1, 161, "Make_Netflow_Report", "Обработка результатов запроса"
AddItemIntoPopup p, 4, -1, "SearchNumber", "Поиск номеров"
Set NewMenu = p.Controls.Add(Type:=msoControlPopup) ' подменю Additional Tools
With NewMenu: .Caption = "&Additional Tools": .BeginGroup = True: End With
AddItemIntoPopup NewMenu, 1, IIf(DemoMode, 232, 231), "ToggleDemoMode", IIf(DemoMode, "В&ыключить безопасный режим", "&Включить безопасный режим"), True, "Demo3"
AddItemIntoPopup NewMenu, 1, 3, "Save_AddIn_Copy_in_Settings", "Сохранить копию программы в папке Settings", True
AddItemIntoPopup NewMenu, 1, 749, "Save_AddIn_Copy", "Сохранить копию программы с указанием даты и времени"
AddItemIntoPopup NewMenu, 1, 2936, "PrepareAddInForUpdate", "Создать файл обновления", False
AddItemIntoPopup NewMenu, 1, 964, "Write_MainSettingsFile", "Перезаписать файл Main.ini", True
AddItemIntoPopup NewMenu, 1, 161, "MakeSummaryPage", "Создание сводной таблицы", False
AddItemIntoPopup NewMenu, 1, 3, "WriteDefaultRegistryValuesOnFirstRun", "Применить настройки по умолчанию", True
AddItemIntoPopup p, 1, 1088, "SetIsAddinTrue", "Скрыть листы файла программы", True
AddItemIntoPopup p, 1, 1087, "SetIsAddinFalse", "Отобразить листы файла программы", False
AddItemIntoPopup p, 1, 1809, "Install_Update_Local", "Install_Update_Local", True
p.ShowPopup
End Sub
[B]Function AddItemIntoPopup[/B](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
Спасибо. А как можно этот пример переделать в главное меню для формы?
- EducatedFool
- Сообщения: 197
- Зарегистрирован: 06 апр 2008, 14:03
- Откуда: Россия, Урал
- Контактная информация:
Цитата с сайта www.visual.2000.ru:
Проще найти другой вариант решения задачи.
Сделать меню на форме VBA теоретически возможно, но достаточно сложно.Напомним, что формы UserForms в VBA — это не то же самое, что VB-формы (Ruby Forms).
VBA UserForms являются экземплярами ActiveX-конструктора Microsoft Forms 2.0 (FM20.dll), который входит в состав как VB, так и VBA.
Более того, все элементы управления, представленные в нем по умолчанию, являются не встроенными, а ActiveX-компонентами (то есть при желании их можно подключить и к VB-форме). Чтобы убедиться в этом, откройте окно Tools|Additional Controls.
К сожалению, эти два вида форм различаются не только форматом их модулей. Каждая из них использует свой собственный набор встроенных элементов управления. Проблема же заключается в том, что эти наборы не только не совпадают функционально, но даже для одинаковых по значению элементов управления используются разные наименования свойств, событий и методов. MS Forms 2.0 не поддерживают ряд очень полезных встроенных элементов управления VB (Timer, FileListBox, PictureBox, DriveListBox, DirListBox, Menu, Shape и Line), но при этом включают другие полезные компоненты (TabStrip, MultiPage) и команды проектирования формы (TabOrder).
Проще найти другой вариант решения задачи.
Столкнулся с такой проблемой: не знаю как добавить контрол к подменю, зная лишь caption и tag. Findcontrol ищет только в заданном меню, а не в его подменю. Тогда что делать? Перебирать все меню вообще или находить все подменю. Может есть более правильные способы?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
придется рекурсивно обойти все меню
Кстати, FindControl должен сам уметь это делать
Syntax
expression.FindControl(Type, Id, Tag, Visible, Recursive)
Кстати, FindControl должен сам уметь это делать
Syntax
expression.FindControl(Type, Id, Tag, Visible, Recursive)
Добрыйдень
Будьте добры подскажите пожалуйста каким образом можно прикрепить событие к выпадающему списку, созданному по принципу приведённому выше.
Данное меню появляется на при правом клике на текст бокс, находящийся на форме Excel.
Меню содержит три вида действия: Вырезать, копировать и вставить.
Kод создания меню находится в классе TextBox
Собственно необходимо, что бы происходила реакция при левом клике на определённом действии.
Спасибо
Будьте добры подскажите пожалуйста каким образом можно прикрепить событие к выпадающему списку, созданному по принципу приведённому выше.
Данное меню появляется на при правом клике на текст бокс, находящийся на форме Excel.
Меню содержит три вида действия: Вырезать, копировать и вставить.
Kод создания меню находится в классе TextBox
Собственно необходимо, что бы происходила реакция при левом клике на определённом действии.
Спасибо
Всем спасибо. Разобрался.