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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2009, 23:40   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Меню для книги

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

Научился создавать меню, ранее были примере, но вот с остальным проблема...
Может быть стоит меню привязать к надстройке? Рабочая книга открывает настройку, а она создает меню.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 15.04.2009, 04:53   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Что-то не совсем понятно. Создайте надстройку и "запихайте" туда все, что нужно. Надстройка не видна (если, конечно, не нужно) и всегда открыта. Все открываемые книги могут использовать все, что есть в надстройке. А что еще нужно-то? Что Вы понимаете (а я не понимаю) под словами
Цитата:
Меню для книги
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 15.04.2009, 05:33   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Начнём с того, что для этого надо перехватывать все события в Excel.

Делается это примерно так:

В модуль книги пишем:
Код:
Private Sub Workbook_Open()
    Set App.AppEv = Application
End Sub
В стандартный модуль пишем:
Код:
Public App As New ClassApp
Создаём модуль класса с именем ClassApp.
Туда вставляем следующий код:
Код:
Public WithEvents AppEv As Application

Private Sub AppEv_NewWorkbook(ByVal wb As Workbook)
    LogWI "AppEv_NewWorkbook", "Создана новая книга excel"
End Sub

Private Sub AppEv_SheetActivate(ByVal sh As Object)
    If UCase(Left(sh.Name, 5)) = "Нужное название листа" Then
        ActiveWindow.Zoom = 100
        ActiveWindow.View = xlNormalView
        LogW "AppEv_SheetActivate", sh.Parent.Name & "  " & sh.Name
    End If
End Sub

Private Sub AppEv_WorkbookNewSheet(ByVal wb As Workbook, ByVal sh As Object)
    LogWI "AppEv_WorkbookNewSheet", "Добавлен лист в книгу  " & wb.Name
End Sub

Private Sub AppEv_WorkbookOpen(ByVal wb As Workbook)
    LogWI "AppEv_WorkbookOpen", "wb.Name = " & wb.Name
    If wb.Name = ThisWorkbook.Name Then Exit Sub

    If КнигаРабочая Then ЧтотоДелаем
End Sub
И так далее... там множество событий.
Обрабатывая некоторые из них, Вы сможете выполнять определённые действия при открытии / закрытии книг.
EducatedFool вне форума Ответить с цитированием
Старый 15.04.2009, 06:15   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Может быть стоит меню привязать к надстройке? Рабочая книга открывает настройку, а она создает меню.
Именно так.
Надстройка (с вышеуказанным кодом) создаёт при запуске панель инструментов, изначально делая её невидимой (свойство .visible = false)

Далее, создаём некую функцию, которая, получая в качестве параметра книгу Excel, определяет, является ли она "рабочей":

Код:
Function КнигаРабочая(ByVal wb As Workbook) As Boolean
    If wb.Worksheets(1).Cells(2, 5) = "Некий текст" Then КнигаРабочая = True
End Function
Нам понадобится ещё одна функция:
Код:
Function ОтсталисьЛиОткрытыеРабочиеКниги() As Boolean
    Dim wb As Workbook
    For Each wb In Workbooks
        If КнигаРабочая(wb) Then ОтсталисьЛиОткрытыеРабочиеКниги = True: Exit Function
    Next
End Function

Далее всё просто.
В модуль класса пишем код:
Код:
Public WithEvents AppEv As Application ' эта строка уже была

Private Sub AppEv_WorkbookActivate(ByVal Wb As Workbook)
    Меню.Visible = КнигаРабочая(Wb)
End Sub

Private Sub AppEv_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    Меню.Visible = ОтсталисьЛиОткрытыеРабочиеКниги
End Sub

Private Sub AppEv_WorkbookDeactivate(ByVal Wb As Workbook)
    Меню.Visible = ОтсталисьЛиОткрытыеРабочиеКниги
End Sub

Private Sub AppEv_WorkbookOpen(ByVal Wb As Workbook)
    Меню.Visible = КнигаРабочая(Wb)
End Sub
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для доступа к пунктам главного меню клавиши ALT + подчеркнутая буква меню в офис 2007? Окоча Юра Microsoft Office Word 1 24.02.2009 12:29
Книги для чайников... Jak_remember Свободное общение 3 09.12.2007 09:48
Ниспадающее меню для ссылки Sedan Kashtanoff PHP 0 09.02.2007 15:00