Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Можно ли из программы Access снять процесс? / 25 сообщений из 28, страница 1 из 2
10.01.2015, 17:04
    #38851302
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Есть такая проблема.
При работе программа использует объект Excel для загрузки данных из книг Excel.
Код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    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-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
10.01.2015, 17:30
    #38851312
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
...
Рейтинг: 0 / 0
10.01.2015, 17:33
    #38851314
nord-woolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
XL.Quit
?
...
Рейтинг: 0 / 0
10.01.2015, 23:28
    #38851416
гурД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Joss,

Nothing - вы освобождаете место на диске, зарезервированное (объектной) переменной; Close - то ли прекращаете (под)процесс ресурса, взятого непосредственно в Access из Excell, то ли напрямую экземпляра Excell (точно не помню).
Собственно Excell - это исполняющийся программный код, - то есть (основной) процесс, стоящий в очереди на исполнение. Чтобы вообще не было процессов Excell - то да:
авторXL.Quit
...
Рейтинг: 0 / 0
10.01.2015, 23:31
    #38851419
гурД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Ну то есть закрывать программу, которая, если открыта, - то это по любому процесс
...
Рейтинг: 0 / 0
10.01.2015, 23:35
    #38851422
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Буду проверять. Но только в понедельник. Программа на работе.
...
Рейтинг: 0 / 0
11.01.2015, 00:10
    #38851446
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
JossКод
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    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



Логика этого кусочка кода показалась мне довольно странной. Может оно на самом деле всё проще (а может и показалось :) )
...
Рейтинг: 0 / 0
11.01.2015, 00:21
    #38851449
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
nord-woolf,

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

А то я такую ссылку дал, что если тупо Notepad.exe поменять на EXCEL.EXE
то у всей конторы закроется эксель... во прикол будет... нужно будет де нить юзнуть втихаря в людном месте...
...
Рейтинг: 0 / 0
12.01.2015, 10:05
    #38851945
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Обломс. Вставил XL.Quit - ничего не получилось..
Код: vbnet
1.
2.
3.
4.
...
   XL.ActiveWindow.Close SaveChanges:=False
   XL.Quit
   Set XL = Nothing

Процесс по прежнему висит в системе плак...плак... плак...
...
Рейтинг: 0 / 0
12.01.2015, 10:09
    #38851949
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Закрываю полностью задачу вместе с Access. Процесс всё равно висит в списке...
...
Рейтинг: 0 / 0
12.01.2015, 11:24
    #38852035
interesno5
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Joss,
Вот тут тоже была похожая проблема http://club.directum.ru/post/Postroenie-otchjotov-Reshenie-problemy-s-zavisaniem-processov-Excel.aspx

Странно, че-то я не смог зайти как обычно на форум, пришлось с заду...
...
Рейтинг: 0 / 0
12.01.2015, 11:39
    #38852062
\\\\
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
guest_rusimportJossКод
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    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. Хотя... может не весь код приведён...

Предложение. Написать весь код с объявлением объектов и приведением типов. Потом уже сократить и отключить...
...
Рейтинг: 0 / 0
12.01.2015, 14:51
    #38852284
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
\\\\guest_rusimportпропущено...

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

Предложение. Написать весь код с объявлением объектов и приведением типов. Потом уже сократить и отключить...Я просто дорабатываю чужую программу. Разработчик указал снятие защиты и я его оставил. Я не проверял, как данные будут считываться при установленной защите. Возможно, что она ни на что и не влияет. А может и влияет. Нужна проверка. Сейчас произведу.
...
Рейтинг: 0 / 0
12.01.2015, 15:06
    #38852307
Bryk_Alien
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Убийство:
яваскриптик
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
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();
}

...
Рейтинг: 0 / 0
12.01.2015, 17:26
    #38852473
osmor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Joss\\\\пропущено...

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

Предложение. Написать весь код с объявлением объектов и приведением типов. Потом уже сократить и отключить...Я просто дорабатываю чужую программу. Разработчик указал снятие защиты и я его оставил. Я не проверял, как данные будут считываться при установленной защите. Возможно, что она ни на что и не влияет. А может и влияет. Нужна проверка. Сейчас произведу.
Может отказаться от DoCmd.TransferSpreadsheet acImport и заменить его на CopyFromRecordset ?
Есть подозрение, что проблема именно в совместном использовании.
...
Рейтинг: 0 / 0
12.01.2015, 17:30
    #38852482
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
osmorМожет отказаться от DoCmd.TransferSpreadsheet acImport и заменить его на CopyFromRecordset ?
Есть подозрение, что проблема именно в совместном использовании.Попробую.
...
Рейтинг: 0 / 0
12.01.2015, 17:48
    #38852496
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
JossКод
Код: vbnet
1.
2.
3.
    Dim XL As Object
   Set XL = CreateObject("excel.application")
   XL.Workbooks.Open MyFile

А если попробовать открыть с параметром только для чтения ReadOnly ?
...
Рейтинг: 0 / 0
13.01.2015, 15:33
    #38853271
energy75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Конечно лучше правильно закончить работу макроса, чем применять костыли.

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

Поэтому, мож пригодиться:
1.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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.
Код: vbnet
1.
2.
3.
4.
Public Sub killTask()
killString = "taskkill /F /IM excel.exe"
Call Shell(killString, vbHide)
End Sub



Ну и чуть для других потребностей:
3.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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
...
Рейтинг: 0 / 0
13.01.2015, 15:53
    #38853308
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Прогер_самоучкаА если попробовать открыть с параметром только для чтения ReadOnly ?

Не влияет.
Пока тупо прицепил перед выходом из подпрограммы
Код: vbnet
1.
Shell("TASKKILL /F /IM Excel.exe /T")

Если открыто несколько процессов Excel, то вырубаются все. Надо или предупреждать пользователей об этой особенности, либо попробовать узнать PID создаваемого процесса и убивать конкретно его.

Это костыли и как образец программирования не годится. Меня просто загнали в угол сроками. Но разобраться надо.
...
Рейтинг: 0 / 0
13.01.2015, 17:46
    #38853468
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Joss,
совет на авось, но вдруг. Завершить "все дела" с объектом и только потом
Код: vbnet
1.
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"
...
Рейтинг: 0 / 0
13.01.2015, 23:14
    #38853669
гурД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
JossОбломс. Вставил XL.Quit - ничего не получилось..
Код: vbnet
1.
2.
3.
4.
...
   XL.ActiveWindow.Close SaveChanges:=False
   XL.Quit
   Set XL = Nothing

Процесс по прежнему висит в системе плак...плак... плак...
Вызванный вами процесс вы закрыли (это легко проверить, справляясь в диспетчер задач). Возможно, висят другие аналогичные: автозагрузку, планировщик не смотрели?
...
Рейтинг: 0 / 0
14.01.2015, 08:38
    #38853766
interesno5
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
...
Рейтинг: 0 / 0
14.01.2015, 09:38
    #38853804
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
гурДJossОбломс. Вставил XL.Quit - ничего не получилось..
Код: vbnet
1.
2.
3.
4.
...
   XL.ActiveWindow.Close SaveChanges:=False
   XL.Quit
   Set XL = Nothing


Процесс по прежнему висит в системе плак...плак... плак...
Вызванный вами процесс вы закрыли (это легко проверить, справляясь в диспетчер задач). Возможно, висят другие аналогичные: автозагрузку, планировщик не смотрели?он, он... была такая же история.
...
Рейтинг: 0 / 0
16.01.2015, 14:36
    #38856189
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Прогер_самоучкаJoss,
совет на авось, но вдруг. Завершить "все дела" с объектом и только потом
Код: vbnet
1.
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"

Стоит попробовать. Но уже на следующей неделе.
...
Рейтинг: 0 / 0
16.01.2015, 15:06
    #38856241
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли из программы Access снять процесс?
Прогер_самоучкаJoss,
совет на авось, но вдруг. Завершить "все дела" с объектом и только потом
Код: vbnet
1.
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"


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

Если использовать команду
Код: vbnet
1.
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "22_temp_plan", MyFile, , "A13:N700"

после того, как закрыт объект Excel, то всё проходит на ОТЛИЧНО !!!
Вешал программу, аналогичную диспетчеру задач поверх всех окон запускал свою подпрограмму сначала пошагово, а потом без остановок. Хорошо видно, как сначала появляется процесс, а потом удаляется. Прокрутил раз 5 со всеми вариантами. Всё закрывается.

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

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

Примечание. Наличие защиты на листе Excel не влияет на возможность импорта информации оператором DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9 в базу данных
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Можно ли из программы Access снять процесс? / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]