Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Почему не уничтожается Excel из памяти? / 5 сообщений из 5, страница 1 из 1
08.10.2004, 14:41:56
    #32730128
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не уничтожается Excel из памяти?
Не могу понять почему после использования объекта Excel.Application, он остается в памяти, коллеги, подскажите в чем может быть дело? Ситуация следующая, есть так называемая главная кнопочная форма, из нее по кнопке вызывается форма экспорта в Excel:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub Button5_Click()
On Error GoTo Err_Button5_Click

  DoCmd.OpenForm "Form2"
  
Exit_Button5_Click:
  Exit Sub

Err_Button5_Click:
  MsgBox Err.Description
  Resume Exit_Button5_Click

End Sub
Из формы экспорта, при нажатии "OK" вызывается процедура экспорта, которая лежит в отдельном модуле Module1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub Button1_Click()
On Error GoTo Err_Button1_Click

  Screen.MousePointer =  11 
  Call QueriesList
  MsgBox Prompt:="Экспорт завершен!"
  DoCmd.Close
  
Exit_Button1_Click:
  Screen.MousePointer =  0 
  Exit Sub

Err_Button1_Click:
  MsgBox Err.Description
  Resume Exit_Button1_Click

End Sub
В модуле 1 при вызове процедуры QueryList происходит следующее: есть некая таблица экспорта, в которой содержатся названия запросов, которые надо экспортировать в эксел. Основываясь на этой таблице в цикле вызывается функция экспотра ExportQuery(...), в которую передается название файла, в который экспортить, название листа, рекордсэт и строка листа, начиная с которой вставлять экспортируемые строки. Module1 выглядит следующим образом:
Код: plaintext
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.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
Option Compare Database
Public xlsApp As Excel.Application

Public Sub RunPrepare(mm As String, yy As String)
 ' некоторая вспомогательная функция, которая вызывается в другом контексте 
End Sub

Public Sub QueriesList()
On Error GoTo Err_QueriesList

  Dim dbs  As DAO.Database
  Dim tdf As DAO.TableDef
  Dim qdf As DAO.QueryDef
  Dim qdfFls As DAO.QueryDef
  Dim fld As DAO.Field
  Dim rst As DAO.Recordset
  Dim rstFls As DAO.Recordset
  Dim epath As String
  Dim last As Integer
  
  Set xlsApp = New Excel.Application
  xlsApp.DisplayAlerts = False
  xlsApp.Visible = True
  
  Set dbs = CurrentDb
  Set qdfFls = dbs.CreateQueryDef("")
  qdfFls.SQL = "SELECT fvalue FROM SysParams WHERE fkey=""exp_path"""
  Set rstFls = qdfFls.OpenRecordset
  epath = rstFls.Fields( 0 )
  rstFls.Close
  
  qdfFls.SQL = "SELECT COUNT(*) FROM SysQuery1"
  Set rstFls = qdfFls.OpenRecordset
    
  Form_Form2.ProgressBar1.Value =  0 
  Form_Form2.ProgressBar1.Min =  0 
  Form_Form2.ProgressBar1.Max = rstFls.Fields( 0 )
  
  rstFls.Close
  
  Set qdfFls = dbs.QueryDefs!SysQuery1
  Set rstFls = qdfFls.OpenRecordset
  
  last =  0 
  rstFls.MoveFirst
  Do While Not rstFls.EOF
    Form_Form2.ProgressBar1.Value = Form_Form2.ProgressBar1.Value +  1 
    Set qdf = dbs.QueryDefs(rstFls.Fields("fquery"))
    Set rst = qdf.OpenRecordset
    last = ExportQuery(epath + rstFls.Fields("ffile"), rstFls.Fields("fsheet"), rst, last)
    rstFls.MoveNext
  Loop
  
Exit_QueriesList:
  xlsApp.Quit
   'Set xlsApp = Nothing 
  Exit Sub
  
Err_QueriesList:
  MsgBox Err.Description
  Resume Exit_QueriesList
  
End Sub

Public Function ExportQuery( _
p_file As String, p_sheet As String, p_rst As DAO.Recordset, Optional p_row As Integer =  0 ) As Integer

On Error GoTo Err_ExportQuery

  Dim xlsWbook As Excel.Workbook
  Dim xlsWsheet As Excel.Worksheet
  Dim fld As DAO.Field
  Dim i, j As Integer
  
  If Dir(p_file) = "" Then
    Set xlsWbook = xlsApp.Workbooks.Add(xlWBATWorksheet)
    Set xlsWsheet = xlsWbook.Worksheets( 1 )
    xlsWsheet.Name = p_sheet
    xlsWsheet.Activate
    i =  1 
  Else
    Set xlsWbook = xlsApp.Workbooks.Open(p_file)
    For Each xlsWsheet In xlsWbook.Worksheets
      If xlsWsheet.Name = p_sheet Then Exit For
    Next
    If xlsWsheet Is Nothing Then
      Set xlsWsheet = xlsWbook.Worksheets.Add
      xlsWsheet.Name = p_sheet
      i =  1 
    Else
      i = p_row +  1 
    End If
    xlsWsheet.Activate
  End If
  
  j =  1 
  For Each fld In p_rst.Fields
    xlsWsheet.Cells(i, j).Select
    Selection.NumberFormat = "@"
    xlsWsheet.Cells(i, j) = fld.Name
    j = j +  1 
  Next
  j =  1 : i = i +  1 
  p_rst.MoveFirst
  Do While Not p_rst.EOF
    For Each fld In p_rst.Fields
      xlsWsheet.Cells(i, j) = fld.Value
      j = j +  1 
    Next
    j =  1 : i = i +  1 
    p_rst.MoveNext
  Loop
  xlsWbook.Close True, p_file

  ExportQuery = i
  
Exit_ExportQuery:
  Exit Function
  
Err_ExportQuery:
  MsgBox Err.Description
  Resume Exit_ExportQuery
  
End Function
Объект xlsApp объявлен глобально в модуле, создается и уничтожается в теле процедуры QueryList, однако строка xlsApp.Quit не приводит к уничтожению объекта, он на самом деле остается в памяти! Из-за чего это происходит, помогите!
...
Рейтинг: 0 / 0
08.10.2004, 14:49:35
    #32730148
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не уничтожается Excel из памяти?
...
Рейтинг: 0 / 0
08.10.2004, 16:37:25
    #32730419
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не уничтожается Excel из памяти?
Спасибо за ссылку, но все равно не понятно! Главная идея из нее, я так понял, что каждый раз после работы с книгой и листом уничтожать эти объекты через присвоение Nothing. Вставил в свой код и все равно - эффект тот же - Эксел сидит в памяти, а выгружается только после закрытия Аксес
...
Рейтинг: 0 / 0
08.10.2004, 16:49:38
    #32730463
Темный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не уничтожается Excel из памяти?
Плохо вставил. Не все закрыл.
...
Рейтинг: 0 / 0
10.10.2004, 13:23:53
    #32731270
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не уничтожается Excel из памяти?
Все-таки причина оказалось не в том, уничтожены ли на последок использовавшиеся листы и книги или нет, все это делается автоматически. Все дело оказывается скрывалось в том, как использовать объект Selection и вообще-то в ссылке, указанной Санычем, об этом говорилось в самом конце топика (я оказался не внимателен). Итог -
конструкция вида:
Код: plaintext
1.
2.
    xlsSheet.Cells(i, j).Select
    xlsApp.Selection.NumberFormat = "@"
работает корректно и после использования Excel, при вызове xlsApp.Quit или Set xlsApp = Nothing, он выгружается из памяти.
Конструкция же вида:
Код: plaintext
1.
2.
    xlsSheet.Cells(i, j).Select
    Selection.NumberFormat = "@"
работает также корректно, НО после использования Excel, так же при вызове xlsApp.Quit или Set xlsApp = Nothing, он НЕ ВЫГРУЖАЕТСЯ из памяти и остается там либо до завершения работы Access, либо пока процесс принудительно не завершить через диспетчер задач например.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Почему не уничтожается Excel из памяти? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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