Remkomplekty.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel application quit

Закрытие процесса приложения Excel в C# после доступа к данным

Я пишу приложение на C#, которая открывает файл шаблона Excel для операций чтения/записи. Я хочу, чтобы когда пользователь закрывает приложение, процесс приложения Excel был закрыт без сохранения файла Excel. См. мой Диспетчер задач после нескольких запусков приложения.

Я использую этот код, чтобы открыть файл Excel :

и для доступа к данным, я использую этот код :

Я вижу подобные вопросы в stackoverflow, такие как этот вопрос и этот, и тестовые ответы, но он не работает.

15 ответов:

при закрытии рабочей книги у вас есть три необязательных параметра:

Workbook.Close(false) или если вы делаете позднюю привязку, иногда проще использовать ноль Workbook.Close(0) Вот как я сделал это при автоматизации закрытия книги.

также я пошел и посмотрел документацию для него, и нашел его здесь: Книга Excel Закрыть

попробуйте это.. это сработало для меня. вы должны освободить этот объект приложения xl, чтобы остановить процесс.

подумайте об этом, это убивает процесс:

кроме того, вы пытались просто закрыть его нормально?

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

. потому что таким образом вы создаете объекты RCW не только для книги, но и для книг, и вы должны освободить его тоже (что невозможно, если ссылка на объект не поддерживается).

это решило проблему для меня. Ваш код становится:

и затем освободите все эти объекты:

я заворачиваю это в try <> finally <> чтобы убедиться, что все выйдет, даже если что-то пойдет не так (что может пойти не так?), например,

убить Excel не всегда легко; смотрите эту статью: 50 способов убить Excel

эта статья принимает лучшие советы от Microsoft (MS Knowlege базовая статья) о том, как заставить Excel выйти красиво, но затем также удостоверяется в этом, убивая процесс, если это необходимо. Мне нравится иметь второй парашют.

убедитесь, что вы закрыли все открытые книги, вышли из приложения и освободили объект xlApp. Наконец, проверьте, чтобы увидеть, если процесс все еще жив, и если да, то убейте его.

эта статья также гарантирует, что мы не убиваем все процессы Excel, а только убиваем точный процесс, который был запущен.

вот код, который я использую: (работает все время)

excelBook.Закрывать(); excelApp.Выход(); добавьте конец кода, этого может быть достаточно. он работает над моим кодом

Я встретил те же проблемы и попробовал много методов, чтобы решить ее, но не работает. Наконец, я нашел свой путь. Некоторые ссылки Введите описание ссылки здесь

надеюсь, что мой код может помочь кому-то в будущем. Я потратил более двух дней, чтобы решить эту проблему. Ниже приведен мой код:

вы можете убить процесс своими COM объект excel pid

добавить где-то ниже кода импорта dll

он закрывает последний 10 сек процесс с именем «Excel»

правильный способ закрыть весь процесс excel

на основе других решений. Я должен использовать это:

С помощью» MainWindowHandle», чтобы определить процесс и закрыть его.

excelObj: это мое приложение Interop excel objecto

использовать переменную для каждого объекта Excel и петли Marshal.ReleaseComObject >0 . Без цикла процесс Excel по-прежнему остается активным.

мы можем закрыть приложение Excel при преобразовании xls в xlsx с помощью следующего кода. Когда мы выполняем этот вид задачи, то приложение Excel работает в диспетчере задач, мы должны закрыть этот excel, который работает в фоновом режиме. Interop-это Com-компонент, чтобы освободить com-компонент, который мы использовали Marshal.FinalReleaseComObject.

большинство методов работает, но процесс excel всегда остается до закрытия приложения.

когда убить excel процесс один раз он не может быть выполнен еще раз в том же потоке — не знаю, почему.

этот GetWindowThreadProcessId находит правильный идентификатор процесса o excell . После убивает его. Наслаждайся Этим.

Команда VBA Application.Quit не закрывает все приложение Excel

У меня есть следующий код под Боттоном. Когда я щелкнул по нему, он просто закрывает текущий лист excel, но не закрывает все приложение excel.

Примечание: у меня нет никаких других открытых листов

следующее окно все еще появляется после закрытия через код выше VBA .

7 Ответов

У меня был этот вопрос, и я решил его, вставив Workbook_BeforeClose() :

удалите Application.DisplayAlerts = True из процедуры.

из справки по Application.Quit Method :

Если несохраненные книги открыты при использовании этого метода, Microsoft Excel отображает диалоговое окно с запросом о необходимости сохранения изменений. Это можно предотвратить, сохранив все книги перед использованием метода Quit или установив для свойства DisplayAlerts значение False . Если это свойство имеет значение False, Microsoft Excel не отображает диалоговое окно при завершении работы с несохраненными книгами; он завершает работу без сохранения их.

Это позволит избежать любых (возможно скрытых) подсказок от остановки excel от полного закрытия

Окно не закрывается, потому что вы используете personal.xlsb. Вырезать Personal.xlsb и вставить в другое место.

Вместо Personal.xlsb Создавайте и работайте над модулями. Это лучший вариант.

«ThisWorkbook.Saved = True» после «Application.Quit» работает на Excel 2016

Это очень странно, надеюсь, что кто-то найдет этот ответ полезным. Я столкнулся с чем-то очень похожим, используя Excel 2010 (14.0). Я споткнулся на своем ответе, экспериментируя. Это плохой ответ для общего назначения.

По какой-то причине Application.Quit молча завершает работу, если опция AccessVBOM не включена. Он не включен из коробки и может быть установлен / снят вашим сетевым администратором с помощью политики windows.

Вы можете найти этот параметр в GUI путем обхода «Excel Options» -> «Trust Center» -> «Trust Center Settings» -> «Macro Settings» -> «Trust access to the VBA project object model». Или программно .

Поскольку мы все любим код, в этом примере мы запускаем Excel из C# interop и вызываем функцию quit.

Прошли MacroName из bat файла и попробовали нижеприведенный код его работы. Но я заметил одну вещь: если мы закрываем книгу (ActiveWorkbook.Close) перед Application.Quit, то она не работает.

Читать еще:  Vba excel функции поиска

Убедитесь, что на ваших листах нет внешних ссылок, особенно неработающих ссылок.

Я боролся с этой проблемой больше недели, переписывая и комментируя множество кода, чтобы попытаться изолировать проблему. Сегодня утром я наконец-то просмотрел все ссылки на таблицы и внешние листы в своей рабочей тетради. Я удалил все ненужные ссылки и сломанные ссылки, и теперь книга закрывается, не зависая в памяти.

Похожие вопросы:

У меня есть небольшой файл excel, который запускается приложением планирования каждые 15 минут. Функции в ячейках excel считывают данные из различных мест в сети и хранят их в ячейках в этом файле.

Я создал приложение запуска для пользователей базы данных, чтобы открыть переднюю часть конкретной базы данных. Например, пользователи открывают приложение запуска (которое является Access DB в.

Использование Application.Quit в Excel VBA должно инициировать процедуру выхода по умолчанию, которая включает в себя запрос пользователя на сохранение всех несохраненных документов, открытых в.

У меня есть vba, который я запускаю из пакета, который запускает макрос для их выполнения, я пытаюсь закрыть доступ, как только все функции закончатся, однако создание новой функции и размещение.

У меня есть workbook_open sub, который делает некоторые вещи, а затем вызывает application.quit. Однако теперь, когда я добавил Это, как я могу редактировать процедуру, учитывая, что excel.

У меня есть книга Excel, которая с помощью кода VBA открывает другую книгу, копирует некоторые данные в оригинал, а затем закрывает вторую книгу. Когда я закрываю вторую книгу (используя.

У меня проблема с моим макросом excel vba. Мне нужно, чтобы он выполнил пакетный файл, который находится в той же папке, что и книга excel. Код иногда работает хорошо. Я не знаю, что вызывает эту.

Я хочу создать код VBA , который защищает документ excel паролем . Я знаю, что это возможно с помощью инструментов excel и более безопасно, но я хочу попробовать это и использовать его в других.

Why doesn’t Excel quit?

The case

In today’s portion of questions at Excel for Developers forum, there’s this one:

I am currently working on a project that requires Excel to be controlled from within the C# environment. The program runs correctly and quits excel however it doesn’t remove the .EXE from the task manager. This is a problem as I need to open and close the Excel many times and it is filling up my RAM. Here is a code snippet:

Ex._Application OpenExcel;
OpenExcel = new Microsoft.Office.Interop.Excel.Application();
OpenWorkbook.Save();
OpenExcel.Quit();

From my experience, Excel doesn’t quit because there’s a COM object left unreleased either in your code or in the code of a COM add-in loaded in Excel. That is, to debug such an issue, you need to start with turning all COM add-ins off.

The theory

Now, let’s discuss this code line:

Its execution results in creating two COM objects: the first is a Workbook object, the other one is a Workbooks collection object. Let’s look at how the latter is created.

Because of the way .NET manages COM objects, oApp.Workbooks creates three objects:

  • #1 – the Workbooks collection, a COM object. You don’t access it in your code; instead, you manipulate it using #2 and #3 below.
  • #2 – an object called RCW which is an intermediate layer between a COM object and .NET; it deals with how the COM object is created/released. Although this is a .NET object, it isn’t accessible in your code.
  • #3 – a regular .NET object which holds a reference to the RCW (#2 above); this object represents the Workbooks collection in .NET.

That is: a .NET object (#3) holds a reference to the RCW (#2), which in its turn references the COM object (#1). When you call Marshal.ReleaseComObject(#3), #2 releases #1. Starting from this moment, invoking any property/method on #3 produces the exception “COM object that has been separated from its underlying RCW cannot be used”.

If you use Marshal.ReleseComObject to release a COM object, set the corresponding .NET variable to null (Nothing in VB.NET) as an indication that the corresponding COM object is released.

Setting null (or Nothing in VB) to a .NET variable that references a COM object doesn’t release the COM object which will stay alive until the next run of the GC. This results in holding resources and poor memory management.

When you call oApp.Workbooks.Open(), the three objects above are created for oApp.Workbooks… and another three for …Open(). The difference is: object #3 for …Open() is kept in oWb, while object #3 for oApp.Workbooks… is not referenced. It will be collected if only GC has a chance to run.

When Excel is closing…

Now, let’s see what occurs when you quit Excel.

If Excel was started by the user and the construct above is created in a VSTO add-in, then the VSTO add-in unloads the corresponding AppDomain; this kills #3, then #2 and, consequently, #1. In case of a COM add-in, Excel 2007-2010 kills unreleased objects after a time-out and this allows the add-in to unload and Excel to quit.

If Excel was run via Automation e.g. new Excel.Application(), you are responsible for releasing everything.

Conclusions:

  • When developing an application that deals with an Office application such as Excel, you need to release COM objects.
  • Debug your application or an add-in with all extensions in the Office application turned off.
  • If you develop an add-in for an Office application, you must release COM objects too; otherwise running the Office application by any standalone application will leave the Office application in the Processes list.

How and when to release COM objects?

There are three strategies:

  1. Not to release COM objects at all.
  2. Call GC.Collect at a proper moment.
  3. Use Marshal.ReleaseComObject() to release every COM object created in your code.
Читать еще:  Линейн в excel пример

Strategy #1 is most wide-spread. It results in problems which are numerous and various. Excel’s non-quitting is just an example.

Strategy #2 requires that you define:
a) a proper moment(s);
b) what COM objects will be released at this moment;
c) what COM objects will live until the next such moment (or to the end) ;
d) how all this stuff will behave in different scenarios in different Excel versions.

Besides, running GC is a time-consuming operation.

Как из Excel обратиться к другому приложению

Иногда бывает необходимо перенести что-то из Excel в другое приложение. Я возьму для примера Word. Например скопировать ячейки и вставить. Обычно мы это так и делаем — скопировали в Excel, открыли Word — вставили. Но сделать это при помощи кода чуть сложнее, хотя если разобраться никаких сложностей нет. Ниже приведен пример кода, который открывает Word, открывает в нем определенный документ, копирует данные из Excel и вставляет в открытый документ Word.

Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object ‘создаем новое приложение Word Set objWrdApp = CreateObject(«Word.Application») ‘Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме ‘objWrdApp.Visible = True ‘открываем документ Word — документ «Doc1.doc» должен существовать Set objWrdDoc = objWrdApp.Documents.Open(«C:Doc1.doc») ‘Копируем из Excel диапазон «A1:A10» Range(«A1:A10»).Copy ‘вставляем скопированные ячейки в Word — в начала документа objWrdDoc.Range(0).Paste ‘закрываем документ Word с сохранением objWrdDoc.Close True ‘ False — без сохранения ‘закрываем приложение Word — обязательно! objWrdApp.Quit ‘очищаем переменные Word — обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub

Tips_Macro_OpenWord.xls (49,5 KiB, 4 453 скачиваний)

В файле-примере, приложенном к данной статье, в комментариях к коду есть несколько добавлений. Например, как вставить текст из ячеек в определенные закладки Word-а и как добавить новый документ, а не открывать уже имеющийся. Так же так есть код проверки — открыто ли приложение Word в данный момент. Порой это тоже может пригодиться, чтобы работать с запущенным приложением Word, а не создавать новое:

Sub Check_OpenWord() Dim objWrdApp As Object On Error Resume Next ‘пытаемся подключится к объекту Word Set objWrdApp = GetObject(, «Word.Application») If objWrdApp Is Nothing Then ‘если приложение закрыто — создаем новый экземпляр Set objWrdApp = CreateObject(«Word.Application») ‘делаем приложение видимым. По умолчанию открывается в скрытом режиме objWrdApp.Visible = True Else ‘приложение открыто — выдаем сообщение MsgBox «Приложение Word уже открыто», vbInformation, «Check_OpenWord» End If End Sub

В принципе, активировать или вызвать(если закрыто) другое приложение Офиса можно одной строкой:

Sub Open_AnotherApp() Application.ActivateMicrosoftApp xlMicrosoftWord End Sub

но данный метод может пригодиться только в том случае, если Вам необходимо действительно лишь активировать другое приложение, но дальше обращаться к этому приложению Вы уже не сможете.

По сути, методами CreateObject и GetObject можно обратиться к любому стороннему приложению(например Internet Explorer). Куда важнее при обращении к этим объектам знать объектную модель того приложения, к которому обращаетесь. Чтобы увидеть свойства и методы объектной модели приложения, можно в редакторе VBA подключить необходимую библиотеку, объявить переменную, назначив ей тип приложения. Покажу на примере того же Word-а.
Для начала открываем меню Tools — References :

Подключаем библиотеку:

Затем объявляем переменную и присваиваем ей тип нужного приложения:

Sub OpenWord() Dim objWrdApp As Word.Application Set objWrdApp = New Word.Application objWrdApp.Visible = True End Sub

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

Так же можно нажать F2 и через поиск найти Word и просмотреть все методы и свойства данного приложения.

Метод установки ссылки на библиотеку приложения через ToolsReferences называют еще ранним связыванием. Подобный метод позволяет создать ссылку на приложение быстрее и, как описано выше, предоставляет разработчику доступ к визуальному отображению свойств и методов объекта. Но есть существенный минус: если в своем коде Вы установите ссылку на Word 12 Object Libbary(Word 2007), то на ПК с установленным Word 2003 получите ошибку MISSING, т.к. Word 2003 относится к библиотеке Word 11 Object Libbary. Подробнее можно прочитать в статье Ошибка — Cant find project or library.
Метод же CreateObject еще называется методом позднего связывания. Применяя его не возникнет проблем с MISSING, очень часто возникающих при раннем связывании. Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения к коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение. Так же можно отобразить окно Immediate(ViewImmediate Window или сочетание клавиш Ctrl + G ), записать вопросительный знак и вставить эту константу и нажать Enter :
?wdLine
ниже будет выведено числовое представление этой константы.
А заменять эти константы их числовыми значениями в случае с поздним связыванием необходимо, т.к. Excel не знает их значений.
Попробую пояснить поподробнее про эти константы и почему их надо заменять какими-то числами: при подключении библиотеки Wordа(Word 12 Object Libbary) мы так же подключаем и все свойства, методы и константы, которые доступны из Wordа. И их использование напрямую становится доступно из Excel и мы можем смело написать что-то вроде wbLine и Excel поймет эту константу. При позднем же связывании мы уже не подключаем библиотеки Word(во избежание ошибок совместимости) и как следствие — методы, свойства и константы Wordа для Excel становятся чем-то неизвестным и не документированным и мы получим ошибку «Variable not defined»(если включена директива Option Explicit) при попытке назначить свойство через wdLine. Если же Option Explicit не включена — то хоть ошибки не будет, но и код будет работать неверно, т.к. для неизвестной для Excel переменной wbLine будет назначено значение 0(Empty). Поэтому и надо все константы другого приложения заменять их числовыми значениями.

Читать еще:  Excel vba примечание

Главная ошибка новичка
И хочу так же упомянуть про ошибку, которую очень часто совершают при обращении к одному приложению из другого. Допустим, необходимо скопировать из Word все данные в Excel. Часто начинающие делают это так:

Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object ‘создаем новое приложение Word Set objWrdApp = CreateObject(«Word.Application») ‘Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме ‘objWrdApp.Visible = True ‘открываем документ Word — документ «Doc1.doc» должен существовать Set objWrdDoc = objWrdApp.Documents.Open(«C:Doc1.doc») ‘Копируем из Word все данные, обращаясь к объекту Range документа Range.Copy ‘вставляем скопированное в ячейку А1 активного листа Excel ActiveSheet.Paste ‘закрываем документ Word без сохранения objWrdDoc.Close False ‘закрываем приложение Word objWrdApp.Quit ‘очищаем переменные Word — обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub

На строке Range.Copy обязательно получите ошибку от VBA, указывающую, что нужен аргумент для объекта. Можно попробовать добавить этот аргумент: Range(1).Copy. Но все равно получим ошибку. Можно, конечно, указать даже ячейки: Range(«A1»).Copy. Но это приведет к тому, что скопирована будет ячейка А1 активного листа Excel.
Все дело в том, что мы хотим скопировать данные из Word-а, выполняя при этом код из Excel. А у Excel тоже есть объект Range с другими аргументами. И если не указать какому приложению, листу или документу принадлежит Range, то по умолчанию он будет отнесен к тому приложению, из которого выполняется код. Т.е. к Excel. Если совсем кратко об этом — всегда надо указывать какому приложению или объекту принадлежит используемый объект или свойство. Правильно код должен выглядеть так:

Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object ‘создаем новое приложение Word Set objWrdApp = CreateObject(«Word.Application») ‘Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме ‘objWrdApp.Visible = True ‘открываем документ Word — документ «Doc1.doc» должен существовать Set objWrdDoc = objWrdApp.Documents.Open(«C:Doc1.doc») ‘Копируем из Word все данные, обращаясь к объекту Range документа ‘при этом перед Range явно указываем откуда его брать — из документа Word -objWrdDoc(«C:Doc1.doc») objWrdDoc.Range.Copy ‘вставляем скопированное из Word в активную ячейку активного листа Excel ActiveSheet.Paste ‘закрываем документ Word без сохранения objWrdDoc.Close False ‘закрываем приложение Word objWrdApp.Quit ‘очищаем переменные Word — обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub

Вместо Range ту же ошибку делают и с Selection(потому что Selection часто присутствует в записанных макрорекордером макросах), т.к. этот объект есть и в Excel и в Word и без явного указания приложения будет относится к приложению, в котором записано.

В приложенном файле код немного отличается от представленных выше — в нем можно посмотреть как вставить текст из ячеек в определенные(созданные заранее) закладки Word-а. Это удобно для создания бланков в Word и заполнения их через Excel
Скачать пример:

Tips_Macro_OpenWord.xls (49,5 KiB, 4 453 скачиваний)

Статья помогла? Поделись ссылкой с друзьями!

Команда VBA Application.Quit не закрывает все приложение Excel

5 logan [2013-09-11 13:26:00]

У меня есть код под батоном. Когда я щелкнул по нему, он просто закрывает текущий лист excel, но не закрывает все приложения excel.

Примечание: У меня нет других открытых страниц

после закрытия кода выше VBA по-прежнему появляется следующее окно.

vba excel-vba excel

6 ответов

5 FranckH [2014-09-11 17:41:00]

У меня была эта проблема, и я разрешил ее, вставив Workbook_BeforeClose() :

1 Tomek B. [2017-12-05 02:38:00]

Окно не закрывается, потому что вы используете personal.xlsb. Вырезать Personal.xlsb и вставить в другое место.

Вместо Personal.xlsb создавать и работать с модулями. Это лучший вариант.

1 SeanC [2013-09-11 20:50:00]

удалите Application.DisplayAlerts = True из подпрограммы.

из справки для Application.Quit Method :

Если несохраненные книги открыты при использовании этого метода, Microsoft Excel отображает диалоговое окно с вопросом, хотите ли вы сохранить изменения. Это можно предотвратить, сохранив все книги перед использованием метода Выйти или установив для свойства DisplayAlerts значение False. Когда это свойство False, Microsoft Excel не отображает диалоговое окно при выходе из несохраненных книг; он уходит, не сохраняя их.

Это позволит избежать каких-либо (возможно скрытых) запросов от остановки целиком от закрытия полностью

Это странно, надеюсь, кто-то найдет этот ответ полезным. Я столкнулся с чем-то очень похожим с помощью Excel 2010 (14.0). Я наткнулся на свой ответ через эксперименты. Это плохой ответ для общего назначения.

По какой-то причине Application.Quit не работает, если опция AccessVBOM не включена. Он не включен из коробки и может быть установлен/отключен администратором сети по политике Windows.

Этот параметр можно найти в графическом интерфейсе, пройдя «Параметры Excel» → «Центр доверия» → «Настройки центра доверия» → «Настройки макроса» → «Доверять доступ к объектной модели проекта VBA». Или программно.

Поскольку мы все любим код, в этом примере мы запускаем Excel из С# interop и вызываем функцию quit.

0 ram [2017-05-12 13:13:00]

Прошли MacroName из файла bat и попробовали работать с приведенным ниже кодом. Но я заметил, что если мы закрываем книгу (ActiveWorkbook.Close) до Application.Quit, то она не работает.

Убедитесь, что на ваших листах нет ссылок на внешние ссылки, особенно на неработающие ссылки.

Я боролся с этой проблемой более недели, переписывая и комментируя много кода, чтобы попытаться изолировать проблему. Сегодня утром в моей книге я просмотрел все таблицы и ссылки на внешние листы. Я удалил все ненужные ссылки и сломанные ссылки, и рабочая книга теперь закрывается, не вися в памяти.

Ссылка на основную публикацию
Adblock
detector