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

kozakov

0 / 0 / 0

Регистрация: 10.05.2010

Сообщений: 67

1

10.05.2010, 01:41. Показов 8269. Ответов 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



DjinnWalker

1 / 1 / 0

Регистрация: 25.05.2008

Сообщений: 232

10.05.2010, 09:52

2

Чтобы объект экселя не висел в памяти необходимо выполнить такой код:
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



kozakov

0 / 0 / 0

Регистрация: 10.05.2010

Сообщений: 67

12.05.2010, 21:56

 [ТС]

3

Огромное спасибо за помощь, только у меня ещё один вопросик:
Вот я написал так, как Вы посоветывали, только у меня выдаётся ошибка
на строке:

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

4

если объявление функции написано в форме, то надо объявить с 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

 [ТС]

5

Спасибо, 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

6

Странно, может я че не понимаю, но без вызова метода Excel.Quit эксель будет висеть в памяти, потому что просто вызвав Set Excel=Nothing мы уничтожаем ссылку на объект ЭКселя в нашей проге а сам эксель остается висеть в памяти. Для того, чтобы он выгрузился надо юзать метод Quit.



0



kozakov

0 / 0 / 0

Регистрация: 10.05.2010

Сообщений: 67

15.05.2010, 00:58

 [ТС]

7

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

8

обязательно укажи, что Selection относится к твоему приложению Excel:
не With Selection

End With

а
With oExcel.Selection

End With



0



Lenivec

23.05.2010, 14:24

9

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

10

Цитата
Сообщение от 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



 

Djinn

Пользователь

Сообщений: 69
Регистрация: 30.05.2016

#1

07.02.2019 18:10:01

Добрый вечер всем. Какие могут быть причины? Человек сказал, что офис переустанавливал, не помогло. Процесс не завершается при выходе из любой книги — обычной, с макросами, надстройки. Приходится заходить в диспетчер и убивать процесс, чтобы открыть ранее открытие книги, иначе пишет только для чтения.

office 16 x-64 на win 7 x-64

Изменено: Djinn07.02.2019 18:10:52

RRS feed

  • Remove From My Forums
  • Вопрос

  • Здравствуйте!

    Иногда в диспетчере задач остаются незавершенные процессы winword и excel и продолжают потреблять процессор компьютера, хотя на панели задач их нет. В чем может быть причина и как решить проблему?

    MS Office 2007, MS Windows 7 Pro sp1

Все ответы

  • Добрый день.

    Задайте свой вопрос на форумах
    Answers


    Я не волшебник, я только учусь
    MCP, MCTS, CCNA. Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку «Предложить как ответ» или «Проголосовать за полезное сообщение». Мнения, высказанные здесь, являются отражением моих личных
    взглядов, а не позиции работодателя. Вся информация предоставляется как есть без каких-либо гарантий.
    Блог IT Инженера, IT Reviews,
    Twitter.

  • Здравствуйте!

    Иногда в диспетчере задач остаются незавершенные процессы winword и excel и продолжают потреблять процессор компьютера, хотя на панели задач их нет. В чем может быть причина и как решить проблему?

    MS Office 2007, MS Windows 7 Pro sp1

    Причиной могут быть открытые документы MS Office в других приложениях (Internet Explorer, например). В этих случаях приложения MS Office работают как серверы COM (по-старому — OLE), обеспечивая фактическое отображение документов
    для этих приложений.


    Слава России!

    • Изменено

      8 февраля 2017 г. 16:08

  • Так всё закрыто на панели задач, а процесс в диспетчере есть.

  • Любая установка чего то у нас на компьютерах строжайше запрещена. Даже если кто-то что-то позволил себе, то это был бы единичный случай. Данная проблема возникала уже десятки раз у разных пользователей. Никаких add-ins у них нет и быть не может.

    • Изменено
      Minfin RO
      10 февраля 2017 г. 5:52

  • Victor Ivanidze, я побродил  по ссылкам, начиная с вашей, которую вы прислали и набрел на такую вещь —
    Fast closing Windows Explorer and Word, imediately one after another
    (first Windows Explorer and then Word) leaves WINWORD.EXE process running.  По-моему это то самое, что у меня! Потому что у нас многие пользователи так делают!

    Спасибо вам за первотолчок! Буду теперь думать как заставить пользователей не пользоваться этой функцией

  • Использовал эту статью — http://winlined.ru/articles/nastrojka_paneli_predvaritelnogo_prosmotra_v_provodnike_windows_vista.php

    Отключил у всех пользователей возможность просмотра документов. Посмотрю будут ли появляться зависшие процессы.

  • Тоже была эта проблема. Причем документ, с которым выполнялась работа до закрытия word, оставался занят и повторно его можно было открыть только на чтение (если вручную winword из процессов не удалить). Как я понял, проблема
    в эксплорере, а именно, в панели предварительного просмотра. Помогло  следующее «панель управления->свойства папок->вид->восстановить умолчания». 

для распечатки документов создаю новый документ Excel

excelApplication = new Excel.Application();
excelApplication.DisplayAlerts = true;
excelApplication.WindowState = Excel.Enums.XlWindowState.xlMaximized;
excelApplication.Visible = true;

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

excelApplication.Quit();
excelApplication.Dispose();

то в диспетчере задач все ок, но мне нужно чтобы пользователь работал с документом.


  • Вопрос задан

    более трёх лет назад

  • 3857 просмотров

Пригласить эксперта

Очевидно если программу не закрыть она останется незакрытой. Вы создаете процесс программно, поэтому пользовательское «закрытие» для него ничего не значит, он ждет пока ему пошлют програмно команду закрытия. Как вариант можно попробовать определить признак того что пользователь закрыл и после завершать программно, или открывать excel другим способом, например через Process

Вот вы написали, чтобы закрыть программу, вот это:

excelApplication.Quit();
excelApplication.Dispose();

А вы не думали, что эти два метода отдельно друг от друга тоже что-то означают? :)

Quit означает выход из программы. Это — именно то, чего вы желаете избежать — чтобы позволить пользователю сделать это самостоятельно. А вот Dispose означает освобождение канала управления. Попробуйте вызвать Dispose, не вызывая Quit.


  • Показать ещё
    Загружается…

16 апр. 2023, в 20:27

15000 руб./за проект

16 апр. 2023, в 19:32

80000 руб./за проект

16 апр. 2023, в 18:58

2000 руб./за проект

Минуточку внимания

Содержание

  1. Активный процесс Excel продолжает выполняться после использования макроса VBA для программного выхода из Excel
  2. Симптомы
  3. Причина
  4. Обходной путь
  5. Microsoft Office Excel 2007
  6. Microsoft Office Excel 2003
  7. Дополнительная информация
  8. Excel после закрытия остается процесс

Активный процесс Excel продолжает выполняться после использования макроса VBA для программного выхода из Excel

Симптомы

При запуске макроса Microsoft Visual Basic для приложений (VBA) для программного выхода из Microsoft Excel Excel excel закрывается должным образом. Однако активный процесс Excel продолжает выполняться.

Такое поведение может произойти, даже если макрос VBA выполняет следующие функции:

  • Закрывает все открытые книги
  • Вызов метода Quit для выхода из Excel
  • Задает для объекта Excel значение nothing

Причина

Это может произойти, если выполняются следующие условия:

  • Надстройка COM устанавливается в Excel.
  • Надстройка COM назначает ссылку на элемент Excel или Excel глобальному объекту.

Например, известно, что такое поведение происходит при установке средства поиска Google Desktop в Excel. Дополнительные сведения о средстве поиска Google Desktop см. на следующем веб-сайте Google:

Обходной путь

Чтобы обойти эту проблему, удалите надстройку COM в Excel. Для этого выполните следующие действия в соответствии с версией Excel, которую вы используете.

Microsoft Office Excel 2007

  1. Нажмите кнопку Microsoft Office и выберите пункт » Параметры Excel».
  2. Щелкните «Надстройки».
  3. Щелкните надстройки Excel в поле «Управление«, а затем нажмите кнопку «Перейти».
  4. В диалоговом окне «Надстройки» установите флажок для надстроек, которые, как известно, вызывают такое поведение.
  5. Нажмите кнопку ОК.

Microsoft Office Excel 2003

  1. В меню «Сервис » щелкните «Надстройки».
  2. В диалоговом окне «Надстройки» установите флажок для надстроек, которые, как известно, вызывают такое поведение.
  3. Нажмите кнопку ОК.

Дополнительная информация

Контактные данные сторонних организаций предоставлены в этой статье с целью помочь пользователям получить необходимую техническую поддержку. Эти данные могут быть изменены без предварительного уведомления. Корпорация Майкрософт не дает гарантий относительно правильности приведенных контактных данных сторонних производителей.

В этой статье упомянуты программные продукты независимых производителей. Корпорация Майкрософт не дает никаких явных, подразумеваемых и прочих гарантий относительно производительности или надежности этих продуктов.

Источник

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

Создаю объект:
Excel:= CreateOleObject(«Excel.Application»);
Excel.WorkBooks.Open(NameFileExl);
Excel.Visible:=True;

Закрываю приложение EXCEL стандартным способом, смотрю в «Диспетчере» — процесс остается висеть.

Сколько раз запускаю программу — столько процессов создается.
Как их не плодить? Или хотя бы как их программно убивать?


Суслик © ( 2004-12-10 18:13 ) [1]


VMcL © ( 2004-12-10 18:19 ) [2]

Если под стандартным способом понимается нажатие на крестике, то см. [1] + Excel := Unassigned;


DiamondShark © ( 2004-12-10 18:27 ) [3]

Если эксель закрыть, когда в программе есть ссылка на него (или на любой вложенный объект), то да, процесс экселя остаётся.
Но он завершается как только освободить все ссылки на него.

Остаться «висеть» он может только в одном случае: если приложение завершено некорректно и ссылки не были правильно освобождены.


Leonid Troyanovsky ( 2004-12-10 20:13 ) [4]

> DiamondShark © (10.12.04 18:27) [3]
> Неправда.

Чья неправда?
Твои доводы не противоречат ни одному из
3 вышеидущих утверждений.


> Закрываю приложение EXCEL стандартным способом, смотрю
> в «Диспетчере» — процесс остается висеть.

Я тоже смотрю. пусто 😉


DiamondShark © ( 2004-12-10 20:44 ) [6]


> Leonid Troyanovsky (10.12.04 20:13) [4]

И как мне теперь с этим жить?


Leonid Troyanovsky ( 2004-12-10 21:11 ) [7]


> DiamondShark © (10.12.04 20:44) [6]
> И как мне теперь с этим жить?

Как положено. Указать чья неправда,
чего словами просто так кидаться.


GuAV © ( 2004-12-10 21:12 ) [8]

если Excel — глобальноная переменная то Excel := Unassigned; , если локальная, то не знаю даже чего так.


DiamondShark © ( 2004-12-10 21:13 ) [9]


> Leonid Troyanovsky (10.12.04 21:11) [7]

Неправда, что плодятся.
Не плодятся, а запускаются ровно столько, сколько нужно.
Вот.

2 DiamondShark

> Если эксель закрыть, когда в программе есть ссылка на
> него (или на любой вложенный объект), то да, процесс
>экселя остаётся.
> Но он завершается как только освободить все ссылки на
> него.

Что Вы имеете ввиду под словом «ссылка»?Подробнее плз.


DiamondShark © ( 2004-12-10 21:19 ) [11]


> GanibalLector © (10.12.04 21:14) [10]

А самому в словарь заглянуть?

ссылка — значение, уникально идентифицирующее объект или переменную во время выполнения;

Подробнее, извиняюсь, не могу: подробный ликбез денег стоит.


GanibalLector © ( 2004-12-10 21:26 ) [12]

Кстати,только что поигрался с глоб.локальными переменными для такого кода.

XLApp:=CreateOleObject(«Excel.Application»);
XLApp.Visible:=true;
XLApp.WorkBooks.Open(«C:test.xls»);
XLApp.WorkBooks[1].WorkSheets[1].Name:=»test ;)»;
XLApp.WorkBooks[1].Sheets[1].Cells[3,2]:=»GanibalLector»;

так вот,если XLApp локальная,то после закрытия Excel его процесс сразу уничтожается,а если глобальная,то висит до закрытия программы.
З.Ы.Чудеса,однако. никогда б не подумал


GanibalLector © ( 2004-12-10 21:35 ) [13]

А если использовать глобально XLApp и в конец кода добавить XlApp:=Unassigned то тоже процесс умирает.
З.Ы.Вроде разобрались 😉


GuAV © ( 2004-12-10 21:43 ) [14]

GanibalLector © (10.12.04 21:26) [12]
З.Ы.Чудеса,однако. никогда б не подумал

И где чудеса ? Честно никогда не использовал глобальные XLи. Просто знаю что варианты как строки иницилизируются Unassigned и финализируются при выходе из области видимости.

Пишет автор вопроса.
Да, переменная Excel у меня глобальная, но объявляется не в главном модуле, а в другом, связанным с главным по uses.
Excel:=UnAssigned прописано в главном на закрытие формы.
С вашей помощью нашла 2 выхода:
1. Перенести объявление Exсel: OleVariant; на главную форму.
2. Сделать Exсel локальной.

Оба работают, всем спасибо!

Но, чтобы расставить все точки над «и»:
Так и не поняла — почему я не могу очистить глобальную переменную, объявленную в связанном модуле, из главного?

И еще. Советы типа Excel.Quit;
Зачем нужна эта команда (пользователь ведь сам должен определить, когда закрыть файл) и на какое событие ее назначать?


aus ( 2004-12-11 13:59 ) [16]

>Так и не поняла — почему я не могу очистить глобальную переменную, объявленную в связанном модуле, из главного?

Глобальную переменную можно использовать в любом модуле (и «очистить» в том числе).
А как ты определяешь, какой модуль главный, а какой связанный?


Ольга ( 2004-12-11 14:02 ) [17]

Главным я назвала тот, к которому привязано приложение через Main Form


aus ( 2004-12-11 14:19 ) [18]

Назови его как хочешь, он главнее не станет, они вполне равноправны.
Но это уже не по теме вопроса.


Digitman © ( 2004-12-11 14:29 ) [19]

видишь ли, каждый модуль имеет раздел interface

если ты объявишь некий идентификатор в этом разделе, то все прочие модули будут «видеть» этот идентификатор и будут способны его использовать, если сошлются на него в uses одного из своих разделов

чаще говорят, что «идентификатор, объявленный в разделе interface некоего модуля, имеет глобальную область видимости для всех модулей данного проекта»


GuAV © ( 2004-12-11 14:48 ) [20]

Ольга (11.12.04 13:42) [15]
Так и не поняла — почему я не могу очистить глобальную переменную, объявленную в связанном модуле, из главного?

Код «не-главного» модуля в студию. И заодно, что происходит при выходе из приложения.

Завершение процесса должно происходить в финализации модуля, где объявлен Excel, или на строке Excel := Unassigned;


Ольга ( 2004-12-12 11:18 ) [21]

По просьбе уважаемого GuAV Привожу листинги 2 модулей.

Unit Main Form:
unit Main;

uses
Windows, Messages, SysUtils, Classes, Graphics, ontrols, Forms, Dialogs, Db, ADODB, Grids, DBGrids, StdCtrls, ExtCtrls, ComCtrls, Buttons, ToolWin, Menus, Variants, Excel2000;

type
TFMain = class(TForm)
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
.

var
FMain: TFMain;

procedure TFMain.SpeedButton2Click(Sender: TObject);
begin
FormReport;
end;

procedure TFMain.SpeedButton1Click(Sender: TObject);
begin
Close;
Excel:=Unassigned;
end;

Unit Report Form:

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus, Db, ADODB, Grids, DBGrids, ComCtrls, ComObj, ActiveX, Excel2000, Variants, idGlobal;

var
Excel, Sheet: Variant;
procedure FormReport;

procedure FormReport;
begin
DecodeDate(rabdate,y,m,d);
Try
Excel:= CreateOleObject(«Excel.Application»);
Excel.WorkBooks.Open(«c:tmp1.xls»);
except
Excel.Quit;
Excel:=UnAssigned;
end;
Excel.DisplayAlerts:=False;
Excel.SheetsInNewWorkBook:=1;
Sheet:=Excel.ActiveWorkBook.WorkSheets[1];
Sheet.Cells[4, 2]:= DateToStr(rabdate);
.
Excel.Visible:=True;
end;

Так где здесь косяк?


Piter © ( 2004-12-12 13:14 ) [22]

Нету никакого косяка, но после того как окошко Excel»а появилось:

Ольга (12.12.04 11:18) [21]
Excel.Visible:=True;

какие проблемы? Это окошко нужно закрыть крестиком, чтобы не было процесса!

Или у тебя код просто не доходит до Excel.Visible:=True. Что такое отладчик знаем?


Суслик © ( 2004-12-12 13:28 ) [23]

я бы еще посветовал сделать Excel.UserControl := True; рядом с visible := true

Атрибут UserControl весьма загадочен. Его роль не совсем соответствует описанию. В частности _иногда_ если создать файл excel, сохранить и оставить открытым, то если из explor открыть сохраненный файл, то оба окна ексель (и новое и то, где октрыт исходный файл) становятся невидимыми и снять их можно только через список задач. Данная особенность исправлялась только UserControl := True. Почему? Не знаю — из документации это не следует.


GuAV © ( 2004-12-12 14:06 ) [24]

Ольга (12.12.04 11:18) [21]

Ошибку у меня повторить не получилось. (D7, Office XP SP2) Завершение XL происходит в фиинализации Excel и Sheet.

Так, если выходить через ExitProcess, то процесс остаётся в памяти, но если добавить Excel:=Unassigned; Sheet:=Unassigned; то не остаётся.

Нужно искать или причину невыполнения финализации
Report; или место где затираются Excel и Sheet. В приведенном коде этого нет.

В коде есть другая ошибка.

> Try
> Excel:= CreateOleObject(«Excel.Application»);
> Excel.WorkBooks.Open(«c:tmp1.xls»);
> except
> Excel.Quit;
> Excel:=UnAssigned;
> end;

Что Вы хотели добиться такой обработкой исключения ?
В случае исключения (например нет файла) оно будет обработано и следущий после этого код будет выполнен, хотя XL уже закрыт.


Ольга ( 2004-12-13 10:21 ) [25]

Источник

Like this post? Please share to your friends:
  • При задании формулы следует соблюдать правила в excel
  • При задании типа выравнивания по правому краю в представленном на картинке документе ms word
  • При задании типа выравнивания по правому краю в представленном документе ms word изменения затронут
  • При задании параметров шрифта в текстовом редакторе ms word устанавливаются
  • При задании параметров страницы в текстовом редакторе microsoft word устанавливаются