Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/46: Рейтинг темы: голосов - 46, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 67

После закрытия Excel процесс остается

10.05.2010, 01:41. Показов 9561. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я сразу извеняюсь перед теми, кому покажется этот вопрос ламерским.
Формирую в одной процедуре(клик на кнопку)отчёт в Excel. В этой же процедуре пишу такие строки
Dim oExcel As Excel.Application
Set oExcel = CreateObject('Excel.Application')
... тут идёт заполнение ячеек цифрами и словами и рисование рамок
Set oExcel = Nothing ' последняя строчка
Данные, которые заношу в таблицу Excel забираю из базы Access.
НО!!! При первой оброботке этого события (нажатия на кнопку и формирования отчёта) всё формируется так как надо: и данные где надо центрируються, и у ячеек рамочки рисуются. А когда нажимаешь на кнопку следуюший раз, то получаеться такая фигня:
1. Если я не закрываю окно с Excel от предыдущего отчёта, то отчет формтруеться, но ничего где надо не центрируется и рамки ячеек не рисуються.
2. Если я закрываю окно с Excel то VB пишет ошибку на таком месте
Visual Basic
1
2
3
4
5
6
7
8
9
10
 oExcel.Range('A6:H6').Select
    oExcel.ActiveCell.FormulaR1C1 = 'Смета'
    With oExcel.Selection
        .HorizontalAlignment = xlCenter ' ВОТ ЗДЕСЬ ОСТАНАВЛИВАЕТСЯ
        .VerticalAlignment = xlVAlignCenter
        .WrapText = True
        .Orientation = 0
        .ShrinkToFit = False
        .MergeCells = True
    End With 'Selection
Я посмотрел что в момент остановки Selection = Nothing, хотя я строчкой выше я явно выделил область.

И ещё непонятно почему после закрытия Excel с отчётом в памяти висит oExcel(по Ctrl+Alt+Del, на панеле задач его нет). Я ж явно обнуляю объект oExcel в конце процедуры????????

Заранее благодарен кто откликнется на мой вопрос!!! :-)))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2010, 01:41
Ответы с готовыми решениями:

Не завершается процесс Excel после закрытия приложения
Часто встречался с подобным вопросом, и сам попадал на эти грабли. После завершения приложения Excel, после обработки, процесс всеравно...

Работа с Excel: его процесс висит даже после закрытия программы
Добрый Вечер! Подскажите пожалуйста, пишу программу для обработки Excel файлов но после закрытия моей программы в процессах каждый раз...

Окно остается в памяти после закрытия
Начал изучать основы WinAPI, переписал пример с одной книги, программа просто создает окно. Но после закрытия остается в памяти. Может...

9
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
10.05.2010, 09:52
Чтобы объект экселя не висел в памяти необходимо выполнить такой код:
oExcel.Quit
Set oExcel=Nothing

Но т.к. Вы определяете эксель в процедуре нажатия на кнопку и уничтожаете там же, то объект экселя будет жить пока выполняется процедура. Надо, наверное, определить эксель как глобальную переменную в модуле.
Я делаю так:
В модуле -
Visual Basic
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
'приложение экселя
Public ExcelApp As Excel.Application
Так же описываю процы для управления жизнью экселя и своей проги:
'для опредеделния запущ. экселя
Declare Function FindWindowByClass Lib 'user32' _
Alias 'FindWindowA' (ByVal lpClassName As String, _
ByVal lpWindowName As Long) As Long
 
Public Function IsExcelRunning() As Boolean
Dim lngRetVal As Long
 
lngRetVal = FindWindowByClass('XLMAIN', 0&)
If lngRetVal <> 0 Then
 IsExcelRunning = True
Else
 IsExcelRunning = False
End If
 
End Function
 
'инициализирует (перезапускает эксель в случае повторного использов.)
Public Sub StartExcel(isVisible As Boolean)
Dim wb As Excel.Workbook
 
'checking the Excel status
If IsExcelRunning = False Then
 Set ExcelApp = New Excel.Application
 ExcelApp.Visible = isVisible
Else
 'этот случай возникает только тогда когда
 'перед вызовом этой процедуры эксель был уже запущен пользователем вне
 'этой программы; его не трогаем и создаем новый экземпляр экселя
 If ExcelApp Is Nothing Then
  Set ExcelApp = New Excel.Application
  ExcelApp.Visible = isVisible
  Exit Sub
 Else
  For Each wb In ExcelApp.Workbooks
   wb.Close False
  Next wb
  ExcelApp.Quit
  Set ExcelApp = Nothing
  Set ExcelApp = New Excel.Application
  ExcelApp.Visible = isVisible
 End If
End If
 
End Sub
 
'закрывает Эксель
Public Sub CloseExcel()
Dim wb As Excel.Workbook
 
If IsExcelRunning Then
 If ExcelApp Is Nothing Then
  Exit Sub
 Else
  For Each wb In ExcelApp.Workbooks
   wb.Close False
  Next wb
  ExcelApp.Quit
  Set ExcelApp = Nothing
 End If
End If
 
End Sub
 
'потом пример вызова
'стартуем Эксель
Call StartExcel(True)
 
With ExcelApp
 .Workbooks.Add App.Path & 'XltTimeTable.xlt'
и тд...

Эта методика работает и я юзаю только свой эксель, не зависимо от того запущены ли еще эксели пользователя.
Может что то не так, тогда пусть народ поправит. Буду признателен.
0
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 67
12.05.2010, 21:56  [ТС]
Огромное спасибо за помощь, только у меня ещё один вопросик:
Вот я написал так, как Вы посоветывали, только у меня выдаётся ошибка
на строке:
Visual Basic
1
2
3
Declare Function FindWindowByClass Lib 'user32' _
Alias 'FindWindowA' (ByVal lpClassName As String, _
ByVal lpWindowName As Long) As Long
И пишет такое сообщение:
'Compiler error
Constants,fixed-length string, arrays, user-defined types and Declare statements not allowed as Public members of object moduls'.
Может нужно подключить ещё каку-то библиотеку?? Я к сожаленью не работал ещё с Api функциями, :-(((
Забанее благодарю за помощь...
0
1 / 1 / 0
Регистрация: 03.02.2010
Сообщений: 43
13.05.2010, 12:04
если объявление функции написано в форме, то надо объявить с Private:

Private Declare Function FindWindowByClass Lib 'user32' _
Alias 'FindWindowA' (ByVal lpClassName As String, _
ByVal lpWindowName As Long) As Long

в данный момент по умолчанию у тебя стоит Public

если хочешь, чтобы ф-ция была Public, то помести объявление в модуль
0
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 67
13.05.2010, 23:36  [ТС]
Спасибо, API функцию получилось подключить, только первоначальная проблема осталась. Когда заканчиваю работать с Excel пишу Set oExcel = Nothing. Но после этого в памяти висит Excel до тех пор пока не закрою прогу. Я думал что проблема в этом, т.к. при первой обработке (открывания и записи в Excel) всё получается, но если, не выходя из проги, повторить процедуру, появляються ошибки(открытие Excel проходит нормально, запис в ячейки тоже, а когда начинаю работать с Selection выскакивает ошибка, что ничего не выбрано, но я перед строкой Selection пишу .Range('A7:H8').Select и в Excel я вижу что эти ячейки выбрались). НО даже выгрузка Excelя ручками из памяти перед выполнения повторной процедуры не дало никаких результатов. Взял работающую прогу (другую) в которой тоже исспользуется работа с Excel, там такой код:
Set oExcel = CreateObject('Excel.Application')
oExcel.Workbooks.Open (App.Path & 'Report ' & cRep1)
... запись в Excel и расование рамок
oExcel.Visible = True
Set oExcel = Nothing
End Sub
Так здесь после выполнения предпоследней строки, Excel выгружаеться из памяти . А у меня нет...
Правда отличие в том, что тут открываеться файл, а я создаю новый:
oExcel.Workbooks.Add. Может разница в этом...
Заранее благодарю за помощь....
0
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
14.05.2010, 09:40
Странно, может я че не понимаю, но без вызова метода Excel.Quit эксель будет висеть в памяти, потому что просто вызвав Set Excel=Nothing мы уничтожаем ссылку на объект ЭКселя в нашей проге а сам эксель остается висеть в памяти. Для того, чтобы он выгрузился надо юзать метод Quit.
0
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 67
15.05.2010, 00:58  [ТС]
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public oExcel As New Excel.Application
 
Private Sub Command1_Click()
oExcel.Workbooks.Add
oExcel.Visible = True
    With oExcel
       .ActiveWorkbook.Sheets.Application.Range('A6') = 'Склад'
       .ActiveWorkbook.Sheets.Application.Range('A6').Select
    
       With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlVAlignCenter
        .WrapText = True
        .Orientation = 0
        .ShrinkToFit = False
        .MergeCells = True
      End With 'Selection
    End With
     
    Set oExcel = Nothing
End Sub
Вот код который у меня не работает :-((
НО, если я удаляю строки:
Visual Basic
1
2
3
4
5
6
7
8
      With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlVAlignCenter
        .WrapText = True
        .Orientation = 0
        .ShrinkToFit = False
        .MergeCells = True
      End With 'Selection
то всё работает как надо, т.е. при проходе строки oExcel.Workbooks.Add создаётся в памяти excel.exe, дальше работает всё нормально и после прохода строки 'Set oExcel = Nothing' excel.exe удаляетья из памяти (если конечно мы перед проходом через эту строку ручками закроем Excel, а если не закрыли, то после прохода через эту строку Excel ещё висит в памяти, но если мы его закрываем после прохода через строку, то он и удаляеться из памяти). А когда я добавляю With Selection ... End With, то excel.exe не удаляетья из памяти пока я не выйду из своей проги. А если я нажимаю повторно на кнопку, то на строке
.HorizontalAlignment = xlCenter
выскакивает ошибка (и действительно должно так быть т.к. в это время почему-то Selection = Nothing, хотя я явно его выделяю и в Excelе я вижу что выделелось).

Буду благодарен, если кто-то проверит этот код: будут ли у него так как у меня??? Заранее благодарен...

P.S. Если я не закрываю созданный первоначально (т.е. при первом проходе обработки события кнопки) excel, то при втором нажатии создаётся новый, туда записывается в ячейку 'А6' слово Склад, но свойства, такое ощущения, работают с первым документом Excel
0
1 / 1 / 0
Регистрация: 03.02.2010
Сообщений: 43
17.05.2010, 11:07
обязательно укажи, что Selection относится к твоему приложению Excel:
не With Selection
...
End With

а
With oExcel.Selection
...
End With
0
Lenivec
23.05.2010, 14:24
Visual Basic
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Function IsExcelLoad() As Boolean
On Error Resume Next
Dim ExcelApp As Object
 
    Set ExcelApp = GetObject(, 'Excel.Application')
    If Err.Number <> 0 Then
        Err.Clear
        IsExcelLoad = False
    Else
        IsExcelLoad = True
        Set ExcelApp = Nothing
    End If
 
End Function
 
Function GetExcelObject() As Object
On Error GoTo Err_Log
 
    If IsExcelLoad Then
        Set GetExcelObject = GetObject(, 'Excel.Application')
    Else
        On Error Resume Next
        Set GetExcelObject = CreateObject('Excel.Application')
        If Err.Number <> 0 Then
            Err.Clear
            Set GetExcelObject = Nothing
            Exit Function
        End If
    End If
 
Exit_Proc:
    Exit Function
Err_Log:
    Resume Exit_Proc
End Function
 
Function NewWorkbook(ExcelApp As Object) As Object
On Error GoTo Err_Log
 
    ExcelApp.Workbooks.Add
    Set NewWorkbook = ExcelApp.activeWorkbook
 
Exit_Proc:
    Exit Function
Err_Log:
    Resume Exit_Proc
End Function
 
Sub main()
Dim o As Object
Dim n As Object
 
    Set o = GetExcelObject()
    o.Visible = True
    Set n = NewWorkbook(o)
    Set o = Nothing
 
End Sub
Советую обратить особое внимание на замечание предыдущего аппонента. Основная причина ИМХО видимо именно в этом.
 Аватар для plohish
5 / 5 / 0
Регистрация: 02.06.2015
Сообщений: 51
11.10.2016, 09:26
Цитата Сообщение от DjinnWalker Посмотреть сообщение
Visual Basic
1
2
3
4
5
'потом пример вызова
'стартуем Эксель
Call StartExcel(True)
With ExcelApp
.Workbooks.Add App.Path & 'XltTimeTable.xlt'
Затыкается на строке
Visual Basic
1
.Workbooks.Add App.Path & 'XltTimeTable.xlt'
"Object variable or With block variable not set"

Добавлено через 3 часа 59 минут
Цитата Сообщение от plohish Посмотреть сообщение
Затыкается на строке
Visual Basic
1
.Workbooks.Add App.Path & 'XltTimeTable.xlt'
"Object variable or With block variable not set"
Разобрался (в моём проекте был модуль с названием "ExcelAPP" не сразу заметил)...теперь всё в порядке, с небольшими доработками код работает неплохо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2016, 09:26
Помогаю со студенческими работами здесь

После закрытия форма остается висеть в памяти
Здравствуйте. Проблема в сабже. Никаких таймеров, все внешние события weak. Но после закрытия память не освобождается, довольно...

Excel остается в памяти. Как убить процесс?
Я пытаюсь открыть и закрыть имеющийся EXCEL файл. Как убить процесс? Мой код не может. Кто-нибудь поправит? Спасибо. vladconn ...

Не убивается процесс после закрытия
Если закрыывать с первой формы то все нормально,а если со второй - процесс project.exe остается не закрытым Вот код второй формы: unit...

Процесс висит после закрытия
Есть небольшой проект, который почему-то не выгружается из процессов после закрытия. Из потоков там есть только БД (но это не точно), но...

После закрытия приложения процесс не завершается
Сделал приложение для работы с HID устройствами. Всё что мне необходимо она выполняет, НО когда нажимаю &quot;Подключиться&quot; событие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru