Как узнать, кто открыл книгу

Программирование на Visual Basic for Applications
MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Как узнать, кто открыл книгу

Сообщение MYF » 20.08.2008 (Ср) 13:45

Книга обычно открывается из дугого приложения через VBA приблизительно вот так:
Код: Выделить всё
Dim xlApp as Excel.Application
Set xlApp = CreateObject("Excel.Application")
xlApp.Open "C:\MyBook.xls"

Но время от времени пользователи открывают её неспоследственно в Excel. В этом случае она должна открывать форму с интерфейсом.
Сделал вот так:
Код: Выделить всё
Private Sub Workbook_Open()
MyForm.Show
End Sub
Теперь форма открывается в обоих случаях.
Подскажите пожалуйста, как сделать, чтобы книга узнавала, как её открывают, и открывала форму только при непосредственном открытии. А если из приложения - молчала пока не спросят.
Года два назад делал, а теперь забыл. Очень надо. Спасибо.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Re: Как узнать, кто открыл книгу

Сообщение KL » 20.08.2008 (Ср) 15:17

Код: Выделить всё
Dim xlApp as Excel.Application
Set xlApp = CreateObject("Excel.Application")
xlApp.EnableEvents=False
xlApp.Workbooks.Open "C:\MyBook.xls"
xlApp.EnableEvents=True
Привет,
KL

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Re: Как узнать, кто открыл книгу

Сообщение MYF » 21.08.2008 (Чт) 8:50

Спасибо, KL. В справке MSO то же самое написано. Знать бы только, что спрашивать...
Вот набросал тест.
В документе MS Word:
Код: Выделить всё
Sub Test()
MsgBox "Открываем книгу"
Dim xlApp As Excel.Application
Set xlApp = CreateObject("Excel.Application")
xlApp.EnableEvents = False
xlApp.Visible = False
xlApp.DisplayAlerts = False
xlApp.Workbooks.Open "C:\MyBook.xls"
xlApp.EnableEvents = True
MsgBox "Книга открыта" & vbCr & "Закрываем"
xlApp.ActiveWorkbook.Close SaveChanges:=False
MsgBox "Книга закрыта"
End Sub
В книге MS Excel:
Код: Выделить всё
Private Sub Workbook_Open()
MsgBox "Здесь должен быть интерфейс"
End Sub
В результате, как и задумано, код Workbook_Open не активируется при зегрузке книги.
Забил подобный код в совой проект (iFIX SCADA picture). Почему-то код Workbook_Open стал отрабатывать.
Поставил на слежение xlApp.
Выяснилось, что после xlApp.Workbooks.Open опять оказывается xlApp.EnableEvents = True :shock:
Крутил-вертел так и этак... ни чего не понял.
Подскажи, пожалуйста, где ещё подкрутить? Может чего-то не досмотрел? Или есть какой ни будь другой способ?

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Re: Как узнать, кто открыл книгу

Сообщение KL » 21.08.2008 (Чт) 21:44

Дык ты попробуй убрать после
Код: Выделить всё
xlApp.Workbooks.Open "C:\MyBook.xls"
строку
Код: Выделить всё
xlApp.EnableEvents = True
или покажи точно какой код используешь в своем проекте.
Привет,
KL

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Re: Как узнать, кто открыл книгу

Сообщение MYF » 21.08.2008 (Чт) 22:37

Так вот вся фишка-то в том, что выполнял пошагово и следил за xlApp.EnableEvents. Непосредственно перед xlApp.Workbooks.Open "C:\MyBook.xls" он ваключен. Следующий шаг - и сработал Workbook_Open. Прихлопываю его MsgBox. Управление возвращается в вызвавший скрипт. А xlApp.EnableEvents уже True.

Тот VBA-код из iFIX изначально писал не я, а кикие-то уроды. Кривой, но к сожалению просто так от него не уйти. Слишком много уже на нём завязано. Приходится распутывать и перекраивать.
Вот, выкусил кусок кода из картинки iFIX. На всякий случай без изменений, только комментарии добавил
Код: Выделить всё
Private Sub InitCreateExcel()
On Error Resume Next
Set obja = CreateObject("Excel.Application")
obja.EnableEvents = False
obja.DisplayAlerts = False
obja.Visible = False
obja.Workbooks.Open FileName:=BlanksLocation & "\" & ReportTypesBox.Column(1) ' это книга из списка
obja.Run "Init" ' тут ни чего такого... только настройка внутренних переменных
' DoEvents
End Sub

Private Sub cmdDisplay_Click() ' а это та самая кнопка, которая запускает процесс
strStartTime = Format(Calendar.Value, "YYYY-MM-DD")
cmdClose.Enabled = False
cmdDisplay.Enabled = False
cmdPrint.Enabled = False
Spreadsheet1.ActiveSheet.Cells.Clear ' В картинку встроен лист Excel. Потом на него данные из книги переносятся
Spreadsheet1.ScreenUpdating = False
InitCreateExcel
Dim dt As Date
If ReportTypesBox.ListIndex = 4 Then
   If CDate(strStartDT.CurrentValue) > CDate(strEndDT.CurrentValue) Then MsgBox "Установлен некорректный интервал времени!": cmdClose.Enabled = True: cmdDisplay.Enabled = True: cmdPrint.Enabled = True: Exit Sub
'   obja.Worksheets(1).Cells(2, 1) = strStartDT.CurrentValue
   dt = CDate(strStartDT.CurrentValue)
   obja.Run "StartTime", dt ' это я дату отчёта загнал в книгу
'   obja.Worksheets(1).Cells(2, 2) = strEndDT.CurrentValue
   dt = CDate(strEndDT.CurrentValue)
   obja.Run "EndTime", dt ' это я дату отчёта загнал в книгу
  Else
'   obja.Worksheets(1).Cells(2, 2) = Calendar.Value
   obja.Run "EndTime", Calendar.Value ' это я дату отчёта загнал в книгу
End If
' obja.Run ("QueryHistorian")
obja.Run "Main" ' это я запускаю опрос ADO и рассчёт данных (помнишь на днях тема была про формулы?)
obja.Worksheets(1).Columns("A:AF").Copy
Spreadsheet1.Range("A1").Paste
Spreadsheet1.Columns.AutoFitColumns
obja.CutCopyMode = False
Spreadsheet1.Cells(1, 1).Select
Spreadsheet1.ScreenUpdating = True
DestructorCreatedReport
LoadListFiles (False)
cmdClose.Enabled = True
cmdDisplay.Enabled = True
cmdPrint.Enabled = True
End Sub

А вот кусок книги
Код: Выделить всё
Private Sub Workbook_Open()
Dim o As Object
Init
EnableInterface = True ' активировать интерфейс
On Error Resume Next
Set o = Application.CommandBars(cbName) ' Ищем панель
If Err.Number <> 0 Then
  ' Нет панели - создаём
  Set o = Application.CommandBars.Add(Name:=cbName, Position:=msoBarFloating, Temporary:=True)
  o.Visible = True
  o.Protection = msoBarNoChangeDock + msoBarNoHorizontalDock + msoBarNoVerticalDock + msoBarNoChangeVisible
  End If
' Добавляем в панель свою снопку
Set o = Application.CommandBars(cbName).Controls.Add(Type:=msoControlButton, ID:=1, Temporary:=True)
With o
  .OnAction = "Управление"
  .Caption = Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4)
  .Style = msoButtonIconAndCaption
  .TooltipText = cbсTooltip
  End With
' Открываем форму выбора даты
Выбор.Календарь.Value = Now
Выбор.Show
End Sub
Как я и писал, сразу после .Open открывается форма Выбор в книге.
Она нужна, чтобы задавать дату формарования отчёта, когда открываешь её из Проводника. А когда открывается из iFIX он сам пересылает ей дату (obja.Run "EndTime", dt), и форма эта уже не нужна.


Вернуться в VBA

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

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

    TopList