powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Application Activate Events? Событие - активация окна Excel, как сделать?
11 сообщений из 11, страница 1 из 1
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34224324
tolikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сделать макрос на событие: активация окна Excel?

Workbook_Activate и Worksheet_Activate() работают только тогда, когда их активация происходит в переходом на книгу или лист соответственно из другой книги или листа, но ИЗ САМОГО ПРИЛОЖЕНИЯ Excel. А нужно как-то отследить момент активации самого приложения.
Application.Windows("Book1").OnWindow тоже не срабатывает.

Можно, наверное, как-то использовать идею проверки активности окна через определённый промежуток времени (макрос в OnTime) или WinAPI (в чём совершенно не разбираюсь). Но надо, чтоб событие активация Excel срабатывало только 1 раз.

Кто-нибудь делал такое? Подскажете хоть посредством WinAPI, но подробный код.

MS Office 97.
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34230691
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
toliktWorkbook_Activate и Worksheet_Activate() работают только тогда, когда их активация происходит в переходом на книгу или лист соответственно из другой книги или листа, но ИЗ САМОГО ПРИЛОЖЕНИЯ Excel.

MS Office 97.
Обнови Офис хотя бы до 2000. Там все нормально отрабатывается в Workbook_Activate/Deactivate
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34231515
tolikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я имел ввиду немного другое.
Поясню пошагово. Применительно к Workbook_Activate.

Запускаем Excel, книгу "Book1"

В модуле книги "Book1" выбираем, например, событие Workbook_Activate. Пишем в нём какой-нибудь код. Например,

Private Sub Workbook_Activate()
MsgBox "Привет!"
End Sub

Создаём ещё одну книгу "Book2".

Теперь, если была активна книга "Book2", то при активации книги "Book1" выскакивает сообщение "Привет!". Это - понятно.

Далее, пусть активна книга "Book1". Запускаем MS Word. Окно Word становится активным, окно Excel, соответственно, неактивным. Теперь, если активировать снова окно Excel, то ожидаемого "Привет!" не выскакивает, т. к. в самом приложении Excel книга "Book1" и так как бы уже была активна.

Вопрос как раз и был в том, чтоб как-то отслеживать событие - АКТИВАЦИЯ САМОГО ОКНА EXCEL .

PS. Само собой, прежде чем задавать вопрос, эта проблема была проверена на более поздних версиях операционной системы (Microsoft ® Windows XP Professional SP2) и офиса (Microsoft ® Excel 2003 (11.6355.6360) SP1). Ситуёвина та же самая.

ЗЫ. Завершаю пояснение, ибо, судя по всему, вопрос или его пояснение, состоящее более чем из 3-х строк, многие люди внимательно не читают. :-)
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34231644
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри на событие
Код: plaintext
1.
2.
Private Sub Workbook_WindowActivate(ByVal Wn As Window)

End Sub
Вот только не помню, есть оно в 97-ом или еще нету. В 2К уже точно есть.
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34231686
tolikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Excel 97 есть Workbook_WindowActivate.
Однако то же самое - эффекта нет.

Может быть, в коде событий просто нужно пограмотнее описать сам алгоритм?

Например, для Workbook_WindowActivate я делал так:
Код: plaintext
1.
2.
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
MsgBox "Привет!"
End Sub
А может быть нужно как-то использовать Wn As Excel.Window?

Например, предварительно описать в модуле класса, в чём я плохо разбираюсь, или ещё что-нибудь?

Я пытался делать и через модуль класса, но тоже ничего не получилось.
Типа так. В проекте PERSONAL.XLS:
В модуле класса Class1:
Код: plaintext
1.
2.
3.
Public WithEvents AppEv As Application
Private Sub AppEv_WorkbookActivate(ByVal Wb As Excel.Workbook)
MsgBox "Привет!"
End Sub
В модуле книги ThisWorkbook:
Код: plaintext
1.
2.
Private Sub Workbook_Open()
Set App.AppEv = Application
End Sub
В модуле Module1:
Код: plaintext
Public App As New Class1

Но опять всё работает только во время нахождения в самом Excel.


Попробовать как-то совместить несколько событий? Но как и какие?
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34231732
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм... а действительно...
Похоже что собственными средствами Экселя эту задачу не решить. Application не имеет событий дергающихся когда сам Эксель получает фокус при переключении в него из другой задачи.

В принципе это ограничение можно обойти при помощи внешнего объекта. Который будет отслеживать свою видимость на экране или вешать хук на родительское окно (в данном случае на окно Экселя) и перехватывать WM_ACTIVE. Такой объект надо будет класть на все листы книги, а то мало ли с какого листа пользователь ушел в другую задачу. Этот объект можно замаскировать например под анимированое лого или всплывающую подсказку....

А вообще, если задача не решается стандартными средствами инструмента надо либо пересмотреть задачу, либо взять другой инструмент.

toliktЯ пытался делать и через модуль класса, но тоже ничего не получилось.Не получилось вообще ничего или не получилось сделать желаемое? Вот в принципе простенькая книга с двумя единственными событиями Workbook_WindowActivate и App_WindowActivate. Открой ее и еще какую-нибудь книгу потом попереключайся, заодно увидишь в чем разница между этими событиями.
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34232195
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант, наверное, не самый лучший, т.к. не событие перехватывается, а запускается ontime постоянно, но с задачей справится:

этот код поместить в ThisWorkbook
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Sub Workbook_Open()
    
    OnTimeHandler
    
    Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"

End Sub
этот код поместить в любой, желательно не листа, модуль
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Private Declare Function GetForegroundWindow Lib "user32" () As Long

Public Sub OnTimeHandler()
Dim hWndActive As Long

Static ThisWindowHandle As Long
Static ThisWindowIsActive As Boolean
    
    hWndActive = GetForegroundWindow()
    
    If ThisWindowIsActive = False And ThisWindowHandle = hWndActive Then
        MsgBox "Стало окно активным", , "Сообщение покажется один раз!"
    Else
        Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"
    End If
    
    
    If ThisWindowHandle =  0  Or ThisWindowHandle = hWndActive Then
        ThisWindowIsActive = True
        ThisWindowHandle = GetForegroundWindow()
    Else
        ThisWindowIsActive = False
    End If
    
End Sub
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34262688
tolikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо vbapro, вариант работает. Учитывая, что он пока единственный, так вообще - самый лучший.

А периодическое мерцание, конечно, есть, но не сильно мешает. Тормозов особых тоже не заметно. Замечания мелкие есть.

Наверное, в коде Workbook
Код: plaintext
1.
2.
3.
Private Sub Workbook_Open()
    OnTimeHandler
    Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"
End Sub
первая процедура OnTimeHandler лишняя, т.к. она запускается потом ещё раз и окно с "Окно стало активным" появляется 2 раза.

Для непосредственной работы основной код переделал не для одноразового, а постоянного отслеживания активации окна Excel.
Вместо
Код: plaintext
1.
2.
3.
4.
    If ThisWindowIsActive = False And ThisWindowHandle = hWndActive Then
        MsgBox "Стало окно активным", , "Сообщение покажется один раз!"
    Else
        Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"
    End If
использую что-то типа
Код: plaintext
1.
2.
3.
    If ThisWindowIsActive = False And ThisWindowHandle = hWndActive Then
        MsgBox "Стало окно активным"
    End If
        Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"

Не мог разобраться со следующим глюком.
Если зайти в этот код и просто выделить какую-либо строку кода, напр. MsgBox "Стало окно активным", то потом текущую рабочую книгу невозможно закрыть, она появляется и появляется. Приходится закрывать полностью приложение.
Или это только у меня так?
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34262751
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
toliktСпасибо vbapro, вариант работает. пожалуйста
toliktНаверное, в коде Workbook
Код: plaintext
1.
2.
3.
Private Sub Workbook_Open()
    OnTimeHandler
    Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"
End Sub
первая процедура OnTimeHandler лишняя, т.к. она запускается потом ещё раз и окно с "Окно стало активным" появляется 2 раза.
нет, не лишняя, т.к. она инициализирует статические переменные но не запускает ontime. но второй и последующие запуски уже будут рабочими.
tolikt
использую что-то типа
Код: plaintext
1.
2.
3.
    If ThisWindowIsActive = False And ThisWindowHandle = hWndActive Then
        MsgBox "Стало окно активным"
    End If
        Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"
Не мог разобраться со следующим глюком.
Если зайти в этот код и просто выделить какую-либо строку кода, напр. MsgBox "Стало окно активным", то потом текущую рабочую книгу невозможно закрыть, она появляется и появляется. Приходится закрывать полностью приложение.
Или это только у меня так?
попробуй так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    If ThisWindowIsActive = False And ThisWindowHandle = hWndActive Then
        If MsgBox("Стало окно активным, продолжить слежение?", vbYesNo) = vbYes Then
            Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"
        End If
    Else
        Application.OnTime Now + TimeValue("00:00:01"), "OnTimeHandler"
    End If
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34962842
tolikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vbaproIf MsgBox("Стало окно активным, продолжить слежение?", vbYesNo) = vbYes Then Как вариант, конечно, подходит. Но каждый раз при активации окна отвечать на вопрос очень неудобно. Как-нибудь бы сделать, чтобы зависило только от того, открыта соответствующая книга или нет.
Как алгоритм варианта, можно рассмотреть такой. При открытии книги инициализировать какую-то глобальную переменную. А в макросе, запущенном по OnTime проверять эту глобальную переменную. И если она, например, равна False, то макрос больше не запускать. Чувствую, что это как-то делается через модули классов, но самому реализовать не получилось.
Ещё один вариант: при закрытии книги остановить сам процесс, запущенный по OnTime. Но как это сделать, не знаю. Этот вопрос рассматривался в другой теме: Останов Application.OnTime. Как остановить выполнение?
...
Рейтинг: 0 / 0
Application Activate Events? Событие - активация окна Excel, как сделать?
    #34962874
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
идеи верные, на первый взгляд, но не в глобальной переменной хранить, а в реестре или в свойствах файла, т.к. переменная может потерять значение когда макрос не быдет выполняться.

Для того чтоб книга не открывалась, то обработчик таймера поместить в Personal и в нем логику проверок вызова сделать.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Application Activate Events? Событие - активация окна Excel, как сделать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]