Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Есть такая проблема.
При работе программа использует объект Excel для загрузки данных из книг Excel.
Код
    Dim XL As Object
   Set XL = CreateObject("excel.application")
   XL.Workbooks.Open MyFile
' снятие защиты
   If XL.Worksheets(1).Protect = True Then
      XL.Worksheets(1).Unprotect Password:="xxxxxx"
   End If
   DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"
   XL.ActiveWindow.Close SaveChanges:=False
   Set XL = Nothing

Хотя я делаю и Close и Nothing процесс Excel всё равно остаётся в памяти. Чтоб его снять надо закрыть программу. А это неудобно. Есть ли способ снять процесс из программы VBA?

Понимаю, что тут надо использовать системные вещи, но в этом я не силён.


-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
10 янв 15, 17:04    [17100423]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
vmag
Member

Откуда: MP
Сообщений: 3103
Joss,

http://www.cyberforum.ru/vba/thread488012.html
10 янв 15, 17:30    [17100469]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
nord-woolf
Member

Откуда: And God I know I'm one
Сообщений: 4896
XL.Quit
?
10 янв 15, 17:33    [17100475]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
гурД
Member

Откуда: Присоединённые территории
Сообщений: 327
Joss,

Nothing - вы освобождаете место на диске, зарезервированное (объектной) переменной; Close - то ли прекращаете (под)процесс ресурса, взятого непосредственно в Access из Excell, то ли напрямую экземпляра Excell (точно не помню).
Собственно Excell - это исполняющийся программный код, - то есть (основной) процесс, стоящий в очереди на исполнение. Чтобы вообще не было процессов Excell - то да:
автор
XL.Quit
10 янв 15, 23:28    [17101407]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
гурД
Member

Откуда: Присоединённые территории
Сообщений: 327
Ну то есть закрывать программу, которая, если открыта, - то это по любому процесс
10 янв 15, 23:31    [17101420]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Буду проверять. Но только в понедельник. Программа на работе.
10 янв 15, 23:35    [17101433]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
guest_rusimport
Guest
Joss
Код
    Dim XL As Object
   Set XL = CreateObject("excel.application")
   XL.Workbooks.Open MyFile
' снятие защиты
   If XL.Worksheets(1).Protect = True Then
      XL.Worksheets(1).Unprotect Password:="xxxxxx"
   End If
   DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"
   XL.ActiveWindow.Close SaveChanges:=False
   Set XL = Nothing


Логика этого кусочка кода показалась мне довольно странной. Может оно на самом деле всё проще (а может и показалось :) )
11 янв 15, 00:10    [17101550]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
vmag
Member

Откуда: MP
Сообщений: 3103
nord-woolf,

Наверно да...
nord-woolf
XL.Quit


А то я такую ссылку дал, что если тупо Notepad.exe поменять на EXCEL.EXE
то у всей конторы закроется эксель... во прикол будет... нужно будет де нить юзнуть втихаря в людном месте...
11 янв 15, 00:21    [17101577]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Обломс. Вставил XL.Quit - ничего не получилось..
...
   XL.ActiveWindow.Close SaveChanges:=False
   XL.Quit
   Set XL = Nothing
Процесс по прежнему висит в системе плак...плак... плак...
12 янв 15, 10:05    [17104419]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Закрываю полностью задачу вместе с Access. Процесс всё равно висит в списке...
12 янв 15, 10:09    [17104434]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
interesno5
Guest
Joss,
Вот тут тоже была похожая проблема http://club.directum.ru/post/Postroenie-otchjotov-Reshenie-problemy-s-zavisaniem-processov-Excel.aspx

Странно, че-то я не смог зайти как обычно на форум, пришлось с заду...
12 янв 15, 11:24    [17104829]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
\\\\
Guest
guest_rusimport
Joss
Код
    Dim XL As Object
   Set XL = CreateObject("excel.application")
   XL.Workbooks.Open MyFile
' снятие защиты
   If XL.Worksheets(1).Protect = True Then
      XL.Worksheets(1).Unprotect Password:="xxxxxx"
   End If
   DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"
   XL.ActiveWindow.Close SaveChanges:=False
   Set XL = Nothing


Логика этого кусочка кода показалась мне довольно странной. Может оно на самом деле всё проще (а может и показалось :) )

Действительно, зачем эти телодвижения со снятием защиты? Файл то не сохрняется, а то что в процессе висит ни как не используется в DoCmd. Хотя... может не весь код приведён...

Предложение. Написать весь код с объявлением объектов и приведением типов. Потом уже сократить и отключить...
12 янв 15, 11:39    [17104929]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
\\\\
guest_rusimport
пропущено...

Логика этого кусочка кода показалась мне довольно странной. Может оно на самом деле всё проще (а может и показалось :) )

Действительно, зачем эти телодвижения со снятием защиты? Файл то не сохрняется, а то что в процессе висит ни как не используется в DoCmd. Хотя... может не весь код приведён...

Предложение. Написать весь код с объявлением объектов и приведением типов. Потом уже сократить и отключить...
Я просто дорабатываю чужую программу. Разработчик указал снятие защиты и я его оставил. Я не проверял, как данные будут считываться при установленной защите. Возможно, что она ни на что и не влияет. А может и влияет. Нужна проверка. Сейчас произведу.
12 янв 15, 14:51    [17106235]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Bryk_Alien
Guest
Убийство:
+ яваскриптик
var
 WMI,
 SQuery,
 Processes,
 Process,
 WshShell;

var vbCritical = 16;

WshShell = WScript.CreateObject("Wscript.Shell");

try
{
 WMI = GetObject("winMgmts:");
}

catch(e)
{
 if(e != 0)
 {
  Mess = "Ошибка при соединении с WMI";
  WshShell.Popup(Mess, 0, "Закрытие службы рассылки guisend.exe", vbCritical);
  WScript.Quit();
 }
}

SQuery = "SELECT * FROM Win32_Process WHERE Name = 'guisend.exe'";

Processes = new Enumerator(WMI.ExecQuery(SQuery));

while (!Processes.atEnd())
{
 Process = Processes.item();
 try
 {
  Process.Terminate();
 }
 catch(e)
 {
  Mess = "Ошибка при закрытии текущего экземпляра";
  WshShell.Popup(Mess, 0, "Закрытие службы рассылки guisend.exe", vbCritical);
 }
 Processes.moveNext();
}
12 янв 15, 15:06    [17106319]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
osmor
Member

Откуда: hiprog.com
Сообщений: 1172
Joss
\\\\
пропущено...

Действительно, зачем эти телодвижения со снятием защиты? Файл то не сохрняется, а то что в процессе висит ни как не используется в DoCmd. Хотя... может не весь код приведён...

Предложение. Написать весь код с объявлением объектов и приведением типов. Потом уже сократить и отключить...
Я просто дорабатываю чужую программу. Разработчик указал снятие защиты и я его оставил. Я не проверял, как данные будут считываться при установленной защите. Возможно, что она ни на что и не влияет. А может и влияет. Нужна проверка. Сейчас произведу.

Может отказаться от DoCmd.TransferSpreadsheet acImport и заменить его на CopyFromRecordset ?
Есть подозрение, что проблема именно в совместном использовании.
12 янв 15, 17:26    [17107196]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
osmor
Может отказаться от DoCmd.TransferSpreadsheet acImport и заменить его на CopyFromRecordset ?
Есть подозрение, что проблема именно в совместном использовании.
Попробую.
12 янв 15, 17:30    [17107217]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 67035
Joss
Код
    Dim XL As Object
   Set XL = CreateObject("excel.application")
   [b]XL.Workbooks.Open[/b] MyFile
А если попробовать открыть с параметром только для чтения ReadOnly ?
12 янв 15, 17:48    [17107306]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
energy75
Member

Откуда:
Сообщений: 426
Конечно лучше правильно закончить работу макроса, чем применять костыли.

Но бывает, что и без костылей никак...

Поэтому, мож пригодиться:
1.
Public Function Kill_Proc() As Boolean
Dim Proc As Object


Kill_Proc = False
For Each Proc In GetObject("winmgmts:").ExecQuery("Select * from Win32_Proc")
If Proc.Caption Like "EXCEL.EXE" Then
Kill_Proc = True
Proc.Terminate
Exit For
End If
Next
End Function


2.
Public Sub killTask()
killString = "taskkill /F /IM excel.exe"
Call Shell(killString, vbHide)
End Sub


Ну и чуть для других потребностей:
3.
Public Function DetectExcel() As Long
   ' Procedure dectects a running Excel and registers it.
   Const WM_USER = 1024
   Dim hwnd As Long
   ' If Excel is running this API call returns its handle.
   hwnd = FindWindow("XLMAIN", 0)
   If hwnd = 0 Then   ' 0 means Excel not running.
      Exit Function
   Else
      ' Excel is running so use the SendMessage API
      ' function to enter it in the Running Object Table.
     SendMessage hwnd, WM_USER + 18, 0, 0
     DetectExcel = hwnd
   End If
End Function
13 янв 15, 15:33    [17111483]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Прогер_самоучка
А если попробовать открыть с параметром только для чтения ReadOnly ?


Не влияет.
Пока тупо прицепил перед выходом из подпрограммы
Shell("TASKKILL /F /IM Excel.exe /T")
Если открыто несколько процессов Excel, то вырубаются все. Надо или предупреждать пользователей об этой особенности, либо попробовать узнать PID создаваемого процесса и убивать конкретно его.

Это костыли и как образец программирования не годится. Меня просто загнали в угол сроками. Но разобраться надо.
13 янв 15, 15:53    [17111657]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 67035
Joss,
совет на авось, но вдруг. Завершить "все дела" с объектом и только потом
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"
13 янв 15, 17:46    [17112467]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
гурД
Member

Откуда: Присоединённые территории
Сообщений: 327
Joss
Обломс. Вставил XL.Quit - ничего не получилось..
...
   XL.ActiveWindow.Close SaveChanges:=False
   XL.Quit
   Set XL = Nothing
Процесс по прежнему висит в системе плак...плак... плак...

Вызванный вами процесс вы закрыли (это легко проверить, справляясь в диспетчер задач). Возможно, висят другие аналогичные: автозагрузку, планировщик не смотрели?
13 янв 15, 23:14    [17113763]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
interesno5
Guest
Joss,
https://www.sql.ru/forum/852157/programmno-snyat-process
14 янв 15, 08:38    [17114472]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 67035
гурД
Joss
Обломс. Вставил XL.Quit - ничего не получилось..
...
   XL.ActiveWindow.Close SaveChanges:=False
   XL.Quit
   Set XL = Nothing

Процесс по прежнему висит в системе плак...плак... плак...

Вызванный вами процесс вы закрыли (это легко проверить, справляясь в диспетчер задач). Возможно, висят другие аналогичные: автозагрузку, планировщик не смотрели?
он, он... была такая же история.
14 янв 15, 09:38    [17114693]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Прогер_самоучка
Joss,
совет на авось, но вдруг. Завершить "все дела" с объектом и только потом
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"
Стоит попробовать. Но уже на следующей неделе.
16 янв 15, 14:36    [17127982]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Прогер_самоучка
Joss,
совет на авось, но вдруг. Завершить "все дела" с объектом и только потом
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"

Зацепило. Отложил всё и засел за проверку. Результаты проверки

Если использовать команду
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"
после того, как закрыт объект Excel, то всё проходит на ОТЛИЧНО!!!
Вешал программу, аналогичную диспетчеру задач поверх всех окон запускал свою подпрограмму сначала пошагово, а потом без остановок. Хорошо видно, как сначала появляется процесс, а потом удаляется. Прокрутил раз 5 со всеми вариантами. Всё закрывается.

Отсюда вывод: При открытом объекте Excel нельзя использовать команды импорта и экспорта данных из Excel-файлов. (Ну про экспорт я уже написал без проверки. Хотя аналогичная ситуация есть и там. Надо проверить, но пока не доходят руки.)

Большое спасибо Прогеру за идею!

Примечание. Наличие защиты на листе Excel не влияет на возможность импорта информации оператором DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9 в базу данных
16 янв 15, 15:06    [17128253]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Александр Маркин
Member

Откуда: 307cwam.ucoz.ru
Сообщений: 289
Joss,
Модуль.
Option Compare Database
Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal ClassName As String, _
    ByVal WindowName As String) As Long

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, _
    ByVal msg As Long, _
    ByVal Param1 As Long, _
    Param2 As Any) As Long
    
Private Const GetClose = &H10

Function CloseWindow(WindowName)
Dim str As String
str = FindWindow(vbNullString, WindowName)
    If str <> 0 Then
    CloseWindow = SendMessage(str, GetClose, 0, vbNullString)
    End If
End Function


Вызов, например так:
В кавычках Имя файла,
как оно отображается в Диспетчере задач.
CloseWindow ("Microsoft Excel - Проверка Excel.xlsx")


К сообщению приложен файл. Размер - 56Kb
16 янв 15, 19:05    [17130037]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Спасибо за советы, но есть несколько вопросов-замечаний.

Если установлен Windows XP, то там диспетчер задач выглядит иначе, но это так... к слову... А вот то, что процесс может открываться без окна.... Как быть в этом случае? Наверно только по PID их и можно будет различить?

Всем спасибо за советы. Часть проблемы решена (это та, где загрузка из файлов Excel). Осталась та, где выгрузка в файлы Excel. Но как всегда начальство срочно бросило на другую работу. Закончу новую задачу - вернусь к этой. Если опять упрусь во что-то - отпишу.
20 янв 15, 16:11    [17143685]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Можно ли из программы Access снять процесс?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4684
Вот здесь наткнулся на решение своей старой проблемы - закрытие приложений, запущенных из Access и не закрывающихся стандартными методами ( .Quit) VBA - принудительное закрытие приложений Может кому пригодится?
5 окт 18, 12:08    [21696221]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft Access Ответить