Что нового

Откртыть книгу Excel в фоне для доступа других книг

roman82101

Новичок
Сообщения
18
Репутация
1
Приветствую всех, не раз меня выручали здесь и вот появилась необходимость опять обратиться к опытным форумчанам.
Нужно открыть книгу через AutoIt так чтоб она была доступна для чтения из других документов Excel. Это как если открыть документ как обычно и свернуть, но желательно чтоб её не было видно и слышно.
Пример в файлах:
"main.xlsx" - просто список, должен находится на С:\ диске потому что этот путь прописан в "second.xlsx"
"second.xlsx" - может находится где угодно и в нём в первой ячейке выпадающий список, прописанный в Данные-Проверка данных, он работает только когда "main.xlsx" открыт
Как нужно открыть "main.xlsx" в AutoIt чтоб "second.xlsx" мог в любое время обратиться к "main.xlsx"
И процесс скрипта тоже должен был в диспетчере задач

Книга всё время в фоне находится не будет, а будет загружаться при появления процесса Excel
UIAutomate.au3 из темы https://autoit-script.ru/threads/uiautomate-avtomatizacija-nestandartnyx-ehlementov-gui.16780/
Скопировать UIAutomate.au3 в C:\Program Files (x86)\AutoIt3\Include
Код:
#NoTrayIcon
#include <UIAutomate.au3>
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) ;Показать иконку, для видимости работы скрипта
        TraySetToolTip('Выполняется main')
        $iPID = ProcessExists('EXCEL.EXE')
        _RunObj()
        ;Проверка окна на открытие файла $sFilePath, в нём таблица скрыта
        $hWnd = WinWait('Excel', '', 5)
        If WinGetState($hWnd) = 39 Then
            $oExcelDoc.Windows(1).Visible = 1 ;Отображение окна в $sFilePath
            ProcessWaitClose($iPID)
        Else
            While True
                If ProcessExists($iPID) Then
                    If WinExists('Microsoft Excel', '') = 1 Then
                        $hWnd = WinWait('Microsoft Excel', '', 5)
                        $oParent = _UIA_GetElementFromHandle($hWnd)
                        $oText = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "Вы хотите сохранить изменения в файле main.xlsx?")
                        If IsObj($oText) Then
                            $oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Не сохранять")
                            _UIA_ElementDoDefaultAction($oButton)
                        EndIf
                    Else
                        Sleep(300)
                    EndIf
                Else
                    ExitLoop
                EndIf
            WEnd
        EndIf
        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 ; ==> _RunObj()
Из минусов то что если быстро запускать и закрывать разные документы Excel, то скрипт не успевает отработать до конца
 

Вложения

  • example.zip
    13.1 КБ · Просмотры: 1
Последнее редактирование:

johnmarshall

Осваивающий
Сообщения
192
Репутация
35
Код:
#include <Excel.au3>
$FilePth = 'C:\main.xlsx'

$oExcel = _Excel_Open(False)
$oWorkbook = _Excel_BookOpen($oExcel, $FilePth, False, False)
$oWorkSheets = _Excel_SheetList($oWorkbook)
If @error Then Exit
ProcessWaitClose('EXCEL.EXE')
 
Автор
roman82101

roman82101

Новичок
Сообщения
18
Репутация
1
Код:
#include <Excel.au3>
$FilePth = 'C:\main.xlsx'

$oExcel = _Excel_Open(False)
$oWorkbook = _Excel_BookOpen($oExcel, $FilePth, False, False)
$oWorkSheets = _Excel_SheetList($oWorkbook)
If @error Then Exit
ProcessWaitClose('EXCEL.EXE')
не сработало на MS Office 2021 и Windows 10 x64
 
Последнее редактирование:
Автор
roman82101

roman82101

Новичок
Сообщения
18
Репутация
1
что значит не видит?
пример покажите, что не получается
извиняюсь за не однозначность. Когда закрываю окно Excel (MS Office 2021) появляется сообщение о сохраниении открытого документа, так вот при наведении курсора на это окно от AutoIt Window Info оно видит только заголовок, а текст и кнопки в окне нет
image.png
Код:
$oExcelDoc.WorkBook.Saved = False
$oExcelDoc.DisplayAlerts = False
 
Последнее редактирование:
Автор
roman82101

roman82101

Новичок
Сообщения
18
Репутация
1
а нельзя перез закрытием сохранить
Код:
_Excel_Close($oExcel, Default, True)

https://www.autoitscript.com/forum/topic/153520-iuiautomation-ms-framework-automate-chrome-ff-ie/ пробовали?

тут ui github есть /Spy/Inspect.exe
Просматривая ссылки наткнулся на https://autoit-script.ru/threads/uiautomate-avtomatizacija-nestandartnyx-ehlementov-gui.16780/
и статья очень помогла, благодарю за помощь вопрос решён
 
Верх