Так вот вся фишка-то в том, что выполнял пошагово и следил за
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), и форма эта уже не нужна.