Excel открытие книги в другом процессе

Программирование на Visual Basic for Applications
Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Excel открытие книги в другом процессе

Сообщение Wasup! » 05.07.2006 (Ср) 9:07

Программа на VB с помощью ADO формирует отчет в Excel.

Код: Выделить всё

dim e                  As New Excel.Application
Dim wbk              As Workbook

Set wbk = e.Workbooks.Add(App.Path & "\template.xls")

'Вставка данных из Recordset`a

wbk.SaveAs strFileName, xlWorkbookNormal
wbk.Close

e.Quit
Set e = Nothing
Вопрос в следующем, когда запускается программа, она создает новый процесс Excel`я, который невидим и никак не мешает работе с другими книгами Excel. Когда отчет завершается, то и этот процесс завершается.
Но если сначала запустить отчет, а потом открыть документ в Excel. То становится видимой и книга wbk с которой работает отчет.
Получается, что можно случайно вмешаться в работу отчета, открыв другую книгу.
Можно ли как-то этого избежать? Например сделать так, чтобы при работе отчета, другие книги открывались в другом процессе или еще что-то.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.07.2006 (Ср) 9:20

e.IgnoreRemoteRequests = True
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 05.07.2006 (Ср) 10:05

Это свойство подходит, но оно почему-то не сбрасывается. То есть, после e.close, когда процесс Excel завершился, попробовать открыть
любую книгу, она не откроется. Excel будет открыт, но книга нет. Если потом запустить только такой код:

Код: Выделить всё
dim e                As New Excel.Application
e.IgnoreRemoteRequests = False
e.Quit
Set e = Nothing


все работает нормально. Как такое получается, ведь каждый раз, по идее, создаются независимые процессы Excel?
Можно сделать e.IgnoreRemoteRequests = False в конце отчета и обработчиках ошибок. Но ведь если отчет будет остановлен по ctrl+alt+del, свойство не восстановится.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.07.2006 (Ср) 10:16

Не сбрасывается потому, что это настройка excel. Сервис - параметры - общие.

Вариант второй - ловить событие WorkbookOpen в E. Запрещать, закрывать и переоткрывать в новом excel.application. Но не знаю, успеет ли до появления.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 05.07.2006 (Ср) 11:12

А св-во e.interactive сбрасывается по e.close? И как оно распространяется на другие процессы Excel?
Получился такой вариант
Код: Выделить всё
e.Caption = "Работает отчет. До окончания работы EXCEL заблокирован."
e.interactive=false
'...
e.interactive=true
e.Caption = "Microsoft Excel"

Хотя в хелпе написано
If you set this property to False, don't forget to set it back to True. Microsoft Excel won't automatically set this property back to True when your macro stops running.

по закрытию excel свойство сбрасывается

yura613
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 101
Зарегистрирован: 12.06.2006 (Пн) 15:49
Откуда: Минск

Сообщение yura613 » 31.07.2006 (Пн) 12:39

Wasup! и GSerg а если я работаю в самом Экселе. Вызываю другую книгу и провожу там какие нибудь операции, можно сделать так чтобы не было видно этой книги и все что там происходит.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.07.2006 (Пн) 19:44

Создать новый инстанс экселя и загрузить книгу в нём.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

yura613
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 101
Зарегистрирован: 12.06.2006 (Пн) 15:49
Откуда: Минск

Сообщение yura613 » 31.07.2006 (Пн) 22:34

В принципе если я создаю в текущей книге новую и копирую туда лист, то так и получается, вроде скопированный лист является новой самостоятельной книгой.
Код: Выделить всё
sub combinebooks()
...'(наверное здесь надо какую то переменную добавить типа  excel.application)
Dim DestWB As Workbook
...
Set DestWB = Workbooks.Add(xlWorksheet)
...'здесь я пытался поставить одно из вышеупомянутых выражений
'(DestWB.interactive  или DestWB.IgnoreRemoteRequests)
Dim OrigWB As Workbook
set OrigWB.worksheets("n").copy _
After:=DestWB.Sheets(DestWB.Sheets.Count)
...

Application.DisplayAlerts = False
DestWB.sheets("n").visible = true ' в этом месте проблема, появляется
'лист на переднем плане и все становится видно
...
DestWB.Sheets(1).Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
DestWB.close SaveChanges:= true
Set DestWB = Nothing
End Sub


в итоге не работает :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.07.2006 (Пн) 23:21

Кхм...

А это... чему удивляешься-то? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

yura613
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 101
Зарегистрирован: 12.06.2006 (Пн) 15:49
Откуда: Минск

Сообщение yura613 » 01.08.2006 (Вт) 8:42

Да не удивляюсь, а расстраиваиюсь от того что не знаю как сделать. Вроде получил инфу полезную а как преминить не знаю. :cry:

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 01.08.2006 (Вт) 9:37

Wasup! правильно писал(а):
Код: Выделить всё
dim e                As New Excel.Application
e.IgnoreRemoteRequests = False


а вот yura613 неправильно писал(а):
Код: Выделить всё
Dim DestWB As Workbook
...
Set DestWB = Workbooks.Add(xlWorksheet)
...'здесь я пытался поставить одно из вышеупомянутых выражений
'(DestWB.interactive  или DestWB.IgnoreRemoteRequests)

yura613
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 101
Зарегистрирован: 12.06.2006 (Пн) 15:49
Откуда: Минск

Сообщение yura613 » 01.08.2006 (Вт) 17:38

Во блина доэксперементировался,у меня ща ни один экселевский файл не работает. Что делать? :shock:

Я открываю любой Экселевский файл, в нем сразу создается новая книга и после этого файл зависает и ничего с ним не сделаешь. :(
Как исправить?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.08.2006 (Вт) 22:43

Запустить пустой эксель, в параметрах поставить хотя бы средний уровень защиты от макросов, открыть файл.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

yura613
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 101
Зарегистрирован: 12.06.2006 (Пн) 15:49
Откуда: Минск

Сообщение yura613 » 02.08.2006 (Ср) 8:56

Ну все хорошо :lol: . GSerg спасибо. После перезагрузки компа тормозить перестало, но макрос все равно запускался при открытии книги. Если хотите могу представить код, чтобы разобраться и все таки реализовать идею, так как все равно видно как страница становится видимой.

yura613
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 101
Зарегистрирован: 12.06.2006 (Пн) 15:49
Откуда: Минск

Сообщение yura613 » 03.08.2006 (Чт) 14:48

Разобрался. Сделал. Не надо было испоьлзовать никаких .interactive или .IgnoreRemoteRequests, нужно было всего лишь выражение Application.ScreenUpdating = True в самый конец поставить и все. Как говорится все гениальное- просто! :lol:


Вернуться в VBA

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

Сейчас этот форум просматривают: Google-бот и гости: 37

    TopList