Как сделать чтобы в application открывался только один файл?

Программирование на Visual Basic for Applications
Antov
Обычный пользователь
Обычный пользователь
 
Сообщения: 54
Зарегистрирован: 21.01.2007 (Вс) 6:24

Как сделать чтобы в application открывался только один файл?

Сообщение Antov » 07.06.2007 (Чт) 6:40

Есть Workbook, который открывается из VB6, путём создания нового объекта
Код: Выделить всё
Dim ExApp As New Excel.Application
Dim WbkAster As Excel.Workbook
Set ExApp = CreateObject("EXCEL.APPLICATION")
Set WbkAster = .Workbooks.Open(MyPath....

Если после запуска данного файла я открываю ещё один файл excel? то он запускается в данном Aplication.
Как сделать так, чтобы все последующие excel файлы открывались в новом (в другом) приложении (application)?
Ну, или на худой конец, как можно перехватить событие что то вроде "BeforeOpenWorkbook", т.е. чтобя я мог отловить, что в данном application пытается открыться ещё один файл и закрыть его?
Очень (!) надо, выручайте :)
ЗАранее Спасибо!
Всё что не убивает нас - делает нас сильнее.
(С) Ницше

Krasnaja Shapka
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 26.10.2006 (Чт) 12:13
Откуда: Киев

Сообщение Krasnaja Shapka » 07.06.2007 (Чт) 10:16

см. эту тему:
http://www.progz.ru/forum/index.php?showtopic=30122&hl=
там боролись за то, чтоб при открытии определенного документа нельзя было работать с другими... т.е. отлавливали событие "открытие нового документа" и закрывали документ... так вот тебе его надо не просто закрыть, а закрыть и открыть в другом application.
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Как сделать чтобы в application открывался только один ф

Сообщение HandKot » 07.06.2007 (Чт) 12:20

Antov писал(а):Как сделать так, чтобы все последующие excel файлы открывались в новом (в другом) приложении (application)?


так и создайте еще одно приложение Excell
Код: Выделить всё
Dim ExApp_1 As Excel.Application
Dim WbkAster_1 As Excel.Workbook
Set ExApp_1 = CreateObject("EXCEL.APPLICATION")
Set WbkAster_1 = .Workbooks.Open(MyPath....

а уж где открывать книги решать вам
I Have Nine Lives You Have One Only
THINK!

Antov
Обычный пользователь
Обычный пользователь
 
Сообщения: 54
Зарегистрирован: 21.01.2007 (Вс) 6:24

Сообщение Antov » 08.06.2007 (Пт) 7:42

Спасибо за ссылку - к сожалению не смог добиться нужной работы предложенных там скриптов :)

Если создавать ещё одно приложение (так было до поры до времени), а потом выяснилось - то при открытии нового файла, он открывает его в Последнем АКТИВНОМ application :)

Всем спасибо за советы. В итоге решил свою задачу ооочень обходным путём (задача заключалась чуть в другом, а сабж был потенциальным средством).
Всё что не убивает нас - делает нас сильнее.
(С) Ницше

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 09.06.2007 (Сб) 6:39

Antov
Можно было так
Код: Выделить всё
Public Function ExcelReference() As Object
On Error GoTo errHandle
    Set ExcelReference = GetObject(, "Excel.Application")
Exit Function
errHandle:
    If Err.Number = 429& Then
        Set ExcelReference = CreateObject("Excel.Application")
    Else
        Set ExcelReference = Nothing
        Err.Raise Err.Number
    End If
End Function

Antov
Обычный пользователь
Обычный пользователь
 
Сообщения: 54
Зарегистрирован: 21.01.2007 (Вс) 6:24

Сообщение Antov » 09.06.2007 (Сб) 16:11

anvg писал(а):Antov
Можно было так

Извините, но я не понял, что "можно было так" ...?

Проблема не в том, где открыть новый файл, а втом, что когда запущено моё приложение (о котором идёт речь), если открыть другой файл (дважды кликаешь на любом другом excel файле) - он открывается в последнем активном экземпляре экселя, т.е. в том application, в котором у меня запущен мой проект - что приводит к опредёлнным объективным глюкам - обойти которые никак нельзья, кроме как перехватом события попытки открыть новую книгу в данном экземпляре и отменить её (конечно же с последующим созданием нового application и открытием файла там)
Всё что не убивает нас - делает нас сильнее.
(С) Ницше

Antov
Обычный пользователь
Обычный пользователь
 
Сообщения: 54
Зарегистрирован: 21.01.2007 (Вс) 6:24

Сообщение Antov » 09.06.2007 (Сб) 16:34

Krasnaja Shapka писал(а):см. эту тему:
http://www.progz.ru/forum/index.php?showtopic=30122&hl=


Смешно до слёз :) - не заработали примеры, приведённый на ветке по ссылке лишь потому, что чтобы
Код: Выделить всё
Private WithEvents iXLApp As Application
вступил в силу - надо переоткрыть файл :))))
Заработало, но не то что нужно.

Мне нужно событие BeforeOpen? Чтобы узнавать о попытке открыть книгу ещё до того как она загружена в application...
подскажите куда рыть?
Спасибо :)
Всё что не убивает нас - делает нас сильнее.
(С) Ницше

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 09.06.2007 (Сб) 17:38

Antov
А теперь вот так
Класс ExcelEvent
Код: Выделить всё
Private WithEvents myExcel As Excel.Application
Private thisOpen As Boolean
'вызываем, если нужно в нашем коде открыть книгу
Public Sub myCodeOpen()
    thisOpen = True
End Sub
'получить ссылку на наш экземпляр Excel
Public Property Get ExcelReference() As Excel.Application
    Set ExcelReference = myExcel
End Property
'создаём класс обёртку-событий нашего экземпляра Excel
Private Sub Class_Initialize()
    Set myExcel = New Excel.Application
    thisOpen = False
End Sub
'ловим (однократно на самом деле) открытие книги из другого места
Private Sub myExcel_WorkbookOpen(ByVal Wb As Workbook)
    Dim wbPath As String
   
    'если открываем книгу из нашего кода
    If thisOpen Then
        'твой код
    Else 'иначе, если открывается книга из другого места
        wbPath = Wb.FullName
        Wb.Saved = True
        Wb.Close
        Shell myExcel.Path & "\excel.exe " & wbPath
    End If
End Sub

модуль
Код: Выделить всё
Public xlsEvent As ExcelEvent

Public Sub Main()
    Set xlsEvent = New ExcelEvent
End Sub

А дальше, созданный экземпляр (в shell) будет перехватывать события открытия книги, пока, не останется только твой


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 110

    TopList