Excel чаво частина i cation


Excel ЧаВо частина I: Excel.Application

Як завантажити новий екземпляр Excel або підключитися до запущеного екземпляру EXCEL.EXE? Як від'єднатися від Excel і закрити його екземпляр?

Для визначення чи запущений новий екземпляр Excel.Application або приєднання до вже запущеного, використовується властивість TExcelApplication.ConnectKind. За замовчуванням ця властивість має значення ckRunningOrNew (константи визначені в unit OleServer). Однак рекомендується, якщо немає на то особливої ​​потреби, завжди запускати новий екземпляр Excel.Application щоб уникнути конфліктів з запущеним раннє екземпляром Excel.Application. Властивість TExcelApplication.AutoQuit в конструкторі встановлюється за умовчанням в False (тільки в модулі ExcelXP в True) - це означає, що якщо ви хочете при від'єднанні завершити роботу Excel (закрити), то потрібно викликати метод TExcelApplication.Quit або встановити властивість TExcelApplication.AutoQuit рівним True.

Як пишуть в "Best Practices for Setting Range Properties". "Код використовує Selection згенерований записом макросу Excel, часто використовується для виявлення об'єкта або методу, який буде працювати. Це гарна ідея, за винятком того, що записаний макрос не оптимiзований для користувача. Зазвичай Excel під час запису макросу використовує Selection і змінює вибір об'єкта під час запису будь-якої задачі ". Тобто використання Selection не є обов'язковим і навіть не рекомендується для розробника. Цитата звідти ж: "На практиці викликайте метод Select об'єкта тільки тоді, коли твердо мають намір змінити обраний користувачем елемент. Ви можете будь-коли використовувати метод Select просто тому, що це вам зручно, як розробнику. Якщо ви встановлюєте властивості об'єкта Range у вас завжди є альтернатива. Відмова від методу Select не тільки робить ваш код швидше. але і порадує користувачів вашої програми (it makes your users happier) ". Ця тема ще порушена тут.

Чому не потрібно використовувати Excel.Application.Range, а слід ExcelWorksheet.Range?

Використання ExcelApplication.Range дозволяє працювати тільки з активним листом активної книги, якщо ви відкриваєте по ходу роботи ще одну книгу або активується програма інший лист в книзі (наприклад, додаєте новий лист), то дані будуть вноситися саме в активний в даний момент лист. Щоб не потрапити в незручну ситуацію завжди використовуйте об'єкт Range об'єкта ExcelWorksheet. Це не тільки убезпечить ваш код від попадання "куди Бог пошле", але і дозволить записувати дані відразу в кілька листів і навіть книг без зміни ActiveSheet і ActiveCell.

Якщо додаток Excel працює і користувач виконує в Excel, одночасно, будь-які дії, то спроба підключиться до Excel і вносити в нього дані, викликає помилку. Як цього уникнути?

При роботі з запущеним додатком Excel, він може бути зайнятий, якщо в цей час користувач редагує значення в осередку, або в ньому відкрито будь-якої модальное діалогове вікно (наприклад, "Відкриття документа"). Щоб обійти цю ситуацію завжди запускайте нову копію Excel.Application і встановлюйте властивість Interactive в False, що заборонить користувачеві що-небудь робити в Excel'е або закрити запущений екземпляр Excel.Application: