Popup на форме

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

Подскажите как можно создать свой попап для формы. Есть ли такой в VBA или прийдется создавать класс?
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Класс создавать не надо. Microsoft его уже создал :)

Вот один из вариантов: (проверено в 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
Потом запускаем форму, и щелкаем на ней правой кнопкой мыши.
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

Спасибо. А как можно этот пример переделать в главное меню для формы?
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Цитата с сайта www.visual.2000.ru:
Напомним, что формы 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).
Сделать меню на форме VBA теоретически возможно, но достаточно сложно.
Проще найти другой вариант решения задачи.
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

Столкнулся с такой проблемой: не знаю как добавить контрол к подменю, зная лишь caption и tag. Findcontrol ищет только в заданном меню, а не в его подменю. Тогда что делать? Перебирать все меню вообще или находить все подменю. Может есть более правильные способы?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

придется рекурсивно обойти все меню

Кстати, FindControl должен сам уметь это делать

Syntax
expression.FindControl(Type, Id, Tag, Visible, Recursive)
Chinock
Сообщения: 2
Зарегистрирован: 09 окт 2014, 19:11

Добрыйдень

Будьте добры подскажите пожалуйста каким образом можно прикрепить событие к выпадающему списку, созданному по принципу приведённому выше.
Данное меню появляется на при правом клике на текст бокс, находящийся на форме Excel.
Меню содержит три вида действия: Вырезать, копировать и вставить.
Kод создания меню находится в классе TextBox

Собственно необходимо, что бы происходила реакция при левом клике на определённом действии.

Спасибо
Chinock
Сообщения: 2
Зарегистрирован: 09 окт 2014, 19:11

Всем спасибо. Разобрался.
Ответить