Страницы: 1
RSS
Работа с Excel разных версий в нескольких процессах
 
Мяв.
Используя ссылки и бесценные советы Doober'a, поиск, и свою фантазию был сочинен код для обработки и сохранения файлов, открытых в отдельных процессах Excel.
По результатам последнего тестирования, получаем следующее
Win7/32 Of 2010/32
Не зависимо от числа файлов, открытых в родительском процессе, число вызовов приложения Set xl = ob.Application колеблется от 1 до общего количества процессов Excel.

Win7/64 of 2016/32
При наличии в родительском процессе 1 файла, количество вызовов 1 шт.
При наличии в родительском процессе 2 и более файлов, вызов приложения попадает в бесконечный цикл. (в коде установлен счетчик для прерывания, очень тупой, на 500 итераций)

Интересует поведение данного кода в различных версиях Ofis, и различных ОС.
А так же очень интересует более адекватный (?) способ прерывания (гусары, молчать!  :) )

В первой части тестирования уже принимали участие голодный котяра, и обкурившийся ведмедь, за что им отдельная благодарность.

Общий инструктаж
распаковать архив
запустить TEST
нажать кнопку 1 - 4 остальных файла откроются в новых процессах (эмуляция работы "сторонней программы")
Нажать кнопку 2 - запустится рабочий макрос, который сохранит файлы, открытые в других процессах по заданным местам, и закроет все лишнее.

Нужное отобразится в MsgBox и в Debag
Изменено: RAN - 27.10.2019 18:52:41
 
Цитата
RAN написал:
4 остальных файла откроются в новых процессах (эмуляция работы "сторонней программы")
Андрей, Так это эмуляция или все ж процессы Excel? Я просто не совсем понимаю зачем плодить процессы, в чем смысл?
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Я просто не совсем понимаю зачем плодить процессы, в чем смысл?
Альтернатива  - утки? (переписать стороннюю программу, чтобы она выгружала файлы так, как нам желательно?)
Сия альтернатива, как бэ.., не совсем альтернатива...

Миш, ты не поверишь, но при выборе пакетной выгрузки 10 смет, будет создано 20 файлов, причем каждый в новом процессе, и каждый никуда не сохранен!

Одно то, что их хоть как-то различить можно, уже 100500+!
Изменено: RAN - 27.10.2019 21:32:10
 
Я  тут как-то так писал обход дерева окон (вычислил от всего, что не касается поиска окон книг)
Код
Option Explicit

Option Explicit
Option Base 1
 
Private Declare Function GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal hwnd&, ByVal lpClassName$, ByVal nMaxCount&)
Private Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal hwnd&, ByVal lpString$, ByVal cch&)
Private Declare Function AccessibleObjectFromWindow& Lib "oleacc" (ByVal hwnd&, ByVal dwId&, riid As GUID, xlWB As Object)
Public Declare Function GetWindow& Lib "user32" (ByVal hwnd&, ByVal wCmd&)
Public Declare Function GetDesktopWindow& Lib "user32" ()
 
Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5
Private Const OBJID_NATIVEOM = &HFFFFFFF0
 
Private Type GUID
    lData1 As Long
    iData2 As Integer
    iData3 As Integer
    aBData4(0 To 7) As Byte
End Type
 
Private IDispatch As GUID, oWnd As Window
Public WbArr() As Workbook, arr() As Variant
 
Public Sub EnumWorkbooks()
    Dim i&
    With IDispatch
        .lData1 = &H20400: .iData2 = &H0: .iData3 = &H0
        .aBData4(0) = &HC0: .aBData4(1) = &H0: .aBData4(2) = &H0
        .aBData4(3) = &H0: .aBData4(4) = &H0: .aBData4(5) = &H0
        .aBData4(6) = &H0: .aBData4(7) = &H46
    End With
    ReDim WbArr(1), arr(1)
    FindWindowHwndLike 0, "EXCEL7", "", 0, 0, 0
    Set oWnd = Nothing
End Sub
 
Private Function FindWindowHwndLike&(hWndStart&, ClassName$, WindowTitle$, level&, lHolder&, lCnt&)
    Dim hwnd&, sWindowTitle$, sClassName$, r&
    If level = 0 Then
        If hWndStart = 0 Then
            hWndStart = GetDesktopWindow()
        End If
    End If
    level = level + 1
    hwnd = GetWindow(hWndStart, GW_CHILD)
    Do While hwnd > 0
        lHolder = FindWindowHwndLike(hwnd, ClassName, WindowTitle, level, lHolder, lCnt)
        sWindowTitle = Space$(255)
        r = GetWindowText(hwnd, sWindowTitle, 255)
        sWindowTitle = Left$(sWindowTitle, r)
        sClassName = Space$(255)
        r = GetClassName(hwnd, sClassName, 255)
        sClassName = Left$(sClassName, r)
        If (InStr(1, sWindowTitle, WindowTitle, vbBinaryCompare) > 0 Or sWindowTitle = WindowTitle) And (sClassName Like ClassName & "*" Or sClassName = ClassName) Then
            FindWindowHwndLike = hwnd
            lHolder = hwnd
            AccessibleObjectFromWindow hwnd, OBJID_NATIVEOM, IDispatch, oWnd
            If Not oWnd Is Nothing Then
                If oWnd.Visible Then
                    lCnt = lCnt + 1
                    ReDim Preserve WbArr(1 To lCnt), arr(1 To lCnt)
                    Set WbArr(lCnt) = oWnd.ActiveSheet.Parent
                    arr(lCnt) = WbArr(lCnt).Name
                End If
            End If
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop
    FindWindowHwndLike = lHolder
End Function
Изменено: Андрей Лящук - 28.10.2019 00:46:46
 
Цитата
RAN написал:
Миш, ты не поверишь,
Поверю, но другой процесс в моем понимании, нужен для случаев когда
1. Параллельная и независимая обработка
2. Ресурсы приложения ограничены в пределах одного процесса и этого едва хватает для обработки одного экземплра
3. Приложение обработчик не умеет открывать два более одного файла одновременно
4. При открытии в одном экземпляре приложения могут быть влияния друг на друга.
5. …. Ну еще что-нибудь придумать можно

Я реально не понимаю идеи и выгоды от того  будет создано 20 файлов  и  каждый никуда не сохранен!
Например через WScript.Shell можно запустить приложение и сразу получить его ID чтоб не мучатся потом с поиском
Код
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("notepad")
WScript.Sleep 2000
WshShell.AppActivate(WshExec.ProcessID)

Почему временно не сохранить файл с уникальным именем, тем самым  идентифицировать все 20?
Может путь и верный выбран, но без описания конечной идеи - это пока только создание себе сложностей.

P.S.
Цитата
RAN написал:
версиях Ofis,
- Он Office  :-)
Изменено: БМВ - 28.10.2019 07:56:57
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Я реально не понимаю идеи и выгоды от того  будет создано 20 файлов
Я тоже. Но эти файлы создаются не Excel.
Есть программа "Не Excel". В ней есть кнопка. Так вот, при нажатии этой кнопки и получаются эти 20 файлов. А далее, по крайней мере сейчас, девочка заходит в каждый из этих файлов, жмакает "сохранить", слегка переименовывает, и жмакает "закрыть".

Я не сомневаюсь, что задачу можно решить и не макросом Excel, а другой программой, но макросы мне ближе.

Андрей, спасибо. Погоняю.
Изменено: RAN - 28.10.2019 08:53:10
 
RAN,
Цитата
RAN написал:
Есть программа "Не Excel". В ней есть кнопка.
Уже лучше
Цитата
RAN написал:
Так вот, при нажатии этой кнопки и получаются эти 20 файлов
файлов или несколько окон с данными или …..
Цитата
RAN написал:
А далее, по крайней мере сейчас, девочка заходит в каждый из этих файлов, жмакает "сохранить",
если не докапываться что в файл не заходят, а открывают то , я правильно понимаю, что это хочется автоматизировать?
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
если не докапываться что в файл не заходят, а открывают
Что его открывать? Он уже открыт. Его нужно сохранить и закрыть.
Цитата
БМВ написал:
правильно понимаю, что это хочется автоматизировать
Абсолютно правильно.
 
Андрей, с точки зрения  системы - пока информация не сохранена - это не файл, и уж тем более не открытый. Да,придирка от системщика :-)
Заходят ( запускают) приложение, в приложении открывают файл. ну то что некоторый файлы (exe) самостоятельные приложения , это побочный эффект :-) Ведь например VBS можно открыть редактором, а можно запустить ( хотя это открыть обработчиком)
По вопросам из тем форума, личку не читаю.
 
Цитата
RAN написал:
Интересует поведение данного кода в различных версиях Ofis, и различных ОС.
Люблю мучать старичков)). WinXP SP3, OfficeXP SP3 - результат 2.
Причем, когда сначала открылось не 4 файла, а порядка 10, причем очень знакомых, дошло, что xlsx файлы преобразуются в xls и отрываются из папки Temp (повод почистить)), тестовая программа и пооткрывала все такие файлы (тогда результат был - 1). После переноса в нужную папку, все отработало (создались папки и пересохранились файлы).
 
Win7 Ultimate x86

Excel 2013 Pro+
с одним открытым файлом k = 1
c двумя 10-секундный паркинсон, k = 494

повторил то же самое в 2010 portable, 2007,  2003 portable
с любым количеством файлов k=1

до кучи, написал вариант c EnumWindows и EnumChildWindows (для x86)
Скрытый текст
Изменено: Андрей Лящук - 29.10.2019 16:40:35
 
Здравствуйте, коллеги!
Проблемы "зацикливания" в версиях 2013+ вызваны переходом Excel на интерфейс SDI.
Метод обхода экземпляров Excel от Peter Thornton циклить не должен (взять второй, уточненный вариант).
Владимир
 
Мяв.
Был отлучен от интернета.
Всем спасибо за тесты и варианты.
Погляжу обязательно.
 
Off
Цитата
RAN написал:
Был отлучен от интернета.
наказан был? В тапки ..... ?
По вопросам из тем форума, личку не читаю.
 
Хуже. В воскресенье ветром сорвало крышу с дома в деревне. Сегодня откапывал из-под снега то, что не успели починить вчера.
 
Off
Ё . Это где так накрыло? Новости пробегали про центральный регион.
По вопросам из тем форума, личку не читаю.
 
Нижегородская область
 
Посмотрел варианты.
Понравился код от Peter Thornton по ссылке sokol92
Что самое приятное - не оставляет хвостов в диспетчере.

Код Андрея тоже не оставляет хвостов, но уж очень сложен для восприятия.

Еще раз всем спасибо.
Страницы: 1
Наверх