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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2009, 08:26   #1
Elfix
Пользователь
 
Регистрация: 28.02.2007
Сообщений: 18
По умолчанию Создание меню

Доброго времени суток!

Написал макрос. Оформил его меню таким образом:

Sub addMenu()

' Если меню с именем MyBar есть, удаляю его
For Each MyBar In CommandBars
If MyBar.Name = "MyBar" Then
MyBar.Delete
Exit For
End If
Next MyBar

With CommandBars.Add(Name:="MyBar", MenuBar:=False, Temporary:=False)
With .Controls.Add(Type:=msoControlButto n)
.Style = msoButtonCaption
.Caption = "Нажми на меня"
.OnAction = "myAction"
.Visible = True
End With
.Visible = True
End With


End Sub

Sub myAction()
MsgBox "Hellow orld"
End Sub

Все работает как надо. Но есть один неприятный момент: при нажатии на кнопку меню из других книг открывается исходный файл, в котором выполняется макрос myAction.

Можно ли каким-нибудь образом противодейстовать этому? Например, недопустить открытия файла или скрывать его (при нажатии на пункт меню) и закрытию по окончании выполнения скрипта myAction? Все мои попытки скрытия открывающейся книги не увенчались успехом.

Excel 2003 / 2007
Elfix вне форума Ответить с цитированием
Старый 19.10.2009, 08:45   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

А Вам нужен доступ к этому макросу из других книг?
Если нужен, то можно либо создать надстройку, либо поместить файл с макросом в персональную книгу макросов. А если не нужен, то лучше, при открытии файла создавать свое меню, а при закрытии удалять его.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 19.10.2009, 09:28   #3
Elfix
Пользователь
 
Регистрация: 28.02.2007
Сообщений: 18
По умолчанию

Именно. Нужно чтобы элемент меню был доступен из всех книг. Вариант "при закрытии удалять" не подходит.

В персональную книгу макросов записывать нельзя - доступ к папке только для чтения и сунуть туда ничего не удастся.

У меня есть файл, который выполняет такой же функционал как и мой скрипт, там все работает. Однако исходный текст подсмотреть не могу - требует пароль на открытие.

А как программно создать надстройку? Вы не могли бы скинуть пример?
Elfix вне форума Ответить с цитированием
Старый 19.10.2009, 09:45   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Однако исходный текст подсмотреть не могу - требует пароль на открытие.
Пароли легко снимаются. Почитайте про Advanced Office Password Recovery

Цитата:
А как программно создать надстройку?
Очень просто.
Например, Файл - Сохранить как... - Надстройка Microsoft Excel (.xla)

Можно оставить и расширение xls - достаточно в свойствах книги (выделяем в редакторе VBA пункт ЭтаКнига, нажимаем F4) изменить значение свойства IsAddin на TRUE
После этого листы книги будут скрыты.
EducatedFool вне форума Ответить с цитированием
Старый 19.10.2009, 09:54   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Сохраните Ваш файл с макросом (макросами) в виде надстройки (с расширением ".xla"). Затем, либо подключите ее вручную, через "Сервис" -> "Надстройки..." (для Excel 2003), либо программно, например, так:
Код:
AddIns.Add Filename:="C:\Program Files\Моя_надстройка.xla"
AddIns("Моя_надстройка").Installed = True
, где "C:\Program Files\Моя_надстройка.xla" - это путь к файлу и имя Вашей надстройки.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 19.10.2009, 11:45   #6
Elfix
Пользователь
 
Регистрация: 28.02.2007
Сообщений: 18
По умолчанию

Спасибо за исчерпывающие ответы!
Elfix вне форума Ответить с цитированием
Старый 19.10.2009, 15:23   #7
Elfix
Пользователь
 
Регистрация: 28.02.2007
Сообщений: 18
По умолчанию

Подскажите пожалуйста как можно подключить меню к надстройке?
Где можно почитать толковые статьи по этому поводу? Может быть я не правильно формулирую вопрос, но гугл дает не совсем ожидаемые результаты.
Elfix вне форума Ответить с цитированием
Старый 19.10.2009, 15:52   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Подскажите пожалуйста как можно подключить меню к надстройке?
Вот здесь есть пример создания панели инструментов при запуске надстройки.

Вот весь код:
[code]
Код:
Function Add_Control_Ex(ByRef menu, 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
    ' добавляет контролы в меню menu ' type=1 - это кнопка, type=4 - это комбобокс, 10 - popup
    On Error Resume Next
    Set Add_Control_Ex = menu.Controls.Add(B_Type, , , 1)
    With Add_Control_Ex
        If B_Face > 0 Then .FaceId = B_Face:
        .Tag = Tag: .OnAction = On_Action: .Caption = B_Caption: If Begin_Group Then .BeginGroup = True
    End With
End Function

Sub ФормированиеПанелиИнструментов()
    On Error Resume Next: Application.ScreenUpdating = False
    Application.CommandBars.Add(Name:="Размеры").Visible = True
    For i = 1 To 1000: DoEvents: Next

    Set ShapesCB = Application.CommandBars("Размеры")
    For Each co In ShapesCB.Controls: co.Delete: Next
    ShapesCB.Visible = True: ShapesCB.Controls(1).BeginGroup = True

    If ShapesCB.Controls.Count = 0 Then Add_Control_Ex ShapesCB, 1, 1809, "RefreshMenu", _
       "Обновить панель инструментов ""Размеры""", True
    Add_Control_Ex ShapesCB, 1, 23, "OpenCommPred", "Открыть комм. предложение", True

    Add_Control_Ex ShapesCB, 4, -1, "SizeVertical2", "Слева по вертикали     ", True
    Add_Control_Ex ShapesCB, 4, -1, "SizeVertical", "Справа по вертикали   ", True

    Add_Control_Ex ShapesCB, 1, 165, "UnGroup", "Разгруппировать", True

    Add_Control_Ex ShapesCB, 1, 1087, "SetIsAddinFalse2", "Отобразить листы файла программы", False
    Add_Control_Ex ShapesCB, 1, 1088, "SetIsAddinTrue2", "Скрыть листы файла программы", True

    Set fig = Add_Control_Ex(ShapesCB, 10, 224, "", "Добавить объект", True)

    Dim sh As Worksheet: Set sh = ThisWorkbook.Worksheets("Объекты")
    For Each s In sh.Shapes
        Add_Control_Ex fig, 1, 161, "ДобавитьФигуру", s.Name, False, s.Name
    Next

    Add_Control_Ex ShapesCB, 1, 1838, "КрасимАвтофигуру", "Красим автофигуру", True
    Add_Control_Ex ShapesCB, 1, 232, "CloseAddin", "Закрыть программу", True
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 20.10.2009, 18:26   #9
Elfix
Пользователь
 
Регистрация: 28.02.2007
Сообщений: 18
По умолчанию

Спасибо большое за помощь!
Elfix вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание меню для сайтов iukash Софт 1 30.06.2009 02:57
Создание пользовательских меню Наталья Ивановна Microsoft Office Excel 2 26.05.2009 19:27
Создание меню StudentPolitech Общие вопросы C/C++ 8 12.12.2008 10:33
Создание своего меню в Exele W50586 Microsoft Office Excel 2 23.06.2008 15:20
Создание меню на С KsandR Общие вопросы C/C++ 5 13.12.2007 21:34