Excel это не сложно

Основные форумы => Вопросы по Excel и VBA => Тема начата: artemas от 22.04.2014, 10:52:09



Название: как не запускать несколько процессов excel?
Отправлено: artemas от 22.04.2014, 10:52:09
Добрый день
Подскажите пожалуйста:
Программа Microsoft Dynamics при экспорте данных в excel с каждой операцией, создаваемую новую книгу открывает в новом процессе.
Как сделать так, чтобы файлы открывались в одном процессе excel и других не запускалось? Видимо нужно что изменить в реестре?
win7-64, excel 2007
Спасибо.


Название: Re:как не запускать несколько процессов excel?
Отправлено: RAN от 22.04.2014, 22:14:16
Зачем в реестре?
Изменить в Microsoft Dynamics будет необходимо и достаточно.


Название: Re:как не запускать несколько процессов excel?
Отправлено: Юрий М от 22.04.2014, 22:49:12
Котяра, это где? )


Название: Re:как не запускать несколько процессов excel?
Отправлено: RAN от 22.04.2014, 23:08:08
Что значит "Где"?
Лезешь в программу "Microsoft Dynamics" и там где нужно, там и правишь.
Рыбка не помогает?  ;D

Можешь в файнридер залезть...


Название: Re:как не запускать несколько процессов excel?
Отправлено: RAN от 22.04.2014, 23:15:08
Не попал в предыдушее сообщение, но файнридер то же каждый файл в новый процесс кидает...


Название: Re:как не запускать несколько процессов excel?
Отправлено: Юрий М от 22.04.2014, 23:22:01
Про Microsoft Dynamics вообще впервые слышу ((


Название: Re:как не запускать несколько процессов excel?
Отправлено: artemas от 23.04.2014, 15:07:25
В dax этого не настроить. Нужен вариант с настройкой именно на персональной машине.
Может кто то подскажет? Видимо не один dax запускает дубли процессов excel.


Название: Re:как не запускать несколько процессов excel?
Отправлено: Дмитрий Щербаков(The_Prist) от 23.04.2014, 15:14:06
artemas, тут дело такое...Если программа написана таким образом, что она для создания новой книги создает новый экземпляр приложения и никак это не настроить из интерфейса программы - 99%, что это вообще не настроить. Из Excel Вы этого точно не сделаете. Полагаю, что имеет смысл задать вопрос на форуме по Microsoft Dynamics.


Название: Re:как не запускать несколько процессов excel?
Отправлено: artemas от 24.04.2014, 18:24:09
Я правильно понимаю, что через реестр никак не сделать? Как то можно ведь запретить запуск копий программы?
В любом случае, спасибо за помощь :)


Название: Re:как не запускать несколько процессов excel?
Отправлено: artemas от 24.04.2014, 18:30:41
вот они где запускаются


Название: Re:как не запускать несколько процессов excel?
Отправлено: doober от 25.04.2014, 11:01:44
artemas ,ничего вы с этим не сделаете.
Например,пишу я приложение,которое создает файл Excel.
Зачем мне гембель на голову в поисках уже запущеного экземпляра Excel.
Я создам новый и буду работать с ним.
Я  еще не встречал реализации,которую вы хотите получить.


Название: Re:как не запускать несколько процессов excel?
Отправлено: artemas от 25.04.2014, 11:14:03
ок!
Тогда такой вопрос
этим макросом я закрываю все ненужные мне книги без сохранения.
Код: (vb)
Sub ЗАКРЫТЬ()

Dim oWb As Workbook
    For Each oWb In Workbooks
        Select Case oWb.Name
        Case "PERSONAL.XLS"
            'Ваши действия с этой книгой
        Case "КПДТ_ALL_11.xls"
            'Ваши действия с этой книгой       
        Case "проверка_1403.xls"
            'Ваши действия с этой книгой       
        Case Else
            'Если имя не входит в перечисленные выше
            oWb.Close False
        End Select
    Next oWb
   
   
End Sub

Однако они запущенны в одном процессе с PERSONAL.XLS
Все остальные процессы по этому макросу записанному в PERSONAL.XLS не закрываются естественно.
Помогите пожалуйста дописать код, чтобы и другие процессы закрывались без сохранения, а оставались только книги из первого процесса.
спасибо


Название: Re:как не запускать несколько процессов excel?
Отправлено: doober от 25.04.2014, 23:39:36
Код взял здесь (http://social.msdn.microsoft.com/Forums/office/en-US/e3e99712-01a7-483e-bf0e-52bb1f94889c/how-to-use-accessibleobjectfromwindow-api-in-vba-to-get-excel-application-object-from-excel?forum=exceldev),модеренизировал под вашу задачу

Код: (vb)
Option Explicit
Private Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" _
        (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _
         ByVal lpsz2 As String) As Long
Private Declare Function IIDFromString Lib "ole32" _
        (ByVal lpsz As Long, ByRef lpiid As GUID) As Long
Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
        (ByVal hWnd As Long, ByVal dwId As Long, ByRef riid As GUID, _
         ByRef ppvObject As Object) As Long
        
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type
Private Const S_OK As Long = &H0
Private Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
Private Const OBJID_NATIVEOM As Long = &HFFFFFFF0

Sub Терминатор()
Dim i As Long
Dim hWinXL As Long
Dim xlApp As Excel.Application
Dim oWb As Excel.Workbook
    hWinXL = FindWindowEx(0&, 0&, "XLMAIN", vbNullString)
    While hWinXL > 0
        i = i + 1
        If GetXLapp(hWinXL, xlApp) Then
           For Each oWb In xlApp.Workbooks
                
        Select Case oWb.Name
        Case "PERSONAL"
            'Ваши действия с этой книгой
        Case "КПДТ_ALL_11"
            'Ваши действия с этой книгой
        Case "проверка_1403"
            'Ваши действия с этой книгой
        Case Else
            'Если имя не входит в перечисленные выше
            oWb.Close False
        End Select
                
                
            Next
        End If
        hWinXL = FindWindowEx(0, hWinXL, "XLMAIN", vbNullString)
    Wend
    
End Sub


Function GetXLapp(hWinXL As Long, xlApp As Excel.Application) As Boolean
Dim hWinDesk As Long, hWin7 As Long
Dim obj As Object
Dim iid As GUID
    
    Call IIDFromString(StrPtr(IID_IDispatch), iid)
    hWinDesk = FindWindowEx(hWinXL, 0&, "XLDESK", vbNullString)
    hWin7 = FindWindowEx(hWinDesk, 0&, "EXCEL7", vbNullString)
    If AccessibleObjectFromWindow(hWin7, OBJID_NATIVEOM, iid, obj) = S_OK Then
        Set xlApp = obj.Application
        GetXLapp = True
    End If
End Function


Название: Re:как не запускать несколько процессов excel?
Отправлено: artemas от 29.04.2014, 13:40:57
Спасибо
а этот код нужно скопировать в модуль PERSONAL.XLS?
и потом вызывать макрос Терминатор? Или как то ещё?
Не работает что то. Расширения книг (.xls) не нужно указывать?
а то PERSONAL.XLS закрылся, остальное как было - осталось.