Блокировка процесса excel на время выполнения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Блокировка процесса excel на время выполнения

Сообщение ZlydenGL » 29.03.2005 (Вт) 16:15

Мдя, топик получился неинформативный - это мягко говоря :evil:

В двух словах - задача следующая:
создается объект
Set xls=CreateObject("Excel.Application")
И ведется с ним работа, допустим, просмотр данных.

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

Вопрос такой: можно ли заблокировать Ёксель для открытия новых книг? Чтобы при щелчке юзера на книге во время выполнения кода система открывала новый процесс Ёкселя?

Спасибо!
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 29.03.2005 (Вт) 16:58

Не канает. Открывает в том же окне - только что проверил.

Хм, интересно... Даже xls.Enabled = False не помогает!!!
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 29.03.2005 (Вт) 20:06

Возможно, мой пример покажеться излишним, но тем не менее:

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

Option Explicit
Dim WithEvents xls As Excel.Application
Dim AllowOpen As Boolean

Private Sub Form_Load()
Set xls = CreateObject("Excel.Application")
xls.Visible = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
xls.Quit
End Sub

Private Sub xls_WorkbookOpen(ByVal Wb As Excel.Workbook)
If Not AllowOpen Then
    Dim NewApp As Excel.Application, nStr As String
    nStr = Wb.FullName
    Wb.Close False
    Set NewApp = CreateObject("Excel.Application")
    NewApp.Visible = True
    NewApp.Workbooks.Open nStr
End If
End Sub
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 30.03.2005 (Ср) 9:48

ANDLL, FleX_2004 честно говоря не нашел в ваших кодах ничего, что касалось бы моего случая.

Еще раз ситуация - пользователь запускает мою программу (которая что-то там делает с одной из книг Excel) и не дожидаясь конца ее работы - запускает через проводник или через какой-нить коммандер другую книгу Excel. Получается что вторая книга открывается тем же процессом, с которым работает моя программа - соответственно во-первых меняются ссылки Activeworkbook, Activesheet (что не смертельно - код можно поменять), а во-вторых, если пользователь закроет свою книгу путем закрытия процесса (щелкнет мышой по самому верхнему крестику в Excel'е или нажмет Alt+F4), то вообще вырубит нормальное выполнение кода.

Вот такая вот загогулина...
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 30.03.2005 (Ср) 10:59

ZlydenGL писал(а):
Вот такая вот загогулина...


Зацепи книгу Excel через ODBC :wink:
//<-
Mit freundlichen Grüßen
//->

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 30.03.2005 (Ср) 12:06

Код: Выделить всё
Option Explicit
Dim WithEvents xls As Excel.Application
Dim b As Excel.Workbook
Dim AllowOpen As Boolean
Dim i As Long

Private Sub Command1_Click()
Timer1.Enabled = True
End Sub

Private Sub Form_Load()
Set xls = CreateObject("Excel.Application")
Set b = xls.Workbooks.Add
i = 1
'xls.Visible = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
b.SaveAs "d:\test.xls"
b.Close
Set b = Nothing
xls.Quit
Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
b.Sheets.Item(1).Cells(i, 1).Value = i
i = i + 1
End Sub

Private Sub xls_WorkbookOpen(ByVal Wb As Excel.Workbook)
If Not AllowOpen Then
    Dim NewApp As Excel.Application, nStr As String
    nStr = Wb.FullName
    Wb.Close False
    Set NewApp = CreateObject("Excel.Application")
    NewApp.Visible = True
    NewApp.Workbooks.Open nStr
End If
End Sub



Бросишь на форму таймер и кнопку, запустишь программу и нажмиешь кнопку.
В это время открываешь, закрываешь, вообщем работаешь с екселем как надо, потом закрываешь программу и смотришь в корне диска D файл test.xls
При этом Dim WithEvents xls As Excel.Application можно объявить без WithEvents и убрать обработку открытия новой книги.
Проблема будет, если есть личная книга макросов скажет что файл занят и может быть открыть для чтения или пришлет уведомление о том когда освободят
А так все работает как часы
Удачи

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 30.03.2005 (Ср) 16:20

ANDLL, извини, не просек сразу что у тебя переменная определяется через WithEvents.

Igor_123, ANDLL, ребят, вопрос такой - код отлично срабатывает только в случае если в открываемой пользователем нет залинкованных на другую книгу ячеек - в ином случае пользователю придется дважды давать команду выбора режима работы. Иначе никак не сделать?
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 01.04.2005 (Пт) 11:24

А что насчет хелпа, ну или на крайний случай Object Browser
Object Browser писал(а):Function Open(Filename As String, [UpdateLinks], [ReadOnly], [Format], [Password], [WriteResPassword], [IgnoreReadOnlyRecommended], [Origin], [Delimiter], [Editable], [Notify], [Converter], [AddToMru], [Local], [CorruptLoad]) As Workbook
Member of Excel.Workbooks

[UpdateLinks]

А ещё есть
Код: Выделить всё
Application.DisplayAlerts = False


Не забудь по окончании сделать ему true

Перехват и обработка всех ошибок тебе тоже очень помогут.

Удачи!

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 05.04.2005 (Вт) 14:49

Igor_123, насчет функции Open все понятно - за одним исключением: она вызывается процессом Excel внутри себя, так? И снаружи я ее в общем-то не перехвачу. И среди аргументов этой функции не нашел чего-то вроде "Больше в этом процессе ничего не открывать".

У меня получается что в момент обработки данных в электронной таблице создается процесс Excel, в котором и идет обработка. Внедрить доп. код в этот процесс я так понимаю не получится.

А вот за DisplayAlerts спасибо, кажется помогает :) Только по окончании делать ему True нет необходимости - в конце работы процесс выгружается из памяти и все ;)
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.


Вернуться в Visual Basic 1–6

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

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

    TopList