Хитрости »
Основные понятия (21)Здесь собраны статьи, в которых разъясняются базовые понятия работы в Excel и VBA, а так же проблемы, с которыми сталкивается большинство начинающих
Сводные таблицы и анализ данных (5) Раздел поможет изучить сводные таблицы и научиться их использовать "на полную"
Графики и диаграммы (4) Раздел поможет научиться создавать диаграммы и графики в Excel, в том числе нестандартные
Работа с VB проектом (10) С помощью статей раздела вы научитесь создавать процедуры программно и выполнять различные операции с объектами самого VBA
Условное форматирование (5) Этот раздел поможет поближе познакомиться с Условным форматированием на примерах различных ситуаций
Списки и диапазоны (5) Статьи, посвященные работе не только с выпадающими списками, но и с диапазонами и хитростями их применения в рабочих файлах
Макросы(VBA процедуры) (57) Статьи раздела направлены на изучение VBA с детальным разбором кодов. Множество статей с примерами кодов под всевозможные ситуации с комментариями и пояснениями
Разное (34) Собраны статьи, которые не подходят ни под одну из представленных выше категорий или входят сразу в несколько. Но эти статье не менее полезные!

Как отследить событие(например выделение ячеек) в любой книге?

 

Иногда при разработке надстройки просто необходимо отследить какое-либо событие в книге. Но модуль ЭтаКнига и модули листов надстройки позволяют отследить лишь те события, которые происходят в той книге, в которой этот код прописан. А как же другие книги? Как, например, отследить событие открытия книги в Excel? Или выделение ячейки в любой книге? Изменение значений ячеек?

Если не знаете что такое надстройка - Как создать свою надстройку?

На самом деле все до смешного просто:
В модуле ЭтаКнига главной книги(надстройка либо PERSONAL.XLS) необходимо создать переменную, которая будет ссылкой на все приложение Excel

На событие открытия главной книги(той, в которой пишется код и в которой объявили переменную App) присваиваем ей значение запущенного приложения Excel:

Это позволит нам получить доступ к событиям приложения и отследить их.
Создаем событие - аналогично выбору других событий в книге - в левом окне выбора объектов выбираем App. В правом появятся все доступные события для нашего объекта App:

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

Теперь при открытии любой книги будет появляться сообщение с именем именно открытой книги.

Сам по себе код не заработает. Т.к. назначение значения переменной App происходит только при открытии самой книги(надстройки или PERSONAL), то после создания кодов надо будет сохранить эту книгу и открыть заново

С помощью кода ниже можно отследить создание новой книги:

Отслеживаем выделение ячеек во всех открытых книгах:

Естественно, вместо показа MsgBox-ов можно назначить выполнение других(нужных) действий. Например, вызов макроса(Call ИмяМакроса). Макрос в таком случае должен быть размещен в стандартном модуле и иметь статус Public(или вовсе без статуса). Сам модуль должен тоже находится в той же книге.

Скачать пример »

  Tips_Macro_How_Catch_Events.xls (29,5 KiB, 2 601 скачиваний)

Также см.:
Что такое переменная и как правильно её объявить?


Статья помогла? Сделай твит, поделись ссылкой с друзьями!

Поиск по меткам

Access Multex Outlook VBA работа в редакторе VBA управление кодами Бесплатные надстройки Дата и время Диаграммы и графики Записки Защита данных Интернет Картинки и объекты Листы и книги Макросы и VBA Настройка Поиск данных Почта Программы Работа с приложениями Работа с файлами Разработка приложений Сводные таблицы Списки Тренинги и вебинары Финансовые Форматирование Формулы и функции Функции Excel Функции VBA Ячейки и диапазоны вебинар ссылки статьи тренинг
Обсуждение: оставлено 10 коммент.
  1. Дмитрий:

    Супер. очень доходчиво, понятно. То что искал. Ставлю +1 в гугл плюс

  2. Михаил:

    Всё это хорошо, но при необходимости повторного выбора этой же ячейки событие не происходит и, естественно, программа выполнятся не будет (проверено). Что можете посоветовать в этом случае. я не проверяю другие книги, но в открытой нужно выбрать конкретную ячейку и обработать содержимое, в результате чего содержимое может изменится. Я использую следующую конструкцию:

    И для того чтобы снова выбрать ту же ячейку приходится заводить незначащие ячейки, чтобы выбрав их иметь возможность вернутся к предыдущему выбору.
    Очень уж мудрёно получилось, но надеюсь понятно.

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

  4. Imort:

    Ну, и как же сделать РАБОЧЕЕ событие для отслеживания события при свёртывании приложения Excel?

  5. Imort, для начала задать вопрос не "ну, и как же" - здесь Вам никто ничего не должен. После чего прочитать внимательно статью и сделать как написано. И просмотреть все доступные события. Может тогда найдете событие WindowResize. И найдете у передаваемого объекта Wn свойство WindowState.

  6. Staniiislav:

    Спасибо, отличный макрос

  7. Игорь:

    Ни auto_open на листе, ни Workbook_Open на книге не срабатывают. Как еще можно запустить макрос автоматически?

  8. Игорь, давайте поменьше категоризма и побольше конкретики. Кто сказал, что auto_open должен быть на листе? Эта процедура размещается в стандартном модуле, т.к. она использовалась в те лихие времена, когда событийные процедуры листов и книг не встраивались в листы и книги.
    Не работает только у Вас. Значит и дело в Вас или Вашем ПК, Excel. Опишите подробно свои действия - как что и куда записываете, как проверяете работу. Включены ли макросы вообще.

  9. truelogin:

    Дмитрий, прошу помощи)

    У меня есть форма - нажимая на кнопку открывается нужный мне файл Excel, а форма сворачивается.
    Как сделать так, чтобы после закрытия файла - форма опять отображалась?

    Private WithEvents App_calc As Application
    Sub Workbook_Open()
    Set App_calc = Application
    End Sub

    Private Sub App_calc_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    If Wb.Name = "123_456_3.xlsm" Then
    Application.EnableEvents = True
    Cancel = False
    F_Main_NEW.Show
    End If
    End Sub

    Так не получается - форма открывается, а файл не закрывается, пока форму не закроешь :)

    • У Вас главная проблема в том, что форма показывается в модальном режиме. Это означает, что после показа формы дальнейшее выполнение кода в той процедуре, из которой форма вызвана, приостанавливается до тех пор, пока форма не будет закрыта.
      Поэтому варианта два:
      1. Отображать форму не модально: F_Main_NEW.Show 0
      2. Отображать форму с запозданием. Создаете отдельную процедуру:

      а в процедуре WorkbookBeforeClose вызывать уже через Application.OnTime эту процедуру:

      Тогда сначала книга будет закрыта, а потом уже отображена форма.

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Логин
Счетчики
Анализ сайта

Яндекс.Метрика
© 2016 Excel для всех  Войти