Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Событие открытия произвольной книги

14K
31 июля 2007 года
Njif
29 / / 05.12.2006
Привет, бывалые!
Не могу отследить событие открытия книги.
Общая задача следующая.
1) Запускается макрос в изначально неизвестной книге А.
2) По ходу работы открывается диалог открытия, и через него открывается некоторая книга Б.
3) Необходимо перехватить имя открываемого документа Б, либо указатель на него. И далее, продолжить работу с Б и А.
Я сделал следующее:
1) Исполняемый код поместил в модули PERSONAL.XLS, чтобы запускать макрос из любой книги (А).
2) Перехват имени (попытался через ActiveWorkbook.Name) поместил в Workbook_open в "Эта книга" в PERSONAL.XLS. [COLOR="Red"]СОБЫТИЕ НЕ СРАБАТЫВАЕТ!!![/COLOR] Когда поместил в Workbook_open некоторой конкретной книги, которую через диалог и открыл, то событие сработало (хотя ActiveWorkbook результата не дал :) ).
Как быть? Какие рекомендации можете дать?
Заранее благодарен!
Версия: Excel 2003.
18K
31 июля 2007 года
pavel55
79 / / 14.05.2007
У меня вот такой пример работает

 
Код:
Sub Макрос1()
Dim iOpen As Boolean, iFileName$
    iOpen = Application.Dialogs(xlDialogOpen).Show
    If iOpen = True Then
        iFileName = ActiveWorkbook.Name
        MsgBox "Вы открыли : " & iFileName, , ""
    Else
        MsgBox "Вы не выбрали рабочую книгу!", , ""
    End If
End Sub


Ну и, соответственно, работайте потом с переменной iFileName
405
31 июля 2007 года
Dmitrii
554 / / 16.12.2004
Njif, думаю, что для организации работы с личной книгой макросов имеет смысл использовать события объекта Application.
Вот демонстрационный пример ([color=blue]вся работа выполняется в книге PERSONAL.XLS[/color]):
1. Создайте новый модуль класса (пусть его имя - MyClass).
2. В этом модуле разместите такой код:
 
Код:
Public WithEvents App As Application

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
Dim strTemp As String
strTemp = Wb.Name
If StrComp(strTemp, ThisWorkbook.Name, vbTextCompare) <> 0 Then
    MsgBox strTemp
End If
End Sub

3. В модуле ЭтаКнига разместите такой код:
 
Код:
Dim objClass As New MyClass

Private Sub Workbook_Open()
Set objClass.App = Application
End Sub

или в любом обычном модуле такой ([color=blue]используйте только один вариант![/color]):
 
Код:
Dim objClass As New MyClass

Sub Auto_Open()
Set objClass.App = Application
End Sub

4. Сохраните внесённые изменения и пробуйте всё это в работе.

P/S
Даже если для решения текущей задачи Вам вполне достаточно того, что уже предложил pavel55, то может быть в дальнейшем понадобится и приведённая мной информация. :)
18K
31 июля 2007 года
pavel55
79 / / 14.05.2007
Dmitrii, я думаю, ваш код понадобится многим )
14K
01 августа 2007 года
Njif
29 / / 05.12.2006
Развернутый ответ :)
Спасибо! Многое подчерпнул для себя!
Если честно, еще не испробовал. Но смысл написанного понятен :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог