Ілюстрований самовчитель з документообігу. Автоматизація складання виконавчої документації з будівництва в Excel Автоматизація складання документів у ms excel

03.10.2020 Безпека


Ця стаття присвячена темі, можливо, і не новій, але, як показують листи читачів, як і раніше актуальною - автоматизації програм Microsoft Office. Багато розробників у процесі роботи над своїми проектами (неважливо, за допомогою якого засобу розробки - Delphi, C++Builder, Visual Basic:) нерідко застосовують сервіси, що надаються Microsoft Office, наприклад побудова зведених таблицьта діаграм з допомогою Microsoft Excel, генерацію та друк документів за допомогою Microsoft Wordі т.д. Нерідко користувачі, які звикли використовувати програми Microsoft Office у повсякденній роботі, самі наполягають на застосуванні додатків таких сервісів або просто на збереженні звітів та інших документів в одному з форматів Microsoft Office. Зазначимо, що потенційні побажання подібного роду компанією Microsoft враховані досить давно - практично все, що може зробити користувач будь-якої програми Microsoft Office з допомогою меню, клавіатури та інструментальної панелі, може бути вироблено і автоматично, тобто або з VBA-програми, або з програми, створеної за допомогою одного із засобів розробки. Іншими словами, програми Microsoft Office є програмованими. Програмованість у випадку означає можливість управління даним додатком з допомогою макромов чи з допомогою інших додатків. Всі компоненти Microsoft Office підтримують одну і ту ж макромову: Visual Basic for Applications (VBA), що дозволяє створювати програми безпосередньо всередині документів Office (це називається<решения на базе Microsoft Office>). Управління компонентами Office з інших програм здійснюється за допомогою автоматизації (Automation, раніше - OLE Automation) - всі програми Microsoft Office є серверами автоматизації (або COM-серверами). Для створення таких програм придатні будь-які засоби розробки, що дозволяють створювати контролери автоматизації (COM-клієнти). Найчастіше цієї мети використовується Visual Basic, але може бути і Delphi, і C++Builder, і Visual C++. Однак, перш ніж обговорювати можливості тих чи інших засобів розробки, слід розібратися, що таке автоматизація.

Коротко про автоматизацію

Автоматизація - це одна з можливостей, що надаються технологією Microsoft Component Object Model (COM). Не вдаючись у подробиці реалізації цієї технології, зауважимо, що вона використовується додатками (званими COM-серверами) для надання доступу до їх об'єктів, а також до властивостей та методів цих об'єктів іншим додаткам (називаються COM-клієнтами), якими можуть бути засоби розробки . Наприклад, текстовий процесор, як COM-сервер, може надавати іншим додаткам доступ до документа, абзацу, закладці за допомогою відповідних об'єктів. Для іменування (і упізнання) COM-серверів зазвичай використовуються спеціальні рядкові позначення – програмні ідентифікатори (Programmatic Identifier, ProgID). Вони потрібні для того, щоб операційна системамогла з допомогою цих ідентифікаторів визначити, у якому саме каталозі (чи якому комп'ютері локальної мережіякщо використовується той чи інший спосіб віддаленого доступудо сервера) розташований файл сервера автоматизації, що виконується, і запустити його на виконання. Про те, які саме програмні ідентифікатори застосовуються для програми Microsoft Office, буде сказано в розділах, присвячених цим програмам.

Об'єкти автоматизації з погляду програмування мало чим від звичайних об'єктів, знайомих з теорії та практики объектно-ориентированного програмування. Як і звичайні об'єкти, вони мають властивості та методи. Властивість – це характеристика об'єкта; наприклад, властивістю абзацу (об'єкт Paragraph) може бути стиль (Style). Методом називається дія, яку можна виконати з об'єктом (наприклад, можна зберегти документ за допомогою методу SaveAs об'єкта Document).

Нерідко сервери автоматизації містять набори однотипних об'єктів, які називаються колекціями. Наприклад, текстовий процесор може містити колекцію документів, а кожен документ – колекцію абзаців.

Як дізнатися, які об'єкти доступні на серверах автоматизації? Для цього в комплект поставки будь-якого сервера автоматизації входить документація та файли довідки, що описують їх об'єктну модель. Якщо брати програми Microsoft Office 2000, це довідкові файли для програмістів на Visual Basic for Applications VBAxxx9.CHM (для Microsoft Office 97 - VBxxx8.HLP відповідно). Зазначимо, що за умовчанням вони не встановлюються, оскільки потрібні розробникам, а не звичайним користувачам.

Вся інформація про об'єкти, необхідна для контролерів автоматизації, міститься в бібліотеках типів. Бібліотеки типів зберігаються у спеціальному бінарному форматі і зазвичай представлені у вигляді файлів з розширеннями *.olb або *.tlb, а також можуть утримуватися всередині виконуваних файлів(*.exe) або бібліотек, що динамічно завантажуються (*.dll). Бібліотеки типів можна переглядати за допомогою утиліти OleView, що входить до складу Microsoft Platform SDK, а засоби розробки фірми Borland містять власні утиліти перегляду бібліотек типів.

Закінчуючи це більш ніж короткий вступ до автоматизації, зупинимося також на понятті зв'язування. Зв'язуванням називається спосіб, за допомогою якого змінна або клас програми-контролера посилається на об'єкт автоматизації. Таких способів існують два: пізнє зв'язування та раннє зв'язування.

Пізнє зв'язування означає, що реальне посилання на об'єкт у змінній або класі з'являється на етапі виконання програми-контролера. Цей спосіб зазвичай повільніший, ніж раніше зв'язування, але він доступний у всіх засобах розробки, що дозволяють створювати контролери автоматизації, і менш чутливий до того, чи всі параметри методів перераховані при їх викликах у коді програми-контролера. При пізньому зв'язуванні коректність викликів методів перевіряється в останній момент їх здійснення, тобто етапі виконання докладання, а чи не на етапі його компіляції.

Раннє зв'язування означає, що реальне посилання об'єкт автоматизації з'являється вже етапі компіляції. Тому код програми-контролера вимагає посилання на бібліотеку типів (або на спеціальний модуль, що є інтерфейсом до неї), і це призводить до генерації в цьому додатку класів з тими ж властивостями і методами, що і в об'єктів автоматизації, що робить можливими синтаксичну перевірку імен методів на етапі компіляції та доступ до іменованих константів, що містяться в бібліотеці типів. Зазначимо, однак, що далеко не всі засоби розробки, що підтримують пізнє зв'язування, також здійснюють підтримку раннього зв'язування.

Закінчивши екскурс в COM та автоматизацію, повернемося до питання про те, які засоби розробки зручно застосовувати для створення контролерів автоматизації.

VBA та засоби розробки контролерів автоматизації

Як вже було сказано вище, контролери автоматизації можна створювати за допомогою різних засобів розробки, і якщо ви вже використовуєте якийсь інструментальний засіб, що підтримує створення контролерів автоматизації, можна саме ним і скористатися. Єдине, що слід зробити – це дізнатися, чи підтримується вашим засобом розробки раніше зв'язування, якщо ви плануєте його використовувати. Приклади найпростіших контролерів автоматизації (як правило, для Microsoft Word або Microsoft Excel), що дають уявлення про те, як викликаються методи сервера, зазвичай можна знайти в комплекті постачання більшості сучасних засобів розробки.

Освоєння об'єктної моделі автоматизованого сервера можна розпочати із запису необхідної послідовності дій у вигляді макросу за допомогою VBA. Створити макрос можна, вибравши з меню Microsoft Office пункт Tools | Macro | Record New Macro. Перегляд отриманого макросу в редакторі коду VBA зазвичай дозволяє зрозуміти, як має виглядати код, що реалізує цю послідовність дій.

Обговоривши можливі засоби розробки контролерів автоматизації, можна нарешті перейти до самих програм Microsoft Office, до їх об'єктних моделей та їх використання. Як засіб розробки для наведених нижче прикладів використовується Borland Delphi 5, але оскільки в них наводиться послідовність виклику властивостей та методів об'єктів Microsoft Office, перенесення коду іншими мовами програмування не повинно викликати особливих труднощів. Якщо спеціально не зазначено, у цій статті у всіх прикладах використовується раннє зв'язування.

Об'єктні моделі Microsoft Office

Як було сказано вище, програми Microsoft Office надають контролерам автоматизації доступ до своєї функціональності за допомогою своєї об'єктної моделі, що є ієрархією об'єктів. Об'єкти можуть надавати доступ до інших об'єктів за допомогою колекцій.

Як ілюстрація того, як виглядає ієрархія об'єктів Microsoft Office, наведемо невеликий фрагмент об'єктної моделі Microsoft Word (рис.1):

В об'єктних моделях (рис.2)

всіх програм Microsoft Office завжди є найбільш головний об'єкт, доступний додатку-контролеру і представляє програму, що само автоматизується. Для всіх програм Microsoft Office він називається Application, і багато його властивостей і методів для всіх цих програм також однакові. Найчастіше ми будемо використовувати такі:

  1. Властивість Visible (доступна для об'єкта Application всіх програм Microsoft Office) дозволяє програмі з'явитися на екрані та панелі завдань; воно набуває значення True ( користувальницький інтерфейспрограми доступний) або False (користувацький інтерфейс програми недоступний; це значення встановлюється за замовчуванням). Якщо вам потрібно зробити щось з документом Officeв фоновому режимі, не інформуючи про це користувача, можна не звертатися до цієї властивості - у цьому випадку програму можна буде знайти лише у списку процесів за допомогою програми Task Manager.
  2. Метод Quit закриває програму Office. Залежно від того, яке програмне забезпечення Office автоматизується, він може мати параметри або не мати таких.

Загальні засади створення контролерів автоматизації

У випадку контролер автоматизації повинен виконувати такі действия:

  1. Перевірити, чи запущено копію програми-сервера.
  2. Залежно від результатів перевірки запустити копію програми Office, що автоматизується, або підключитися до вже наявної копії.
  3. Зробити вікно програми-сервера видимим (загалом це необов'язково).
  4. Виконати якісь дії з програмою-сервером (наприклад, створити або відкрити документи, змінити їх дані, зберегти документи та ін.)
  5. Закрити програму-сервер, якщо його копія була запущена даним контролером, або відключитися від нього, якщо контролер підключився до вже наявної копії.

Відповідний код для Delphi представлений у лістингу 1 .

Тут ми скористалися функціями GetActiveOleObject і CreateOleObject для підключення до вже запущеної копії програми-сервера або запуску нової, якщо сервер не запущений, що призводить до того, що у варіантну змінну міститься посилання на об'єкт Application відповідного сервера.

Наведена частина коду контролера в інших засобах розробки може виглядати інакше - вона не має прямого відношення до методів об'єктів Office, оскільки обумовлена ​​правилами виклику стандартних функцій OLE у Delphi (за винятком викликів методів Visible та Quit об'єкта Application). А ось все те, що має бути вставлене замість коментаря<Здесь выполняются другие действия с объектами приложения Office>, у різних засобах розробки має виглядати більш менш однотипно - використовуючи створену варіантну змінну, ми маніпулюємо методами і властивостями об'єкта Application.

Насамкінець зробимо одне невелике зауваження щодо числа параметрів методів об'єктів автоматизації. У разі застосування пізнього зв'язуваннячисло зазначених у коді властивостей способу має збігатися зі своїми істинним числом (яке можна знайти у описі об'єктної моделі відповідного докладання). У цьому випадку цілком допустимим є наступний код:

незважаючи на те, що метод Quit об'єкта Application у деяких програмах Microsoft Office (наприклад, Microsoft Word) має параметри.

При використанні раннього зв'язування, наприклад при створенні контролерів за допомогою Delphi, слід більш суворо підходити до визначення параметрів - їх число і тип повинні відповідати опису методів у бібліотеці типів. Наприклад, у разі раннього зв'язування коректний код на Delphi для закриття документа Wordзі значеннями всіх параметрів за промовчанням матиме вигляд:

App.Quit (EmptyParam, EmptyParam, EmptyParam);

Винятком із цього правила є Visual Basic - це засіб розробки дозволяє не замислюватися про кількість параметрів методів написання коду.

Обговоривши загальні принципистворення контролерів автоматизації та дізнавшись, як це робиться засобами Borland Delphi, ми можемо перейти до розгляду автоматизації конкретних додатків Microsoft Office. Почнемо з одного з найпопулярніших компонентів цього пакета – з Microsoft Word.

Програмні ідентифікатори та об'єктна модель Microsoft Word

Для програми-контролера доступні такі об'єкти:

Решта об'єктів Word є так званими внутрішніми об'єктами. Це означає, що вони не можуть бути створені власними силами; так, об'єкт Paragraph (абзац) не може бути створений окремо від документа, що містить його.

Якщо згадати, що основне призначення Word – робота з документами, можна легко зрозуміти ієрархію його об'єктної моделі (фрагмент її було показано на рис. 1). Основним об'єктом у ній, як і всіх інших додатках Microsoft Office, є об'єкт Application, що містить колекцію Documents об'єктів типу Document. Кожен об'єкт типу Document містить колекцію Paragraphs об'єктів типу Paragraph, Bookmarks типу Bookmark, Characters типу Character тощо. Маніпуляція документами, абзацами, символами, закладками реально здійснюється шляхом звернення до властивостей та методів цих об'єктів.

Нижче ми розглянемо найпоширеніші завдання, пов'язані з автоматизацією Microsoft Word. Якщо ж вам зустрілося завдання, що не збігається з жодною з перелічених, ви можете спробувати знайти відповідний приклад на Visual Basic у довідковому файлі VBAWRD9.CHM, або, як уже було сказано вище, записати необхідну послідовність дій у вигляді макросу і проаналізувати його код.

Створення та відкриття документів Microsoft Word

Для створення прикладів використання Microsoft Word можна використовувати код створення контролера, наведений вище, і модифікувати його, замінюючи коментарі кодом, що маніпулює властивостями та методами об'єкта Word.Application. Ми почнемо зі створення та відкриття документів.

Створити новий документ Word можна, використовуючи метод Add колекції Documents об'єкта Application:

App.Documents.Add;

Як створити нестандартний документ? Дуже просто - потрібно вказати ім'я шаблону як параметр методу Add:

App.Documents.Add("C:\Program Files\ _ Microsoft Office\Templates\1033\Manual.dot");

Для відкриття існуючого документа слід скористатися методом Open колекції Documents:

App.Documents.Open("C:\MyWordFile.doc");

Зазначимо, що властивість ActiveDocument об'єкта Word.Application вказує на активний документ серед одного або декількох відкритих. Крім цього, до документа можна звертатися за його порядковим номером за допомогою методу Item; наприклад, до другого відкритому документуможна звернутися так:

App.Documents.Item(2)

Зазначимо, що нумерація членів колекцій Microsoft Office починається з одиниці.

Зробити документ активним можна за допомогою методу Activate:

App.Documents.Item(1).Activate;

Наступне, чого слід навчитися – це зберігати документ Word та закривати сам Word.

Збереження, друк та закриття документів Microsoft Word

App.Documents.Item(2).Close;

App.ActiveDocument.Close ;

Метод Close має кілька необов'язкових (у разі пізнього зв'язування) параметра, що впливають правила збереження документа. Перший впливає на те, чи зберігаються внесені в документ зміни, і приймає три можливі значення (відповідні константи рекомендується описати в додатку. Див. листинг 2):

Третій параметр приймає значення True або False і впливає на те, чи пересилати документ наступному користувачеві електронній пошті. Якщо ця функціональність не застосовується, можна проігнорувати цей параметр.

Таким чином, при використанні цих параметрів закрити документ можна, наприклад:

App.ActiveDocument.Close(wdSaveChanges, _ wdPromptUser) ;

App.ActiveDocument.Save;

Цей метод також має кілька необов'язкових (у разі пізнього зв'язування) параметрів, перший з яких дорівнює True, якщо документ зберігається автоматично, та False, якщо потрібно виводити діалогову панельдля отримання підтвердження користувача про збереження змін (якщо вони були зроблені). Другий параметр впливає на формат документа, що зберігається, і список його можливих значень збігається зі списком значень другого параметра методу Close.

Нагадуємо, що закрити сам Word можна за допомогою методу Quit об'єкта Word.Application. Цей метод має у загальному випадку три параметри, що збігаються з параметрами методу Close об'єкта Document.

Виведення документа на пристрій друку можна здійснити за допомогою методу PrintOut об'єкта Document, наприклад:

App.ActiveDocument.PrintOut;

Якщо потрібно змінити параметри друку, слід зазначити відповідні параметри методу PrintOut (у випадку Microsoft Word їх близько двадцяти).

Вставка тексту та об'єктів у документ та форматування тексту

Для створення абзаців у документі можна використовувати колекцію Paragraphs об'єкта Document, яка представляє набір абзаців цього документа. Додати новий абзац можна за допомогою методу Add цієї колекції:

App.ActiveDocument.Paragraphs.Add;

Для вставки тексту в документ, проте, застосовується не об'єкт Paragraph, а об'єкт Range, що представляє будь-яку безперервну частину документа (у тому числі і новостворений абзац). Цей об'єкт може бути створений різними способами. Наприклад, можна вказати початковий і кінцевий символи діапазону (якщо такі є в документі):

Var Rng: Variant; ... Rng:= App.ActiveDocument.Range(2,4); //з ​​2-го по 4-й символи

або вказати номер абзацу (наприклад, щойно створеного):

Rng:= App.ActiveDocument.Paragraphs.Item(1).Range;

або вказати кілька абзаців, наступних поспіль:

Rng:= App.ActiveDocument.Range _ (App.ActiveDocument.Paragraphs.Item(3).Range.Start,_ App.ActiveDocument.Paragraphs.Item(5).Range.End)

Вставити текст можна за допомогою методів об'єкта Range InsertBefore (перед діапазоном) або InsertAfter (після діапазону), наприклад:

Rng.InsertAfter("Це вставляється текст");

Крім об'єкта Range текст можна вставляти за допомогою об'єкта Selection, що є властивістю об'єкта Word.Application і є виділеною частиною документа (цей об'єкт створюється, якщо користувач виділяє частину документа за допомогою миші, і може бути також створений за допомогою програми-контролера). Сам об'єкт Selection можна створити, застосувавши метод Select до об'єкта Range, наприклад:

Var Sel: Variant; ... App.ActiveDocument.Paragraphs.Item(3).Range.Select;

У наведеному вище прикладі у поточному документі виділяється третій абзац.

Якщо ми хочемо вставити рядок тексту в документ або замість виділеного фрагмента тексту, або перед ним, це можна зробити за допомогою наступного фрагмента коду:

Var Sel: Variant; ... Sel: = App.Selection; Sel.TypeText("Це текст, яким ми замінимо _ виділений фрагмент");

Зазначимо, якщо властивість Options.ReplaceSelection об'єкта Word.Application дорівнює True, виділений текст буде замінено на новий текст (цей режим діє за замовчуванням); якщо потрібно, щоб текст був вставлений перед виділеним фрагментом, а чи не замість нього, слід встановити цю властивість рівним False:

App.Options.ReplaceSelection:= False;

Символ кінця абзацу під час використання об'єкта Selection може бути вставлений за допомогою наступного фрагмента коду:

Sel.TypeParagraph;

До об'єкта Selection, як і об'єкта Range, можна застосувати методи InsertBefore і InsertAfter. У цьому випадку, на відміну від попереднього, текст, що вставляється, стане частиною виділеного фрагмента тексту.

За допомогою об'єкта Selection, використовуючи його властивість Font та властивості об'єкта Font, такі як Bold, Italic, Size,:, можна відформатувати текст. Наприклад, таким чином можна вставити рядок, виділений жирним шрифтом:

Sel.Font.Bold:= True; Sel.TypeText("Це текст, який ми виділимо _ жирним шрифтом."); Sel.Font.Bold:= False; Sel.TypeParagraph;

Для накладання на текст певного заздалегідь стилю можна використовувати властивість Style цього ж об'єкта, наприклад:

Sel.Style: = "Heading 1"; Sel.TypeText("Це текст, який стане _ заголовком"); Sel.TypeParagraph;

Нерідко документи Word містять дані інших програм. Найпростіший спосібвставити такі дані в документ - використовувати метод Paste об'єкта Range:

Var Rng: Variant; ... Rng: = App.Selection.Range; Rng.Collapse(wdCollapseEnd); Rng.Paste;

Природно, в цьому випадку в буфері обміну вже повинні міститися дані, що вставляються.

Якщо потрібно помістити в буфер обміну частину документа Word, це можна зробити за допомогою Copy об'єкта Range:

Var Rng: Variant; ... Rng: = App.Selection.Range; Rng.Copy;

Наступне, чого потрібно навчитися - переміщення курсору в потрібне місце тексту, ніж ми й займемося у наступному розділі.

Переміщення курсору за текстом

Використовуючи метод Collapse, можна<сжать>об'єкт Range або об'єкт Selection, скоротивши його розмір до нуля символів:

Rng.Collapse(wdCollapseEnd);

Параметр цього методу вказує, на початку або наприкінці вихідного фрагмента виявиться новий об'єкт Range чи Selection. Якщо ви використовуєте пізніше зв'язування і ваш засіб розробки - не Visual Basic, потрібно визначити відповідні константи у додатку:

Const wdCollapseStart = $00000001; //Новий об'єкт знаходиться на початку фрагмента wdCollapseEnd = $00000000; //Новий об'єкт знаходиться в кінці фрагмента

Переміщати курсор за текстом можна за допомогою методу Move об'єктів Range та Selection. Цей метод має два параметри. Перший вказує на те, в яких одиницях вимірюється переміщення - у символах (за замовчуванням), словах, реченнях, абзацах та ін. ). Наприклад, наступний фрагмент коду:

Rng.Move;

призведе до переміщення курсору на один символ вперед, а

Rng.Move(wdParagraph,3);

призведе до переміщення курсору на три абзаци вперед. Зазначимо, що цей метод використовує такі константи:

Const // Одиницею переміщення є: wdCharacter = $00000001; //символ wdWord = $00000002; //слово wdSentence = $00000003; //пропозиція wdParagraph = $00000004; // абзац wdStory = $ 00000006; // частина документа // напр., колонтитул, // зміст та ін) wdSection = $ 00000008; //розділ wdColumn = $00000009; //Колонка таблиці wdRow = $0000000A; //Рядок таблиці wdCell = $0000000C; / / клітинка таблиці wdTable = $ 0000000F; //таблиця

Нерідко для переміщення тексту використовуються закладки. Створити закладку в поточній позиції курсору можна шляхом додавання члена колекції Bookmarks об'єкта Document за допомогою методу Add, вказавши ім'я закладки як параметр, наприклад:

App.ActiveDocument.Bookmarks.Add("MyBookmark");

Перевірити існування закладки в документі можна за допомогою методу Exists, а переміститися на неї – за допомогою методу Goto об'єктів Document, Range або Selection:

Rng:= App.ActiveDocument.Goto(wdGoToBookmark, wdGoToNext, "MyBookmark"); Rng.InsertAfter("Текст, вставлений після закладки");

Значення констант для цього прикладу такі:

WdGoToBookmark = $FFFFFFFF; //перейти до закладки wdGoToNext = $00000002; //Шукати наступний об'єкт у тексті

Зазначимо, що з допомогою методу Goto можна переміщатися як на зазначену закладку, а й інші об'єкти (малюнки, граматичні помилки та інших.), і напрям переміщення також може бути різним. Тому список констант, які можуть бути використані як параметри даного методу, досить великий.

Створення таблиць

Створювати таблиці можна двома способами. Перший полягає у викликі методу Add колекції Tables об'єкта Document та послідовному заповненні осередків даними. Цей спосіб при пізньому зв'язуванні працює досить повільно.

Другий спосіб, набагато більше<быстрый>, полягає у створенні тексту з декількох рядків, що містять підрядки з роздільниками (як роздільник можна використовувати будь-який або майже будь-який символ, потрібно тільки, щоб він свідомо не зустрічався в даних, які будуть поміщені в майбутню таблицю), і подальшої конвертації такого тексту в таблицю за допомогою методу ConvertToTable об'єкта Range. Нижче наведено приклад створення таблиці з трьох рядків і трьох стовпців цим способом (як роздільника, що є першим параметром методу ConvertToTable, використовується кома):

Var Rng: Variant; ... Rng: = App.Selection.Range; Rng.Collapse(wdCollapseEnd); Rng.InsertAfter("1, 2, 3"); Rng.InsertParagraphAfter; Rng.InsertAfter("4,5,6"); Rng.InsertParagraphAfter; Rng.InsertAfter("7,8,9"); Rng.InsertParagraphAfter; Rng.ConvertToTable(",");

Відмітимо, що зовнішній виглядтаблиці можна змінити за допомогою властивості Format, а також за допомогою властивостей колекції Columns, що представляє колонки таблиці, та колекції Rows, що представляє рядки таблиці об'єкта Table.

Звернення до властивостей документа

Властивості документа можна отримати за допомогою колекції BuiltInDocumentProperties об'єкта Document, наприклад:

Memo1.Lines.Add("Назва -" + _ App.ActiveDocument.BuiltInDocumentProperties .Value); Memo1.Lines.Add("Автор -" + _ App.ActiveDocument.BuiltInDocumentProperties . _ Value); Memo1.Lines.Add("Шаблон - " + _ App.ActiveDocument.BuiltInDocumentProperties . _Value)

Константи, необхідні звернення до властивостей документа на ім'я, наведено у лістинге 3 .

Отже, у даному розділіми вивчили основні операції, які найчастіше застосовуються під час автоматизації Microsoft Word. Звичайно, можливості автоматизації Word далеко не вичерпуються наведеними прикладами, проте я сподіваюся, що, керуючись основними принципами створення контролерів Word, викладеними в цій статті, і відповідним довідковим файлом, ви зможете ними скористатися - ми з вами вже переконалися, що це зовсім не так складно.

Існує три типи об'єктів Excel, які можуть бути створені безпосередньо за допомогою контролера. Ці об'єкти та відповідні програмні ідентифікатори перераховані нижче.

Всі решта об'єкти Excelє званими внутрішніми об'єктами.

Невеликий фрагмент об'єктної моделі Microsoft Excel зображено на рис.2:

Основним в об'єктній моделі Excel є об'єкт Application, який містить колекцію Workbooks об'єктів типу WorkBook. Кожен об'єкт типу WorkBook містить колекцію WorkSheets-об'єктів типу WorkSheet, Charts типу Chart та ін. Маніпуляція робочими книгами, їх аркушами, осередками, діаграмами реально здійснюється шляхом звернення до властивостей та методів цих об'єктів.

Нижче ми розглянемо найпоширеніші завдання, пов'язані з автоматизацією Microsoft Excel. Якщо вам зустрілося завдання, що не збігається з жодною з перерахованих, ви можете спробувати знайти відповідний приклад на Visual Basic у довідковому файлі VBAXL9.CHM, або, як і у випадку Microsoft Word, записати відповідний макрос і проаналізувати його код.

Запуск Microsoft Excel, створення та відкриття робочих книг

Для створення прикладів використання Microsoft Excel можна використовувати код створення контролера, наведений у розділі<Общие принципы создания контроллеров автоматизации>, Замінивши перший оператор у наведеному прикладі на наступний:

AppProgID:="Excel.Application";

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

Вивчення створення контролерів Excel ми почнемо зі створення та відкриття робочих книг.

Створити нову робочу книгу Excelможна, використовуючи метод Add колекції Workbooks об'єкта Application:

App.WorkBooks.Add;

Для створення робочої книги на основі шаблону слід вказати його ім'я як перший параметр методу Add:

App.WorkBooks.Add("C:\Program Files\Microsoft _ Office\Templates\1033\invoice.xlt");

Як перший параметр цього методу можна також використовувати такі константи:

Const xlWBATChart = $FFFFEFF3; //Робоча книга складається з аркуша з діаграмою xlWBATWorksheet = $FFFFEFB9; //робоча книга складається з аркуша з даними

У цьому випадку робоча книга міститиме один аркуш типу, заданого зазначеною константою (графік, звичайний аркуш з даними та ін.)

Для відкриття існуючого документа слід скористатися методом Open колекції WorkBooks:

App.Documents.Open("C:\MyExcelFile.xls");

Зазначимо, що властивість ActiveWorkBook об'єкта Excel.Application вказує на поточну активну робочу книгу серед однієї чи кількох відкритих. Крім цього до робочої книги можна звертатися за її порядковим номером, наприклад до другої відкритої робочої книги можна звернутися так:

App.WorkBooks

Зверніть увагу на те, що у Delphi при використанні пізнього зв'язування синтаксис, що використовується для звернення до членів колекцій об'єктів Excel, відрізняється від синтаксису, що використовується для звернення до об'єктам Word- у випадку Word ми використовували метод Item, а у випадку Excel ми звертаємося до членів колекції як елементів масиву. Якщо ви використовуєте Visual Basic, синтаксис, який використовується для звернення до членів колекцій, буде однаковим для всіх колекцій Microsoft Office.

Зробити робочу книгу активною можна за допомогою методу Activate:

App.WorkBooks.Activate;

Наступне, чого слід навчитися – це зберігати робочі книжки у файлах.

Збереження, друк та закриття робочих книг Microsoft Excel

Закриття документа може бути здійснено за допомогою методу Close:

App.WorkBooks.Close;

App.ActiveWorkBook.Close;

Метод Close має кілька необов'язкових (у разі пізнього зв'язування) параметрів, які впливають правила збереження робочої книги. Перший із параметрів приймає значення True або False і впливає на те, чи зберігати зміни, внесені до робочої книги. Другий параметр (типу Variant) - ім'я файлу, у якому потрібно зберегти робочу книгу (якщо до неї було внесено зміни). Третій параметр, що також приймає значення True або False, впливає на те, чи слід пересилати документ наступному користувачу електронною поштою, і може бути проігнорований, якщо ця функціональність не використовується.

App.ActiveWorkBook.Close(True,"C:\MyWorkBook.xls");

App.ActiveWorkBook.Save;

App.ActiveWorkBook.SaveAs("C:\MyWorkBook.xls");

Метод SaveAs має більше десятка параметрів, що впливають на те, як саме зберігається документ (під яким ім'ям, з паролем або без нього, яка кодова сторінка для тексту, що міститься в ній та ін.).

Закрити сам Excel можна за допомогою Quit об'єкта Excel.Application. У Excel цей метод параметрів немає.

Висновок документа Excelна пристрій друку можна здійснити за допомогою методу PrintOut об'єкта WorkBook, наприклад:

App.ActiveWorkBook.PrintOut;

Якщо потрібно змінити параметри друку, слід вказати значення відповідних параметрів методу PrintOut (у разі Excel їх вісім).

Звернення до аркушів та осередків

Звертання до аркушів робочої книги здійснюється за допомогою колекції WorkSheets об'єкта WorkBook. Кожен член цієї колекції є об'єктом WorkSheet. До члена цієї колекції можна звернутися за його порядковим номером, наприклад:

App.WorkBooks.WorkSheets.Name:= _ "Сторінка 1";

Наведений вище приклад ілюструє, як можна змінити ім'я аркуша робочої книги.

До аркуша робочої книги можна звернутися і по імені, наприклад:

App.WorkBooks.WorkSheets["Sheet1"].Name:= _ "Сторінка 1";

Звертання до окремих осередків листа здійснюється за допомогою колекції Cells об'єкта WorkSheet. Наприклад, додати дані в комірку B1 можна так:

App.WorkBooks.WorkSheets["Sheet1"].Cells.Value:="25";

Тут перша з координат осередку вказує на номер рядка, друга - номер стовпця.

Додавання формул у комірки проводиться аналогічним способом:

App.WorkBooks.WorkSheets["Sheet1"] _ .Cells.Value:= " =SUM(B1:B2)";

Очистити комірку можна за допомогою методу ClearContents.

Форматування тексту в осередках здійснюється за допомогою властивостей Font та Interior об'єкта Cell та їх підвластивостей. Наприклад, наступний фрагмент коду виводить текст у комірці червоним жирним шрифтом Courier кегля 16 на жовтому тлі:

App.WorkBooks.WorkSheets.Cells.Interior _ .Color:= clYellow; App.WorkBooks.WorkSheets.Cells.Font _ .Color:= clRed; App.WorkBooks.WorkSheets.Cells _ .Font.Name:= "Courier"; App.WorkBooks.WorkSheets.Cells _ .Font.Size:= 16; App.WorkBooks.WorkSheets.Cells _ .Font.Bold:= True;

Програмний ідентифікатор

Відгуки про майстер-класи та тренінги

Особистий графік проходження уроків – це просто знахідка!

Доброго дня, Дмитре! Мені дуже сподобалося проходити навчання за Вашою програмою. Сподобався зміст (досить багато ситуацій розглянуто), організація (особистий графік проходження уроків - це знахідка!), подача (все дуже зрозуміло і зрозуміло).

Особливо мені сподобалося, коли Ви вирішували завдання у прямому ефірі, я завжди прошу вчителів думати вголос, тому що так доходить саме логіка міркувань, логіка пошуку та вирішення проблем.

Тепер як у дитячому вірші:

як добре вміти писати,

не треба до друга чіплятися,

не треба кликати,

не треба чекати,

а можна взяти та написати! (Для себе полегшення роботи)

Велике дякую!

Тетяна Богославськапро практичний тренінг

У лютому-2013 я вже брав участь у вебінарі (блок "Практик" та "Спеціаліст"), які вів Дмитро.

Листопадовий-2013 тренінг у мене вже другий. Буде можливість і цікава тема - обов'язково постараюсь взяти участь у вебінарах, т.к. вони справді інформативні, цікаві й головне - після закінчення є віддача як якісних результатів у роботі.

Не розтікатимуся думкою по дереву, тільки конкретика:

1. Доступно по грошам;

2. Зрозуміле пояснення матеріалу на прикладах із практики;

3. Оперативні та кваліфіковані відповіді на питання під час тренінгу, у форумі та на пошту;

4. Для підтримки "форми" та закріплення навичок - дуже рекомендую подібні вебінари та майстер-класи, де викладає Дмитро.

Андрій Аганін про практичний тренінг

З великим задоволенням відвідав би ще якийсь тренінг

Доброго дня, Дмитре!

Дякую за тренінг! Я один із трьох Ваших учнів, хто виконав усі Ваші завдання. Було дуже цікаво та захоплююче. Якісь завдання виявилися простими, а якісь дуже складними - це дуже корисний досвід. час. З іншого боку, не вистачало живого спілкування, під час якого можна було ставити запитання. З великим задоволенням відвідав би ще якийсь тренінг. Ваша манера викладання - дуже просто і зрозуміло пояснювати складні речі, дуже допомагає в освоєнні матеріалу.

Сергій Борзенковпро практичний тренінг

Наша група була одностайна)

Вчора 20.11.2012 відбувся перший вебінар (сподіваюся не останній), який проводив Дмитро.

Трохи про свої враження.

1. Ще щодо його безкоштовних відеоуроків дуже сподобалося його манера викладу матеріалу. За своїм досвідом знаю, що мати знання з якогось питання та вміння роз'яснити іншим – це ДВІ величезні різниці.

На щастя, Дмитро має як багатий досвід, так і викладацькі нахили. Пояснює все доступно та зрозуміло.

2. Під час проведення вебінару він пояснював, який необхідно отримати результат, та чистого листаписав макрос, даючи пояснення по тій чи іншій команді. Відповідав на запитання, які надходили від "учнів". Відразу хочу наголосити, що питань було мало.

Подробиці Категорія: Excel Розміщено: 28 грудня 2017

Автоматизація складання виконавчої документації з будівництва в Excel

Найчастіше, коли говорять про роботу в офісних додатках, мається на увазі використання ПК як друкарська машинка і, якщо чесно, це досить дорога заміна фізичним механізмам, якщо не користуватися можливостями який дає нам ПК. Давайте про це і поговоримо.

Вступ.

На мій погляд ПК з'явився як інструмент для вирішення принципу автоматизації рутинних процесів і в цьому він страшенно гарний. Крім того розвиток функціональних програмє історія створення інструментів для реалізації переведення авральних завдань у рутинні дії, як наслідок поглиблення поділу праці. Проте є області, зокрема. та документообігу, де на сьогоднішній день ПК використовується саме як друкарська машинка у т.ч. і тому, що серйозних розробок не велося через те, що оклади людей сидять у накладних витратах і, як наслідок, не великі, що не скажеш про зростаючі обсяги документообігу.

Отже, поговоримо про будівництво, саме про складання Виконавчої документації (далі ВД).

про Виконавчу документацію

Точніше про її текстову складову. Якщо коротко, то ВД є набір актів, журналів та інших документів, креслень, схем які складаються на кожен етап і навіть операцію (групи операцій) у будівництві, для підтвердження/відхилення виконуваних робіт проекту. Такі документи суцільно шаблонні, їх перелік, залежно від виду робіт, регламентований, і вони ведуться відповідно до фактичного графіка робіт, що формуються, формалізуючи затвердженою комісією правильність/відступ робіт проекту.

Велика частина робіт закривається за формою Акту огляду прихованих робіт (затвердженим наказом Федеральної служби з екологічного, технологічного та атомного нагляду від 26 грудня 2006 року N 1128). .Далі АОСР).

Початкові дані для автоматизації.

Тому візьмемо форму АОСР за основу. Отже, ми маємо шаблон документа, до якого заноситься наступна інформація:

Постфікс номера акта;
- Найменування об'єкта капітального будівництва;
- юридичні дані про учасників будівництва (Забудовник або Замовник; Особа, яка здійснює будівництво; Особа, яка здійснює підготовку проектної документації;
Особа, яка здійснює будівництво, що виконала роботи, що підлягають огляду; інші особи.)
- перелік осіб з найменуванням організацій, посад та наказів, що підтверджують їх повноваження;
- найменування виконаних робіт;
- строки виконання робіт;
- перелік робіт, що входять до виконаних робіт;
- посилання на НТД та розділи проекту/тех.документації;
- Посилання на виконавчі схеми, акти випробувань (якщо такі потрібні);
- перелік матеріалів, що використовуються з посиланнями на документи, що підтверджують їх відповідність (паспорти, сертифікати тощо)

Думки про принципові методи вирішення задачі

Отже, у першому наближенні можна просто створити наочну таблицю, в якій призначивши відповідні однотипні поля кожному акту ми отримаємо наочну онучу схеми виконання робіт на об'єкті. І у цьому немає нічого нового. Отже, нам необхідно зв'язати форму з осередками в таблицях даних і тут є два варіанти:

1. Злиття з файлом Word
2. Заповнення з допомогою макросів шаблону з урахуванням Excel.

Кожен із цих методів має плюси і мінуси, але т.к. злиття здійснює заміну в реальному часі, то мною було прийнято рішення вибрати другий пункт, який у реальному часі злиття не забезпечує і щоразу необхідно буде здійснювати виведення актів, у разі коригування даних, заново. Це пов'язано з тим, що мені часто потрібна історія моїх дій.

Отже, тепер ми упираємося у 2 завдання:

1. Заповнення шаблону на основі табличних даних
2. Які поля достатньо ввести один раз, які змінюватиметься час від часу і які поля відрізнятимуться у кожному акті.

Вирішуючи завдання №2, ми винесемо на окремий лист ті дані, які будуть єдині в рамках об'єкта/розділу проекту будівництва - це:

Спойлер

На поточному аркуші заповнимо лише один раз, а для інших актів просто проставимо посилання на ці значення:

Спойлер

І поля, які змінюватимуться у кожному акті:

Спойлер

Тепер про зручності, якщо записати ПІБ відповідальних осіб, їхню організацію, наказ про призначення з датою, то за допомогою інструмента «перевірка даних» можна занести їхні прізвища до спойлера, а формулою підтягувати їх регалії.

ЯСЛИПОМИЛКА(ДВССИЛ(ЗЧЕПИТИ( "Дані для проекту"!; АДРЕСА ((ПОШУКПОЗ (E30 ; "Дані для проекту"!$G$15:$G$34;0 ))+14 ;6 )));"-" )

Тобто. на аркуші "Дані для проекту" в діапазоні $G$15:$G$34, в 6м стовпці шукаємо значення в осередку Е30, і як тільки знаходимо нехитрим методом перетворимо на адресу, яка буде перетворена на посилання формулами.

Нова проблема вже упирається в довжину рядка, якщо використовувати шрифт Times New Roman №10, то довжина тексту, яка буде виведена на друк, не перевищує 105 символів. Тобто. ми упираємося у необхідність створювати милицю для переносів. Отже код функції на VBA:

Function PatrOfString(StringOfTable As String , Nnumber As Byte) As String Dim МасивБлоків(1 To 10 ) As String Dim i As Integer Dim As Integer Dim As Integer Dim As Integer For i = 1 To 10 Let (i) = " " Next i Let k = 1 Let p = Len (StringOfTable) Let p1 = Len (StringOfTable) For i = 1 To Round (Len (StringOfTable) / 105 ) + 1 Step 1 If p > 0 And p< 105 Then If k <= p1 Then Let МассивБлоков(i) = Mid $(StringOfTable, k, p) Else If Mid (StringOfTable, k, 1 ) = " " Then If k <= p1 Then Let МассивБлоков(i) = Mid $(StringOfTable, k, 105 ) Let p = p - 105 k = k + 105 Else j = 105 * i If j - k >= 105 Then j = k + 105 End If Do j = j - 1 Loop While Mid $(StringOfTable, j, 1 )<>" Let МасивБлоків(i) = Mid $(StringOfTable, k, j - k + 1 ) Let p = p - (j - k + 1 ) Let k = j + 1 End If End If Next i If Nnumber - 1 > 0 Then If МасивБлоків(Nnumber) = МасивБлоків(Nnumber - 1 ) Then МасивБлоків(Nnumber) = " " End If PatrOfString = МасивБлоків(Nnumber)

Тобто. ми спершу забираємо текст, потім вирізаємо 105 символів, шукаємо з кінця перший символ пробілу, як його знаходимо, то закидаємо в перший рядок масиву текст довжиною з першого символу за номером знайденого пробілу. Потім продовжуємо операцію до тих пір, поки текст не закінчиться або заб'ється вивідний масив. На даному етапі він обмежений пам'яттю 10 рядків. Потім ми виводимо за посиланням зміст потрібного рядка з 1-10. З мінусів рішення - забивається пам'ять, і кожного нового запиту здійснюється перерахунок заново. Але милиця працює.

Тепер виведення у типовий шаблон АОСР. Є знову два варіанти, або вручну прописувати зіставленню стовпцю (/рядки у разі горизонтально розташованих даних під кожен акт), це буде довго і ресурсноємно підганяти кожен новий шаблон чи зміни під таблиці даних. Тому робимо оптимізацію. Дані на кожен один акт розташовуватимуться вертикально, а зіставлення керуючої комбінації символів (на латиниці, тому що самі акти суцільно на кирилиці) будуть рядки з інформацією в цих актах, таким чином у подвійному вкладеному циклі пошуком у тексті керуючих символів ми зіставимо потрібне значення колонки.

Do wb.Worksheets( "Приклад акту вхідного контролю").Copy after:=Worksheets(Worksheets.Count) Set новийаркуш = wb.Worksheets(Worksheets.Count) For x = 1 To 15 Step 1 " Перебираємо стовпці в аркуші "Приклад акту вхідного контролю" For y = 1 To 71 Step 1 " Перебираємо рядки в аркуші "Приклад акту вхідного контролю" If Sheets(новийЛист.Name).Cells(y, 20 ) = 1 Then Let k = CStr Шукаємо тільки якщо в осередку щось є If k<>"" Then For i = 1 To Коль_воЭл_овМассиваДаних Step 1 Let k = Replace (k, arrПосиланняДаних(i), Worksheets().Cells(i, НомерСтовпця)) Next i новийЛист.Cells(y, x) = k End If End If Next y Next x Якщо ви хочете додати нові дані для автозаповнення, продовжуйте цей список. Осередки мають координати формату Cells(3, 2), де 3 - приклад номера рядка, 2 - приклад номера стовпця " Щоб легко впізнати номер стовпця, можна увімкнути стиль посилань R1C1 " (Файл -> Параметри -> Формули -> галочка на полі "Стиль посилань R1C1") або задавати координати у форматі Cells(1, "A"), де 1 - приклад номера рядка, "А" - приклад буквеного позначеннястовпця Rem -= Уточнюємо ім'я файлу та поточний шлях до папки, звідки запущено макрос =- Let Ім'яФайлу = Ім'яФайлу + CStr (Worksheets( "БД для вхідного контролю (2)").Cells("1" , НомерСтовпця)) + "-" Let Ім'яФайлу = Ім'яФайлу + CStr (Worksheets( "БД для вхідного контролю (2)").Cells("2" , НомерСтовпця)) + ".xlsx" НовийШлях = Replace (ThisWorkbook.FullName, ThisWorkbook.Name, Ім'яФайлу) Application.DisplayAlerts = False вимикаємо висновок попереджень Sheets(новийЛист.Name).Copy Копіюємо поточний лист у нову книгу ActiveWorkbook.SaveAs Filename:=НовийШлях, _ FileFormat:=51 ActiveWindow.Close Sheets(новийЛист.Name).Delete " Видаляємо створений лист Application.DisplayAlerts = True " Включаємо виведення попереджень назад Let Номер Стовпця = Номер Стовпця + 1 Loop While Номер Стовпця<= КонечныйНомерСтолбца End Sub

Ну і останній момент на даному етапі - ми упираємося в продуктивність системи і при великій кількості актів їх висновок займатиме годинник. Щоб прискорити процес я використовую наступний варіант: Копіюю вміст листа з даними в новий лист макросом, він отримує у своєму імені циферку (2), потім запускається ще один макрос, що прискорює Excel, але відключає ряд функціоналу:

"Прискорюємо Excel шляхом відключення всього "гальмівного" Public Sub AccelerateExcel() "Більше не оновлюємо сторінки після кожної дії Application.ScreenUpdating = False "Розрахунки переводимо в ручний режим Application.Calculation = xlCalculationManual "Відключаємо події Application.EnableEvents = False "Не відображаємо межі осередків If Workbooks.Count The ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False End If "Відключаємо статусний рядок Application.DisplayStatusBar = False "Вимикаємо повідомлення Excel Application.DisplayAlerts = False End Sub

А після виведення всіх даних з форм я проганяю аналогічний макрос де тим же змінним надаю значення true і видаляю дублюючий лист, що б не заважав.

(за матеріалами https://habrahabr.ru/post/344956/)

Якщо ви найчастіший користувач MS Excel, Вам напевно доводиться щодня виконувати однотипні операції. У цьому випадку макроси Excel допоможуть записати послідовність дій у вигляді набору команд VBA. Такий спосіб відмінно підійде для автоматизації найпростіших завдань. Якщо йдеться про складніші завдання, користувачі з навичками програмування можуть автоматизувати операції за допомогою VBA проектів.

Надбудова «Автоматизація» пропонує новий підхід до автоматизації рутинних завдань в Excel:

  • Створення команд у простій таблиці Excel замість об'ємних VBA проектів
  • Автоматизація навіть складних та багатоетапних операцій
  • Автоматизація можливостей XLTools: SQL запити, Експорт CSV, Редизайн таблиці, т.д.
  • Створення кнопок на панелі інструментів
  • Для просунутих користувачів та розробників

Не обов'язково бути знавцем VBA. Якщо ваші бізнес-процеси в Excel забирають занадто багато часу, наша команда XLTools допоможе їх автоматизувати.

Додати «Автоматизацію» в Excel 2019, 2016, 2013, 2010, 2007

Підходить для: Microsoft Excel 2019 – 2007, desktop Office 365 (32-біт та 64-біт).

Як працювати з надбудовою:

Як автоматизувати операції в Excel без VBA [Завантажити посібник]

Найчастіше VBA макроси Excel розростаються до сотень рядків коду, дуже незручних у роботі. Надбудова XLTools «Автоматизація» дозволяє писати команди у простих та компактних таблицях Excel. Табличне уявлення більш інформативно, наочно та його легше редагувати. Ви також можете додати власні кнопки до панелі інструментів Excel для виконання власних команд автоматизації.

Надбудова "Автоматизація" - це універсальний інструмент для автоматизації практично будь-яких команд та їх послідовностей:

  • Автоматизація SQL запитів до таблиць Excel: SELECT, GROUP BY, JOIN ON тощо.
  • Автоматичне перетворення зведених таблиць у плоский список
  • автоматичний експорт таблиць Excel у файл CSV
  • Автоматичне вилучення даних з інших книг Excel або CSV файлів
  • Автоматична фільтрація таблиць тощо.

Просто напишіть команду, використовуючи посібник > Натисніть «Виконати команди» > Готово! Генерація результату займе лише кілька секунд.

СКАЧАТИ ПОСІБНИК: приклади, шаблони, синтаксис та рядкові коментарі (zip/xlsx, 260 КБ).

Приклад: як автоматизувати SQL запит до таблиць Excel

Розглянемо приклад роздрібного магазину. Припустимо, вам необхідно підготувати звіт про продаж за квартал. Ви можете скористатися надбудовою SQL Запити та виконати запит до вихідних даних. Але якщо вам доводиться готувати цей звіт регулярно, цей SQL запит можна автоматизувати.

1. Підготуйте вихідні дані до запиту SQL. Застосуйте до них формат таблиці, інакше SQL не зможе обробити дані:

  • Виберіть діапазон «Журнал даних прайс-листа та продажів».
  • На вкладці «Головна» натисніть «Форматувати як таблицю» > Застосуйте стиль таблиці.
  • На вкладці «Конструктор» надайте таблиці ім'я «Продажи2014».

2. Додайте новий аркуш, напр., «АвтоКоманда», та створіть таблицю команди автоматизації SQL:

  • XLTools.SQLSelect- введіть назву команди точно так. Назва має бути у двох об'єднаних осередках.
  • SQLQuery – наберіть команду запиту звичним чином. Зверніть увагу: надбудова використовує синтаксис SQLite.
    Порада: замість друку тексту запиту вручну, використовуйте інтуїтивний редактор SQL Запитів та скопіюйте скрипт у таблицю автоматизації.
  • ApplyTableName – введіть назву таблиці результату.
    Результат запиту автоматично генерується у форматі таблиці. У разі потреби до неї можна створювати наступні запити.
  • OutputTo – вкажіть, куди слід помістити результат запиту.

Увага:щоб SQL розпізнавав усі посилання, не використовуйте прогалини в назвах робочих аркушів, книг та таблиць.

3. Виконайте команду автоматизації SQL:

  • Перейдіть до діапазону команди автоматизації > Натисніть кнопку «Виконати команди» на вкладці XLTools.
  • Готово, результат згенерується за секунди.
    У цьому прикладі SQL запит отримав дані за 3 квартал 2014 року.

4. Створіть власні кнопки на панелі інструментів Excel.

У кожній книзі Excel можна створити до 3-х кнопок, прив'язаних до ваших власних команд автоматизації:

  • Натисніть кнопку «Створити кнопки» на вкладці XLTools.
  • Назвіть кнопці ім'я, напр. "Звіт по кварталах" > ​​Вкажіть діапазон таблиці команди.
  • Натисніть «Зберегти» > Кнопка з'явиться на вкладці XLTools.

Тепер ви можете легко створити квартальний звіт, натиснувши лише одну кнопку.

Постали запитання чи пропозиції? Залишіть коментар нижче.

Ця стаття присвячена темі, можливо, і не новій, але, як показують листи читачів, як і раніше актуальною - автоматизації програм Microsoft Office. Багато розробників у процесі роботи над своїми проектами (неважливо, за допомогою якого засобу розробки - Delphi, C++Builder, Visual Basic…) нерідко застосовують сервіси, що надаються Microsoft Office, наприклад, побудова зведених таблиць і діаграм за допомогою Microsoft Excel, генерацію та друк документи за допомогою Microsoft Word і т.д. Нерідко користувачі, які звикли використовувати програми Microsoft Office у повсякденній роботі, самі наполягають на застосуванні таких сервісів або просто на збереженні звітів та інших документів в одному з форматів Microsoft Office. Зазначимо, що потенційні побажання подібного роду компанією Microsoft враховані досить давно - практично все, що може зробити користувач будь-якої програми Microsoft Office за допомогою меню, клавіатури та інструментальної панелі, може бути зроблено і автоматично, тобто або з VBA-програми, або з програми, створеного за допомогою одного із засобів розробки. Іншими словами, програми Microsoft Office є програмованими. Програмованість у випадку означає можливість управління даним додатком з допомогою макромов чи з допомогою інших додатків. Усі компоненти Microsoft Office підтримують той самий макромову: Visual Basic for Applications (VBA), що дозволяє створювати додатки безпосередньо всередині документів Office (це називається «рішення на базі Microsoft Office»). Управління компонентами Office з інших програм здійснюється за допомогою автоматизації (Automation, раніше - OLE Automation) - всі програми Microsoft Office є серверами автоматизації (або COM-серверами). Для створення таких програм придатні будь-які засоби розробки, що дозволяють створювати контролери автоматизації (COM-клієнти). Найчастіше цієї мети використовується Visual Basic, але може бути і Delphi, і C++Builder, і Visual C++. Однак, перш ніж обговорювати можливості тих чи інших засобів розробки, слід розібратися, що таке автоматизація.

Коротко про автоматизацію

Автоматизація - це одна з можливостей, що надаються технологією Microsoft Component Object Model (COM). Не вдаючись у подробиці реалізації цієї технології, зауважимо, що вона використовується додатками (званими COM-серверами) для надання доступу до їх об'єктів, а також до властивостей та методів цих об'єктів іншим додаткам (називаються COM-клієнтами), якими можуть бути засоби розробки . Наприклад, текстовий процесор, як COM-сервер, може надавати іншим додаткам доступ до документа, абзацу, закладці за допомогою відповідних об'єктів. Для іменування (і упізнання) COM-серверів зазвичай використовуються спеціальні рядкові позначення – програмні ідентифікатори (Programmatic Identifier, ProgID). Вони потрібні для того, щоб операційна система могла за допомогою цих ідентифікаторів визначити, в якому саме каталозі (або на якому комп'ютері локальної мережі, якщо використовується той чи інший спосіб віддаленого доступу до сервера) розташований файл сервера автоматизації, що виконується, і запустити його на виконання. Про те, які саме програмні ідентифікатори застосовуються для програми Microsoft Office, буде сказано в розділах, присвячених цим програмам.

Об'єкти автоматизації з погляду програмування мало чим від звичайних об'єктів, знайомих з теорії та практики объектно-ориентированного програмування. Як і звичайні об'єкти, вони мають властивості та методи. Властивість – це характеристика об'єкта; наприклад, властивістю абзацу (об'єкт Paragraph) може бути стиль (Style). Методом називається дія, яку можна виконати з об'єктом (наприклад, можна зберегти документ за допомогою методу SaveAs об'єкта Document).

Нерідко сервери автоматизації містять набори однотипних об'єктів, які називаються колекціями. Наприклад, текстовий процесор може містити колекцію документів, а кожен документ – колекцію абзаців.

Як дізнатися, які об'єкти доступні на серверах автоматизації? Для цього в комплект поставки будь-якого сервера автоматизації входить документація та файли довідки, що описують їх об'єктну модель. Якщо брати програми Microsoft Office 2000, це довідкові файли для програмістів на Visual Basic for Applications VBAxxx9.CHM (для Microsoft Office 97 - VBxxx8.HLP відповідно). Зазначимо, що за умовчанням вони не встановлюються, оскільки потрібні розробникам, а не звичайним користувачам.

Вся інформація про об'єкти, необхідна для контролерів автоматизації, міститься в бібліотеках типів. Бібліотеки типів зберігаються у спеціальному бінарному форматі і зазвичай представлені у вигляді файлів з розширеннями *.olb або *.tlb, а також можуть міститися всередині файлів, що виконуються (*.exe) або бібліотек, що динамічно завантажуються (*.dll). Бібліотеки типів можна переглядати за допомогою утиліти OleView, що входить до складу Microsoft Platform SDK, а засоби розробки фірми Borland містять власні утиліти перегляду бібліотек типів.

Закінчуючи це більш ніж короткий вступ до автоматизації, зупинимося також на понятті зв'язування. Зв'язуванням називається спосіб, за допомогою якого змінна або клас програми-контролера посилається на об'єкт автоматизації. Таких способів існують два: пізнє зв'язування та раннє зв'язування.

Пізнє зв'язування означає, що реальне посилання на об'єкт у змінній або класі з'являється на етапі виконання програми-контролера. Цей спосіб зазвичай повільніший, ніж раніше зв'язування, але він доступний у всіх засобах розробки, що дозволяють створювати контролери автоматизації, і менш чутливий до того, чи всі параметри методів перераховані при їх викликах у коді програми-контролера. При пізньому зв'язуванні коректність викликів методів перевіряється в останній момент їх здійснення, тобто етапі виконання докладання, а чи не на етапі його компіляції.

Раннє зв'язування означає, що реальне посилання об'єкт автоматизації з'являється вже етапі компіляції. Тому код програми-контролера вимагає посилання на бібліотеку типів (або на спеціальний модуль, що є інтерфейсом до неї), і це призводить до генерації в цьому додатку класів з тими ж властивостями і методами, що і в об'єктів автоматизації, що робить можливими синтаксичну перевірку імен методів на етапі компіляції та доступ до іменованих константів, що містяться в бібліотеці типів. Зазначимо, однак, що далеко не всі засоби розробки, що підтримують пізнє зв'язування, також підтримують раннє зв'язування.

Закінчивши екскурс в COM та автоматизацію, повернемося до питання про те, які засоби розробки зручно застосовувати для створення контролерів автоматизації.

VBA та засоби розробки контролерів автоматизації

Як вже було сказано вище, контролери автоматизації можна створювати за допомогою різних засобів розробки, і якщо ви вже використовуєте якийсь інструментальний засіб, що підтримує створення контролерів автоматизації, можна саме ним і скористатися. Єдине, що слід зробити – це дізнатися, чи підтримується вашим засобом розробки раніше зв'язування, якщо ви плануєте його використовувати. Приклади найпростіших контролерів автоматизації (як правило, для Microsoft Word або Microsoft Excel), що дають уявлення про те, як викликаються методи сервера, можна знайти в комплекті поставки більшості сучасних засобів розробки.

Освоєння об'єктної моделі автоматизованого сервера можна розпочати із запису необхідної послідовності дій у вигляді макросу за допомогою VBA. Створити макрос можна, вибравши з меню Microsoft Office пункт Tools | Macro | Record New Macro. Перегляд отриманого макросу в редакторі коду VBA зазвичай дозволяє зрозуміти, як має виглядати код, що реалізує цю послідовність дій.

Обговоривши можливі засоби розробки контролерів автоматизації, можна нарешті перейти до самих програм Microsoft Office, до їх об'єктних моделей та їх використання. Як засіб розробки для наведених нижче прикладів використовується Borland Delphi 5, але оскільки в них наводиться послідовність виклику властивостей та методів об'єктів Microsoft Office, перенесення коду іншими мовами програмування не повинно викликати особливих труднощів. Якщо спеціально не зазначено, у цій статті у всіх прикладах використовується раннє зв'язування.

Об'єктні моделі Microsoft Office

Як було сказано вище, програми Microsoft Office надають контролерам автоматизації доступ до своєї функціональності за допомогою своєї об'єктної моделі, що є ієрархією об'єктів. Об'єкти можуть надавати доступ до інших об'єктів за допомогою колекцій.

Як ілюстрація того, як виглядає ієрархія об'єктів Microsoft Office, наведемо невеликий фрагмент об'єктної моделі Microsoft Word (рис.1):

Тут ми скористалися функціями GetActiveOleObject і CreateOleObject для підключення до вже запущеної копії програми-сервера або запуску нової, якщо сервер не запущений, що призводить до того, що у варіантну змінну міститься посилання на об'єкт Application відповідного сервера.

Наведена частина коду контролера в інших засобах розробки може виглядати інакше - вона не має прямого відношення до методів об'єктів Office, оскільки обумовлена ​​правилами виклику стандартних функцій OLE у Delphi (за винятком викликів методів Visible та Quit об'єкта Application). А ось все те, що має бути вставлено замість коментаря «Тут виконуються інші дії з об'єктами програми Office», у різних засобах розробки має виглядати більш менш однотипно - використовуючи створену варіантну змінну, ми маніпулюємо методами та властивостями об'єкта Application.

Насамкінець зробимо одне невелике зауваження щодо числа параметрів методів об'єктів автоматизації. У разі застосування пізнього зв'язування число зазначених у коді параметрів методу має збігатися зі своїми істинним числом (яке можна знайти у описі об'єктної моделі відповідного докладання). У цьому випадку цілком допустимим є наступний код:

незважаючи на те, що метод Quit об'єкта Application у деяких програмах Microsoft Office (наприклад, Microsoft Word) має параметри.

При використанні раннього зв'язування, наприклад при створенні контролерів за допомогою Delphi, слід більш суворо підходити до визначення параметрів - їх число і тип повинні відповідати опису методів у бібліотеці типів. Наприклад, у разі раннього зв'язування коректний код на Delphi для закриття документа Word зі значеннями всіх параметрів за замовчуванням матиме вигляд:

App.Quit (EmptyParam, EmptyParam, EmptyParam);

Винятком із цього правила є Visual Basic - це засіб розробки дозволяє не замислюватися про кількість параметрів методів написання коду.

Обговоривши загальні принципи створення контролерів автоматизації та дізнавшись, як це робиться засобами Borland Delphi, ми можемо перейти до розгляду автоматизації конкретних програм Microsoft Office. Почнемо з одного з найпопулярніших компонентів цього пакета – з Microsoft Word.

Програмні ідентифікатори та об'єктна модель Microsoft Word

Для програми-контролера доступні такі об'єкти:

Решта об'єктів Word є так званими внутрішніми об'єктами. Це означає, що вони не можуть бути створені власними силами; так, об'єкт Paragraph (абзац) не може бути створений окремо від документа, що містить його.

Якщо згадати, що основне призначення Word – робота з документами, можна легко зрозуміти ієрархію його об'єктної моделі (фрагмент її було показано на рис. 1). Основним об'єктом у ній, як і всіх інших додатках Microsoft Office, є об'єкт Application, що містить колекцію Documents об'єктів типу Document. Кожен об'єкт типу Document містить колекцію Paragraphs об'єктів типу Paragraph, Bookmarks типу Bookmark, Characters типу Character тощо. Маніпуляція документами, абзацами, символами, закладками реально здійснюється шляхом звернення до властивостей та методів цих об'єктів.

Нижче ми розглянемо найпоширеніші завдання, пов'язані з автоматизацією Microsoft Word. Якщо ж вам зустрілося завдання, що не збігається з жодною з перелічених, ви можете спробувати знайти відповідний приклад на Visual Basic у довідковому файлі VBAWRD9.CHM, або, як уже було сказано вище, записати необхідну послідовність дій у вигляді макросу і проаналізувати його код.

Створення та відкриття документів Microsoft Word

Для створення прикладів використання Microsoft Word можна використовувати код створення контролера, наведений вище, та модифікувати його, замінюючи коментарі кодом, що маніпулює властивостями та методами об'єкта Word.Application. Ми почнемо зі створення та відкриття документів.

Створити новий документ Word можна за допомогою методу Add колекції Documents об'єкта Application:

App.Documents.Add;

Як створити нестандартний документ? Дуже просто - потрібно вказати ім'я шаблону як параметр методу Add:

App.Documents.Add('C:\Program Files\ _ Microsoft Office\Templates\1033\Manual.dot');

Для відкриття існуючого документа слід скористатися методом Open колекції Documents:

App.Documents.Open('C:\MyWordFile.doc');

Зазначимо, що властивість ActiveDocument об'єкта Word.Application вказує на активний документ серед одного або декількох відкритих. Крім цього, до документа можна звертатися за його порядковим номером за допомогою методу Item; наприклад, до другого відкритого документа можна звернутися так:

App.Documents.Item(2)

Відзначимо, що нумерація членів колекцій Microsoft Office починається з одиниці.

Зробити документ активним можна за допомогою методу Activate:

App.Documents.Item(1).Activate;

Наступне, чого слід навчитися – це зберігати документ Word та закривати сам Word.

Збереження, друк та закриття документів Microsoft Word

App.Documents.Item(2).Close;

App.ActiveDocument.Close ;

Метод Close має кілька необов'язкових (у разі пізнього зв'язування) параметра, що впливають правила збереження документа. Перший впливає на те, чи зберігаються внесені в документ зміни, і приймає три можливі значення (відповідні константи рекомендується описати в додатку. Див. листинг 2):

Третій параметр приймає значення True або False і впливає на те, чи надсилати документ наступному користувачу електронною поштою. Якщо ця функціональність не застосовується, можна проігнорувати цей параметр.

Таким чином, при використанні цих параметрів закрити документ можна, наприклад:

App.ActiveDocument.Close(wdSaveChanges, _ wdPromptUser) ;

App.ActiveDocument.Save;

Цей метод також має кілька необов'язкових (у разі пізнього зв'язування) параметрів, перший з яких дорівнює True, якщо документ зберігається автоматично, і False, якщо потрібно виводити діалогову панель для отримання підтвердження користувача про збереження змін (якщо вони були зроблені). Другий параметр впливає на формат документа, що зберігається, і список його можливих значень збігається зі списком значень другого параметра методу Close.

Нагадуємо, що закрити сам Word можна за допомогою методу Quit об'єкта Word.Application. Цей метод має у загальному випадку три параметри, що збігаються з параметрами методу Close об'єкта Document.

Виведення документа на пристрій друку можна здійснити за допомогою методу PrintOut об'єкта Document, наприклад:

App.ActiveDocument.PrintOut;

Якщо потрібно змінити параметри друку, слід зазначити відповідні параметри методу PrintOut (у випадку Microsoft Word їх близько двадцяти).

Вставка тексту та об'єктів у документ та форматування тексту

Для створення абзаців у документі можна використовувати колекцію Paragraphs об'єкта Document, яка представляє набір абзаців цього документа. Додати новий абзац можна за допомогою методу Add цієї колекції:

App.ActiveDocument.Paragraphs.Add;

Для вставки тексту в документ, проте, застосовується не об'єкт Paragraph, а об'єкт Range, що представляє будь-яку безперервну частину документа (у тому числі і новостворений абзац). Цей об'єкт може бути створений у різний спосіб. Наприклад, можна вказати початковий і кінцевий символи діапазону (якщо такі є в документі):

Var Rng: Variant; ... Rng:= App.ActiveDocument.Range(2,4); //з ​​2-го по 4-й символи

або вказати номер абзацу (наприклад, щойно створеного):

Rng:= App.ActiveDocument.Paragraphs.Item(1).Range;

або вказати кілька абзаців, наступних поспіль:

Rng:= App.ActiveDocument.Range _ (App.ActiveDocument.Paragraphs.Item(3).Range.Start,_ App.ActiveDocument.Paragraphs.Item(5).Range.End)

Вставити текст можна за допомогою методів об'єкта Range InsertBefore (перед діапазоном) або InsertAfter (після діапазону), наприклад:

Rng.InsertAfter('Це вставляється текст');

Крім об'єкта Range текст можна вставляти за допомогою об'єкта Selection, що є властивістю об'єкта Word.Application і є виділеною частиною документа (цей об'єкт створюється, якщо користувач виділяє частину документа за допомогою миші, і може бути також створений за допомогою програми-контролера). Сам об'єкт Selection можна створити, застосувавши метод Select до об'єкта Range, наприклад:

Var Sel: Variant; ... App.ActiveDocument.Paragraphs.Item(3).Range.Select;

У наведеному вище прикладі у поточному документі виділяється третій абзац.

Якщо ми хочемо вставити рядок тексту в документ або замість виділеного фрагмента тексту, або перед ним, це можна зробити за допомогою наступного фрагмента коду:

Var Sel: Variant; ... Sel: = App.Selection; Sel.TypeText('Це текст, яким ми замінимо виділений фрагмент');

Зазначимо, якщо властивість Options.ReplaceSelection об'єкта Word.Application дорівнює True, виділений текст буде замінено на новий текст (цей режим діє за замовчуванням); якщо потрібно, щоб текст був вставлений перед виділеним фрагментом, а чи не замість нього, слід встановити цю властивість рівним False:

App.Options.ReplaceSelection:= False;

Символ кінця абзацу під час використання об'єкта Selection може бути вставлений за допомогою наступного фрагмента коду:

Sel.TypeParagraph;

До об'єкта Selection, як і об'єкта Range, можна застосувати методи InsertBefore і InsertAfter. У цьому випадку, на відміну від попереднього, текст, що вставляється, стане частиною виділеного фрагмента тексту.

За допомогою об'єкта Selection, використовуючи його властивість Font та властивості об'єкта Font, такі як Bold, Italic, Size… можна відформатувати текст. Наприклад, таким чином можна вставити рядок, виділений жирним шрифтом:

Sel.Font.Bold:= True; Sel.TypeText('Це текст, який ми виділимо _ жирним шрифтом.'); Sel.Font.Bold:= False; Sel.TypeParagraph;

Для накладання на текст певного заздалегідь стилю можна використовувати властивість Style цього ж об'єкта, наприклад:

Sel.Style:= 'Heading 1'; Sel.TypeText('Це текст, який стане _ заголовком'); Sel.TypeParagraph;

Нерідко документи Word містять дані інших програм. Найпростіший спосіб вставити такі дані в документ - використовувати метод Paste об'єкта Range:

Var Rng: Variant; ... Rng: = App.Selection.Range; Rng.Collapse(wdCollapseEnd); Rng.Paste;

Природно, в цьому випадку в буфері обміну вже повинні міститися дані, що вставляються.

Якщо потрібно помістити в буфер обміну частину документа Word, це можна зробити за допомогою Copy об'єкта Range:

Var Rng: Variant; ... Rng: = App.Selection.Range; Rng.Copy;

Наступне, чого потрібно навчитися - переміщення курсору в потрібне місце тексту, ніж ми й займемося у наступному розділі.

Переміщення курсору за текстом

Використовуючи метод Collapse, можна «стиснути» об'єкт Range або Selection, скоротивши його розмір до нуля символів:

Rng.Collapse(wdCollapseEnd);

Параметр цього методу вказує на початку або в кінці вихідного фрагмента виявиться новий об'єкт Range або Selection. Якщо ви використовуєте пізніше зв'язування і ваш засіб розробки - не Visual Basic, потрібно визначити відповідні константи у додатку:

Const wdCollapseStart = $00000001; //Новий об'єкт знаходиться на початку фрагмента wdCollapseEnd = $00000000; //Новий об'єкт знаходиться в кінці фрагмента

Переміщати курсор за текстом можна за допомогою методу Move об'єктів Range та Selection. Цей метод має два параметри. Перший вказує на те, в яких одиницях вимірюється переміщення - у символах (за замовчуванням), словах, реченнях, абзацах та ін. ). Наприклад, наступний фрагмент коду:

Rng.Move;

призведе до переміщення курсору на один символ вперед, а

Rng.Move(wdParagraph,3);

призведе до переміщення курсору на три абзаци вперед. Зазначимо, що цей метод використовує такі константи:

Const // Одиницею переміщення є: wdCharacter = $00000001; //символ wdWord = $00000002; //слово wdSentence = $00000003; //пропозиція wdParagraph = $00000004; // абзац wdStory = $ 00000006; // частина документа // напр., колонтитул, // зміст та ін) wdSection = $ 00000008; //розділ wdColumn = $00000009; //Колонка таблиці wdRow = $0000000A; //Рядок таблиці wdCell = $0000000C; / / клітинка таблиці wdTable = $ 0000000F; //таблиця

Нерідко для переміщення тексту використовуються закладки. Створити закладку в поточній позиції курсору можна шляхом додавання члена колекції Bookmarks об'єкта Document за допомогою методу Add, вказавши ім'я закладки як параметр, наприклад:

App.ActiveDocument.Bookmarks.Add('MyBookmark');

Перевірити існування закладки в документі можна за допомогою методу Exists, а переміститися на неї – за допомогою методу Goto об'єктів Document, Range або Selection:

Rng:= App.ActiveDocument.Goto(wdGoToBookmark, wdGoToNext, ‘MyBookmark’); Rng.InsertAfter('Текст, вставлений після закладки');

Значення констант для цього прикладу такі:

WdGoToBookmark = $FFFFFFFF; //перейти до закладки wdGoToNext = $00000002; //Шукати наступний об'єкт у тексті

Зазначимо, що з допомогою методу Goto можна переміщатися як на зазначену закладку, а й інші об'єкти (малюнки, граматичні помилки та інших.), і напрям переміщення також може бути різним. Тому список констант, які можуть бути використані як параметри даного методу, досить великий.

Створення таблиць

Створювати таблиці можна двома способами. Перший полягає у викликі методу Add колекції Tables об'єкта Document та послідовному заповненні осередків даними. Цей спосіб при пізньому зв'язуванні працює досить повільно.

Другий спосіб, набагато «швидший», полягає у створенні тексту з декількох рядків, що містять підрядки з роздільниками (як роздільник можна використовувати будь-який або майже будь-який символ, потрібно тільки, щоб він свідомо не зустрічався в даних, які будуть поміщені в майбутню таблицю ), та подальшої конвертації такого тексту в таблицю за допомогою методу ConvertToTable об'єкта Range. Нижче наведено приклад створення таблиці з трьох рядків і трьох стовпців цим способом (як розділювача, що є першим параметром методу ConvertToTable, використовується кома):

Var Rng: Variant; ... Rng: = App.Selection.Range; Rng.Collapse(wdCollapseEnd); Rng.InsertAfter('1, 2, 3'); Rng.InsertParagraphAfter; Rng.InsertAfter('4,5,6'); Rng.InsertParagraphAfter; Rng.InsertAfter('7,8,9'); Rng.InsertParagraphAfter; Rng.ConvertToTable(',');

Зазначимо, що зовнішній вигляд таблиці можна змінити за допомогою властивості Format, а також за допомогою властивостей колекції Columns, що представляє колонки таблиці, та колекції Rows, що представляє рядки таблиці об'єкта Table.

Звернення до властивостей документа

Властивості документа можна отримати за допомогою колекції BuiltInDocumentProperties об'єкта Document, наприклад:

Memo1.Lines.Add('Назва - ' + _ App.ActiveDocument.BuiltInDocumentProperties .Value); Memo1.Lines.Add( 'Автор - ' + _ App.ActiveDocument.BuiltInDocumentProperties . _ Value); Memo1.Lines.Add('Шаблон - ' + _ App.ActiveDocument.BuiltInDocumentProperties . _Value)

Константи, необхідні звернення до властивостей документа на ім'я, наведено у лістинге 3 .

Отже, у цьому розділі ми вивчили основні операції, які найчастіше застосовуються під час автоматизації Microsoft Word. Звичайно, можливості автоматизації Word далеко не вичерпуються наведеними прикладами, проте я сподіваюся, що, керуючись основними принципами створення контролерів Word, викладеними в цій статті, і відповідним довідковим файлом, ви зможете ними скористатися - ми з вами вже переконалися, що це зовсім не так складно. Програмні ідентифікатори та об'єктна модель Microsoft Excel

Існує три типи об'єктів Excel, які можуть бути створені безпосередньо за допомогою контролера. Ці об'єкти та відповідні програмні ідентифікатори перераховані нижче.

Решта об'єктів Excel є так званими внутрішніми об'єктами.

Невеликий фрагмент об'єктної моделі Microsoft Excel зображено на рис.2:

Основним в об'єктній моделі Excel є об'єкт Application, який містить колекцію Workbooks об'єктів типу WorkBook. Кожен об'єкт типу WorkBook містить колекцію WorkSheets-об'єктів типу WorkSheet, Charts типу Chart та ін. Маніпуляція робочими книгами, їх аркушами, осередками, діаграмами реально здійснюється шляхом звернення до властивостей та методів цих об'єктів.

Нижче ми розглянемо найпоширеніші завдання, пов'язані з автоматизацією Microsoft Excel. Якщо вам зустрілося завдання, що не збігається з жодною з перерахованих, ви можете спробувати знайти відповідний приклад на Visual Basic у довідковому файлі VBAXL9.CHM, або, як і у випадку Microsoft Word, записати відповідний макрос і проаналізувати його код.

Запуск Microsoft Excel, створення та відкриття робочих книг

Для створення прикладів використання Microsoft Excel можна використовувати код створення контролера, наведений у розділі "Загальні принципи створення контролерів автоматизації", замінивши перший оператор у наведеному прикладі на наступний:

AppProgID:= ‘Excel.Application’;

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

Вивчення створення контролерів Excel ми почнемо зі створення та відкриття робочих книг.

Створити нову робочу книгу Excel можна за допомогою методу Add колекції Workbooks об'єкта Application:

App.WorkBooks.Add;

Для створення робочої книги на основі шаблону слід вказати його ім'я як перший параметр методу Add:

App.WorkBooks.Add('C:\Program Files\Microsoft _ Office\Templates\1033\invoice.xlt');

Як перший параметр цього методу можна також використовувати такі константи:

Const xlWBATChart = $FFFFEFF3; //Робоча книга складається з аркуша з діаграмою xlWBATWorksheet = $FFFFEFB9; //робоча книга складається з аркуша з даними

У цьому випадку робоча книга міститиме один аркуш типу, заданого зазначеною константою (графік, звичайний аркуш з даними та ін.)

Для відкриття існуючого документа слід скористатися методом Open колекції WorkBooks:

App.Documents.Open('C:\MyExcelFile.xls');

Зазначимо, що властивість ActiveWorkBook об'єкта Excel.Application вказує на поточну активну робочу книгу серед однієї чи кількох відкритих. Крім цього до робочої книги можна звертатися за її порядковим номером, наприклад до другої відкритої робочої книги можна звернутися так:

App.WorkBooks

Зверніть увагу на те, що у Delphi при використанні пізнього зв'язування синтаксис, що використовується для звернення до членів колекцій об'єктів Excel, відрізняється від синтаксису, що використовується для звернення до об'єктів Word - у випадку Word ми використовували метод Item, а у випадку Excel ми звертаємося до членів колекції як до елементів масиву. Якщо ви використовуєте Visual Basic, синтаксис, який використовується для звернення до членів колекцій, буде однаковим для всіх колекцій Microsoft Office.

Зробити робочу книгу активною можна за допомогою методу Activate:

App.WorkBooks.Activate;

Наступне, чого слід навчитися – це зберігати робочі книжки у файлах.

Збереження, друк та закриття робочих книг Microsoft Excel

Закриття документа може бути здійснено за допомогою методу Close:

App.WorkBooks.Close;

App.ActiveWorkBook.Close;

Метод Close має кілька необов'язкових (у разі пізнього зв'язування) параметрів, які впливають правила збереження робочої книги. Перший із параметрів приймає значення True або False і впливає на те, чи зберігати зміни, внесені до робочої книги. Другий параметр (типу Variant) - ім'я файлу, у якому потрібно зберегти робочу книгу (якщо до неї було внесено зміни). Третій параметр, що також приймає значення True або False, впливає на те, чи слід пересилати документ наступному користувачу електронною поштою, і може бути проігнорований, якщо ця функціональність не використовується.

App.ActiveWorkBook.Close(True,'C:\MyWorkBook.xls');

App.ActiveWorkBook.Save;

App.ActiveWorkBook.SaveAs('C:\MyWorkBook.xls');

Метод SaveAs має більше десятка параметрів, що впливають на те, як саме зберігається документ (під яким ім'ям, з паролем або без нього, яка кодова сторінка для тексту, що міститься в ній та ін.).

Закрити сам Excel можна за допомогою Quit об'єкта Excel.Application. У Excel цей метод параметрів немає.

Виведення документа Excel на пристрій друку можна здійснити за допомогою методу PrintOut об'єкта WorkBook, наприклад:

App.ActiveWorkBook.PrintOut;

Якщо потрібно змінити параметри друку, слід вказати значення відповідних параметрів методу PrintOut (у разі Excel їх вісім).

Звернення до аркушів та осередків

Звертання до аркушів робочої книги здійснюється за допомогою колекції WorkSheets об'єкта WorkBook. Кожен член цієї колекції є об'єктом WorkSheet. До члена цієї колекції можна звернутися за його порядковим номером, наприклад:

App.WorkBooks.WorkSheets.Name:= _ 'Сторінка 1';

Наведений вище приклад ілюструє, як можна змінити ім'я аркуша робочої книги.

До аркуша робочої книги можна звернутися і по імені, наприклад:

App.WorkBooks.WorkSheets['Sheet1'].Name:= _ 'Сторінка 1';

Звертання до окремих осередків листа здійснюється за допомогою колекції Cells об'єкта WorkSheet. Наприклад, додати дані в комірку B1 можна так:

App.WorkBooks.WorkSheets['Sheet1'].Cells.Value:='25';

Тут перша з координат осередку вказує на номер рядка, друга - номер стовпця.

Додавання формул у комірки проводиться аналогічним способом:

App.WorkBooks.WorkSheets['Sheet1'] _ .Cells.Value:= ' =SUM(B1:B2)';

Очистити комірку можна за допомогою методу ClearContents.

Форматування тексту в осередках здійснюється за допомогою властивостей Font та Interior об'єкта Cell та їх підвластивостей. Наприклад, наступний фрагмент коду виводить текст у комірці червоним жирним шрифтом Courier кегля 16 на жовтому тлі:

App.WorkBooks.WorkSheets.Cells.Interior _ .Color:= clYellow; App.WorkBooks.WorkSheets.Cells.Font _ .Color:= clRed; App.WorkBooks.WorkSheets.Cells _ .Font.Name:= 'Courier'; App.WorkBooks.WorkSheets.Cells _ .Font.Size:= 16; App.WorkBooks.WorkSheets.Cells _ .Font.Bold:= True;

Програмний ідентифікатор