roman82101
Новичок
- Сообщения
- 16
- Репутация
- 0
Приветствую всех, не раз меня выручали здесь и вот появилась необходимость опять обратиться к опытным форумчанам.
Нужно открыть книгу через AutoIt так чтоб она была доступна для чтения из других документов Excel. Это как если открыть документ как обычно и свернуть, но желательно чтоб её не было видно и слышно.
Пример в файлах:
"main.xlsx" - просто список, должен находится на С:\ диске потому что этот путь прописан в "second.xlsx"
"second.xlsx" - может находится где угодно и в нём в первой ячейке выпадающий список, прописанный в Данные-Проверка данных, он работает только когда "main.xlsx" открыт
Как нужно открыть "main.xlsx" в AutoIt чтоб "second.xlsx" мог в любое время обратиться к "main.xlsx"
И процесс скрипта тоже должен был в диспетчере задач
Из минусов то что каждый раз при закрытии Excel будет запрос на сохранение файла $sFilePath, AutoIt не видит эти окна
И если быстро запускать и закрывать разные документы Excel, то скрипт не успевает отработать до конца, но это для моей ситуации не очень критично
Нужно открыть книгу через AutoIt так чтоб она была доступна для чтения из других документов Excel. Это как если открыть документ как обычно и свернуть, но желательно чтоб её не было видно и слышно.
Пример в файлах:
"main.xlsx" - просто список, должен находится на С:\ диске потому что этот путь прописан в "second.xlsx"
"second.xlsx" - может находится где угодно и в нём в первой ячейке выпадающий список, прописанный в Данные-Проверка данных, он работает только когда "main.xlsx" открыт
Как нужно открыть "main.xlsx" в AutoIt чтоб "second.xlsx" мог в любое время обратиться к "main.xlsx"
И процесс скрипта тоже должен был в диспетчере задач
Книга всё время в фоне находится не будет, а будет загружаться при появления процесса Excel
Код:
#NoTrayIcon
Opt('TrayMenuMode', 1) ;Иконка в трее без стандартного меню
$sFilePath = 'C:\main.xlsx'
If Not FileExists($sFilePath) Then Exit MsgBox(0, 'Ошибка', 'Не найден файл "'&$sFilePath&'"', 10)
If ProcessList(@ScriptName)[0][0]>1 Then
If MsgBox(4 + 32, 'Внимание', 'Программа уже запущена'&@CRLF&'Завершить?') = 6 Then
ProcessClose(@ScriptName)
Exit
Else
Exit
EndIf
EndIf
Global $iErr = 0, $oExcelDoc
;Открытие и закрытие Obj для работы в первом открытом файле Excel после включения компьютера
ToolTip('Не открывайте документы в Excel', @DesktopWidth / 2, @DesktopHeight / 2, 'Подождите', 2, 2)
_RunObj()
$oExcelDoc.Close
ProcessWaitClose('EXCEL.EXE')
ToolTip('')
While True
ProcessWait('EXCEL.EXE')
If Not WinExists('PauseMain') Then ;Пауза чтоб не мешал другим скриптам, там прописать AutoItWinSetTitle('PauseMain')
Opt('TrayIconHide', 0) ;Показать иконку, для видимости работы скрипта
$iPID = ProcessExists('EXCEL.EXE')
_RunObj()
;Проверка окна на открытие файла $sFilePath, в нём таблица скрыта
WinWait('Excel', '', 5)
If WinGetState('[ACTIVE]', '') = '45' Then $oExcelDoc.Windows(1).Visible = 1 ;Отображение окна в $sFilePath
ProcessWaitClose($iPID)
ToolTip('Не открывайте документы в Excel', @DesktopWidth / 2, @DesktopHeight / 2, 'Подождите', 2, 2)
;Закрытие оставшегося процесса Excel
$oExcelDoc = ObjGet($sFilePath)
$oExcelDoc.Close
ProcessWaitClose('EXCEL.EXE')
Opt('TrayIconHide', 1) ;Снова скрыть иконку
ToolTip('') ;Убрать всплывающее сообщение
Else
Sleep(1000) ;Ждать закрытия скрипта с AutoItWinSetTitle('PauseMain')
EndIf
WEnd
Func _RunObj()
If $iErr < 10 Then
$oExcelDoc = ObjGet($sFilePath)
If @error Then
$iErr = $iErr + 1
Sleep(500)
$oExcelDoc = ObjGet($sFilePath)
If @error Then
$iErr = $iErr + 1
Sleep(500)
_RunObj()
Else
$iErr = 0
EndIf
EndIf
Else
MsgBox(0, 'Ошибка', 'Не удалось открыть "'&$sFilePath&'"')
Exit
EndIf
EndFunc
И если быстро запускать и закрывать разные документы Excel, то скрипт не успевает отработать до конца, но это для моей ситуации не очень критично
Вложения
Последнее редактирование: