Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Excel.exe остается в памяти после завершения макроса

19K
11 июля 2006 года
SuperMaximus
1 / / 11.07.2006
Внизу приведен код процедуры, которая и оставляет висеть процесс "Excel.exe"
в памяти после выполнения макроса 'JoinALL' (Вордовский макрос создает в ворде, в свою очередь еще один документ, который является результатом слияния)....
Вызов макроса в данном примере я закомментировал, т.к. полностью вставил его тело (с соотв ссылками на WordApp) в тело экселевского макроса. Однако месторасположение макроса никоим образом не влияет на результат (excel.exe все равно продолжает висеть в памяти).

Код:
Sub RunContract_Automation()
 
  'Dim Fs As Variant
  Dim ContractPath As String
  Dim WordApp As Word.Application
  Dim WordDoc As Word.Document
  Dim CType As String, CFile As String
 
 
  Set WordApp = CreateObject("Word.Application")
  Set WordDoc = WordApp.Documents.Open _
      (ThisWorkbook.Path & "\" & CFile)
  WordApp.Visible = True
'  WordApp.RUN "JoinALL"
   
     
With WordApp.Application
 
'=========Текст макроса JoinALL Вордовского файла=======
    .ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
    .ActiveDocument.MailMerge.OpenDataSource name:=ActiveDocument.Path & "\WORK.xls", _
        ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
        AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
        WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
        Format:=wdOpenFormatAuto, Connection:= _
        "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=WORK.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=35;Je" _
        , SQLStatement:="SELECT * FROM Import$`", SQLStatement1:="", SubType:= _
        wdMergeSubTypeAccess
 
        .ActiveDocument.MailMerge.Destination = wdSendToNewDocument
        .ActiveDocument.MailMerge.SuppressBlankLines = True
        .ActiveDocument.MailMerge.DataSource.FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
        .ActiveDocument.MailMerge.DataSource.LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
        .ActiveDocument.MailMerge.Execute Pause:=False
'=============================================================
     
   
   
    With .Dialogs(wdDialogFileSaveAs)
         .name = "D:\NEW\" & ContractName
         .Show
    End With
   
'    .Quit SaveChanges:=wdDoNotSaveChanges
       
End With
 
    WordApp.Quit SaveChanges:=wdDoNotSaveChanges
 
  Set WordApp = Nothing
  Set WordDoc = Nothing
 
End Sub

В конце, как видно из примера кода, закрывается Вордовский док-т...
WordApp.Quit SaveChanges:=wdDoNotSaveChanges

Set WordApp = Nothing
Set WordDoc = Nothing

Однако их создается 2 (источник с полями слияния, и результат слияния - ворой документ).... Так вот если процедуру слияния в вордовском макросе (либо в вышеприведенном коде) заменить на нечто вроде MsgBox " :)", то excel.exe не остается в памяти!

То есть причина тому, что Excel.exe остается висеть в памяти - созданный файл слияния!

Как закрыть все, что связано с Вордовскими файлами слияния?
Спасибо!
282
12 июля 2006 года
Bard
481 / / 26.02.2006
[QUOTE=SuperMaximus]Внизу приведен код процедуры, которая и оставляет висеть процесс "Excel.exe"
[/QUOTE]

Я ничего не шарю в макросах но судя по твоим словам, excel висит в памяти из-за макроса, а точнее из-за того, что етот макрос не завершаеться сам-по себе, его надо завершить. Ведь как извесно макрос ето что-то вроде тегов на базике, а их надо интерпритировать, и наверное, я так думаю, ету работу производит excel. Но по скольку, как я више говорил, не шарю я в макросах, то ето завершить его надо тебе самому. Помни: лучшее средство от всяческих excel'ев - Ctrl+Alt+Del и етим все сказано :-). И еще, из любой ситуации есть выход. Удачи!
15K
16 июля 2006 года
sanders
6 / / 14.02.2006
Попробуйте следующий код:

Dim ExcelProcesses() As Process = Process.GetProcessesByName("EXCEL")
Dim ExcelProcess As Process = Nothing

For Each ExcelProcess In ExcelProcesses
ExcelProcess.Kill()
Next

Убивает все бегущие на компе процессы EXCEL
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог