Зв'язок Access з іншими додатками

Об'єктна модель MSWord. Основні поняття.
 

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

Структура Word розглядається в основному структура word97 (8), але будуть посилання і на 9 версію.

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

Для отримання "структурного дерева" додатка Word натисніть F1 у вікні редактора коду VBA Word і у відомостях про програмування знайдіть пункт Microsoft Word Objects (Об'єкти Word). Там ви виявите більше 35 колекцій і об'єктів. Звертаю вашу увагу тільки на об'єкти, необхідні для розуміння прочитаного матеріалу надалі.

Об'єктна модель Word представляє собою ієрархію об'єктів, підпорядкованих одному об'єкту application. Більшість об'єктів використовують тільки бібліотеку Word, однак, деякі посилаються і на інші бібліотеки (Наприклад, об'єкт assistant – помічник посилається на бібліотеку об'єктів office)

табличка об'єктів першого рівня ієрархії об'єктної моделі Word. (елементи з позначкою "2000" доступні відповідно тільки у версіях Word починаючи з 9)

















































Об'єкт (сімейство)

Коментарі

Application

Посилається на активну додаток Word. Використовується для керування програми. Цей об'єкт може бути використаний іншим додатком за допомогою методу automation технології ActiveX

Addin (addins)

Сімейство об'єктів addin – набір всіх доступних надбудов Word. Переглянути надбудови та шаблони можна в діалоговому вікні, вибравши в меню Word пункт сервісшаблони та надбудови.

Browser

Засіб пересування курсору по об'єктах документа (задіюється при активації в нижньому правому куті вікна Word в смузі вертикальної прокрутки однієї з трьох кнопок навігації або натисканні комбінації клавіш “ctrl+alt+home” )

Dafaultweboptions 2000

Активізується при роботі з Web-документами.

Dialog(dialogs)

Набір вбудованих діалогових вікон (наприклад "Відкриття файлу")

Document(documents)

Сімейство об'єктів document-набір всіх відкритих документів

Emailoptions 2000

Через цей об'єкт додаток Word має доступ до всіх глобальним параметрами, використовуваним при виправленні в Word повідомлень електронної пошти

Filecionverter(Filecionverters)

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

Language(Languages)

Набір мов використовуваних при перевірці орфографії

Options

Через цей об'єкт здійснюється доступ до параметрів програми та документів Word. Багато параметри доступні в діалоговому вікні Word в меню сервіспараметри

Selection

Виділена область або точка редагування активного документа. Тільки одна з областей виділення доступна в кожен момент часу.

System

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

Template(Templates)

Сімейство всіх шаблонів Word. Переглянути шаблони і надбудови можна в діалоговому вікні, вибравши в меню Word пункт сервісшаблони та надбудови.

Window(Windows)

Всі вікна програми Word

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

Хочеться ще відзначити, що об'єкт Selection винесений у верхівку ієрархії Word і звертається до виділеної області або місцем вставки активного документа додатка. Тобто треба бути акуратним, при зверненні до властивостей цього об'єкта, поки відкрито кілька документів Word, і не забувати, що Selection належить об'єкту Application. І він єдиний.

Сімейство Documents призначене для управління документами Word. Це найбільш уживаний об'єкт і тому наведу опис основних об'єктів та родин підлеглих цьому об'єкту.

Табличка об'єктів, підпорядкованих об'єкту Document .





















































Об'єкти

Коментарі

Bookmark(Bookmarks)

Сімейство об'єктів, кожен з яких являє собою закладку в документі. Доступ до закладок можна отримати в діалоговому вікні, вибравши в меню Word пункт вставка / закладка

Characters[ range ]

Важливий елемент сімейства range. Кожен елемент відповідає одному символу документа, діапазону або виділення. Властивість count елемента Characters дасть кількість символів документа. УВАГА! Ні елемента Character.

Email 2000

Об'єкт – повідомлення електронної пошти. У кожного документа – тільки 1 такий об'єкт. Доступний тільки в режимах редагування документа як електронного повідомлення.

Fields(field)

Сімейство об'єктів – полів документа, діапазону або виділення. Поле в понятті Word – обчислюваний елемент, який вставлений в документ, поле містить певний код і може мати декілька параметрів документа. Огляд типів полів можна отримати в діалоговому вікні, вибравши в меню Word пункт вставка / поле

Pagesetup

Через цей об'єкт здійснюється доступ до параметрів документа, що використовується при друку документа Доступ до цих параметрів можна отримати в діалоговому вікні вибравши в меню Word пункт файл / параметри сторінки

Paragraph(Paragraphs)

Колекція абзаців документа, діапазону або виділення.

Range

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

Section(sections)

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

Sentences[ range ]

Важливий елемент сімейства range. Кожен елемент відповідає одній пропозиції документа, діапазону або виділення. Властивість count елемента Sentencesдаст кількість пропозицій документа. УВАГА! Ні елемента Sentence.

Style(Styles)

Сімейство всіх стилів Word у т.ч. і тих, що визначені користувачем у вибраному документі. Переглянути стилі можна в діалоговому вікні, вибравши в меню Word пункт формат / стиль.

Subdocument(subdocuments)

Колекція підлеглих документів документа або діапазону

Table(tables)

Колекція таблиць документа, діапазону або області виділення

Variable(variables)

Сімейство об'єктів – змінних документа. Variableсодержіт певний код, і в звичайному режимі не доступна кінцевому користувачеві. Використовуючи певний тип поля (fields) можна виводити вміст Variableв певне місце документа. Найчастіше використовується в VBA.

Weboptions 2000

Через цей об'єкт здійснюється доступ до параметрів документа при збереженні або відкритті WEB-документа.

Words[ range ]

Важливий елемент сімейства range. Кожен елемент відповідає одному слову документа, діапазону або виділення. Властивість count елемента Wordsдаст кількість словдокумента. УВАГА! Ні елемента Word.

У цій табличці були виділені ті елементи об'єкта document, що належать сімейству range (діапазон).
Саме через цей елемент відбувається доступ до будь-якого місця / символу / вставці / і т.д. Як ви встигли, напевно, помітити, будь-який символ документа належить до сімейства range. Причому один символ ще належить до підрозділу characters, група символів обмежених пробілами (точніше закінчуються пробілами або знаками пунктуації) – до підрозділу words, набір символів обмежених точками з пропуском (перекладами каретки, і т.п.) – до Sentences. На мій погляд – чудова задумка. Само собою, що там, де є щось хороше – там є і погане.
Плюси, напевно, очевидні:

* Швидкий доступ до будь-якого елементу – слову, пропозиції, і т.п.
* Перевірка слів (символів, пропозицій) відбувається автоматично при додаванні чого-небудь у сімейство.
* Зручна навігація переходу – посимвольний, послівно, за пропозиціями.
* Пошук по сімейства простіше.
* Статистика автоматична – виділив – отримав звіт про наявність чого-небудь.

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

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

Ні, звичайно ж, Range працює правильно. Саме так, як і має бути за правилами елементів сімейств. Але не завжди так, як хочеться. Наприклад: Данилов М.Є. – Це 6 слів (точка – самостійне слово, пробіл до слів не відноситься, далі йде місце вставки тобто курсор – це теж слово), і одна пропозиція. Але перевірка насильно мені вказує, що я забув пробіл після першої точки. Ставимо пробіл – отримали 6 слів, і 2 пропозиції. Саме цей момент найчастіше змушує при авто перенесення тексту з якого-небудь іншої програми office використовувати інші механізми передачі даних (поля, закладки, змінні). Але якщо ви точно знаєте, скільки слів і пропозицій буде (було), то розкидати по місцях потрібні нам дані не складе дуже вже великої праці.

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

Завдання.
* Відкриваємо новий документ на основі шаблону normal.
* Перевіримо, чи немає там чого непотрібного (слів, і т.п.).
* Створюємо і вставляємо текст.
* Знаходимо 10 Слово.
* Міняємо його на нього ж, але з великої літери.
* Знаходимо слово аксессс і міняємо його на Access
* Знаходимо символ [@], причому не пізніше 3-го пропозиції, міняємо його на [№].
* Шукаємо "пани" і додаємо ", а також дядечки й тітоньки".
Всі дії виробляємо, використовуючи механізми Word.

 






Public Sub text_in_word()

Dim word_obj As Object "не варто забувати що так теж можна обьявляти змінну.

Dim const_input_txt As String "Це той шматок тексту, що нам треба перенести в ворд

Dim Full_name_new_doc As String "ПОВНЕ ім'я нашого документа буде лежати тут

Dim Name_new_doc As String "ім'я нашого документа буде лежати тут

Dim i As Integer "знадобиться, хіба мало чого …..:)

Dim range_word As Word.Range "а ось це стадія раннього зв'язування..
"Нижче буде зрозуміло навіщо воно нам треба (не зв'язування а змінна)
Dim range_character As Word.Range "Нижче буде зрозуміло навіщо воно нам треба

Dim range_sentences As Word.Range "Нижче буде зрозуміло навіщо воно нам треба

"" ———- Стандартний модуль відкриття об'єкта ——–

Err.Clear "очищення помилок

On Error Resume Next

Set word_obj = GetObject (, "word.Application") "Перевірили, раптом ворд вже відкрито

If Err = 429 Then "ну коли закритий – відкриємо

Set word_obj = CreateObject ("word.Application") "так чи інакше, об'єкт ми отримали

ElseIf Err <> 0 Then

MsgBox "error" & Err "якщо якась ще помилка – наприклад користувач не має доступу

End If "до ворд – пишемо яка помилка

If Err <> 429 And Err <> 0 Then Exit Sub Else Err.Clear "і вийдемо, якщо помилилися

On Error GoTo 0 "при цьому ще відбувається очищення помилки аналогічно Err.Clear

"" ———- Ваяем далі ——–

""———– Перевірка вільного файлу —————–

On Error Resume Next

If Dir ("c: text_in.doc", vbNormal) <> "" Then Kill "c: text_in.doc" "Цей файл буде шаблоном

"Для подальшого перенесення даних. Якщо він уже є тоді його видалимо.

If Err = 75 Then

MsgBox "А хто то з цим файлом працює …." "Якщо файл зайнятий іншими користувачами

Exit Sub "зупинимо процедуру

ElseIf Err <> 0 Then

MsgBox Err "за умови що прізошла помилка файлової системи

Exit Sub "теж зупинимо процедуру

End If

On Error GoTo 0

""——————- Місце для файлу є, об'єкт створили ——–

""—– Відкриємо новий файл, з шаблоном Normal ———

With word_obj "Що б не писати далі багато разів ім'я змінної.

"І працювати буде трохи швидше

. Visible = True "а то не видно, чого там відбувається:)

.Documents.Add Template:=”normal.dot”, NewTemplate:=False, _

DocumentType:=wdNewBlankDocument, Visible:=True

"Додали ЧИСТИЙ НОВИЙ документ, шаблон у нього буде normal, він стане активним при відкритті

"І буде саме документом, а не шаблоном

Full_name_new_doc =. ActiveDocument.FullName "отримали ПОВНЕ ім'я нашого нового документа

Name_new_doc =. ActiveDocument.Name "отримали ім'я нашого нового документа

const_input_txt = "Шановні пані та панове! попереджає Вас, що треба обробити" & _

"Всі перелічені нижче замовлення і розвезти їх за адресами:" & vbCrLf & "Замовлення № 234/ісп" & _

vbCrLf & "той хто не має аксесуари до необхідних документів, той буде відсторонений до з'ясування" & _

"Причин присутності наявності відсутності!"
"Тут я використовував vbcrlf, як перенесення рядка, для отримання

"Більш структурно помітного тексту в документі. Але навіть перенесення можна було обробити програмно

"Додаванням в слова перенесення рядка.

If. ActiveDocument.FullName <> Full_name_new_doc Then. Documents (Name_new_doc). Activate

If. ActiveDocument.Words.Count> 1 Then "справа в тому що в чистому документі є 1" слово "

"Це місце вставки.

For i =. ActiveDocument.Words.Count To 2 Step -1 "Задом наперед для того що б не возитися з

” do while – end

. ActiveDocument.Words (i). Delete "прибираємо всі слова по черзі, починаючи з останнього

"Я, звичайно ж, розумію, що в НОВОМУ документі немає нічого. Цей шматок потрібний тим, хто працює

"З існуючими документами.

Next

End If

. Selection.Text = const_input_txt "Використовували об'єкт selection для вставки тексту.

"Тому що саме наш документ зараз активний – то все нормально.Но все ж я перевірив який документ активний.

"Зважаючи на те, що ніяких виділених областей у новому документі немає, а є тільки область вставки

"(Паличка-курсор), то вставиться саме в це місце.

If .ActiveDocument.Words.Count > 10 Then
"Ми то знаємо що слів вставили більше 10 шт. Але хіба мало чого.

. ActiveDocument.Words (10). Case = wdTitleWord "Зручний метод range, зі зміни регістру

For Each range_word In. ActiveDocument.Words "Пошук у всьому діапазоні слів

If range_word.Text = "аксессc" Then range_word.Text = "Access"
"Слово має закінчуватися пробілом
"Або знаком пунктуації або спец сиволов

Next

End If

Set range_sentences =. ActiveDocument.Range (Start: =. ActiveDocument.Sentences (1). Start, End: =. ActiveDocument.Sentences (3). End)
"Зробили кінець діапазону третє речення" зробили початком діапазону перше речення

range_sentences.Select

For Each range_character In range_sentences.Characters
"Тільки для 3х пропозицій

If range_character.Text Like "@" Then range_character.Text = "№"
"Like теж можна використовувати

Next
"Останнє, це додавання нових елементів у колекцію.
"Багато варіантів. Наприклад використовувати метод replace
"Можна використовувати метод find, а потім selection і вставити текст
"Ну раз вже ми використовуємо колекції. У words немає явного методу add. Думаю це зроблено для
"Запобігання плутанини, при введенні цього методу явно.
"А ось метод insertafter (before) як пити дати те що треба!

For Each range_word In .ActiveDocument.Words

If range_word.Text = "господа" Then range_word.InsertAfter ", а також дядечки й тітоньки"

Next
"Ну ніби все що обіцяв – зробив. Причому тільки методи ворд використав.

Full_name_new_doc = “c:text_in.doc”
"Поставили ім'я для запису документа

. ActiveDocument.saveas filename: = Full_name_new_doc, fileformat: = wdFormatDocument
"Взагалі
"SaveAs має багато параметрів, так що я частина їх просто не використовував

.ActiveDocument.Close
"Закрив саме цей документ

If. Documents.Count = 0 Then. Application.Quit SaveChanges: = wdDoNotSaveChanges
"А ось тут якраз перевірили, якщо немає більше документів – можемо взагалі закрити програму.

End With

Set word_obj = Nothing
"Очистили пам'ять

End Sub

 

 

Модуль запускається з Access і створює документ на диску С в кореневому каталозі. Цей приклад при пильному огляді повинен навчити використовувати основні елементи сімейства range об'єкта document програми Word. У принципі, всі перераховані вище механізми дозволять швидко орієнтуватися в тілі будь-якого документа. Одне велике АЛЕ. Для передачі даних з іншої програми і створення шаблону треба вибудувати чіткий алгоритм розстановки даних.

Найнеприємніше, що з-за 1 неправильного символу все може "попливти". Тоді отриманий документ не можна буде назвати створеним автоматично – його ж доведеться потім підправляти руками. Ті механізми, що я навів, легко дозволять закидати в чистий новостворений файл якісь дані без будь-яких ускладнень. Вказуючи різні діапазони вставки, можна заповнювати і вже існуючі документи, хоча, що б не зіпсувати вже існуючі дані треба чітко уявляти собі процес роботи. Найважливішим чинником цього методу є "наявність відсутності" як такого файлу шаблону створюваного документа, тобто за допомогою нього можна зробити т.зв. "Захист від Дурня" – любителя прати незрозуміло навіщо файли типу "Шаблон_моей_программи.dot"

Що стосується інших, не менш важливих елементів Document, то залишимо їх на наступний раз.

Наостанок маленький, але забавний і не особливо потрібний у роботі приклад. Кувиркатель індикатора клавіатури (мова при цьому змінюється тільки в Word) при запуску модуля з Access. Не знаю, те, що в інших додатках office мова залишається тим же, хоча індикатор змінився, правильно це чи ні. Вам судити. Але, як факт, таке можливо:

 






Public Sub shifted_lang()

Dim word_obj As Word.Application
"Вимагаємо раннього зв'язування

Err.Clear "очищення помилок

On Error Resume Next

Set word_obj = GetObject(, “word.Application”)
"Перевірили, раптом ворд вже відкрито

If Err = 429 Then "ну коли закритий – відкриємо

Set word_obj = CreateObject(“word.Application”)
"Так чи інакше, об'єкт ми отримали

ElseIf Err <> 0 Then

MsgBox “error” & Err
"Якщо якась ще помилка – наприклад користувач не має доступу

End If "до ворд – пишемо яка помилка

If Err <> 429 And Err <> 0 Then Exit Sub Else Err.Clear
"І вийдемо, якщо помилилися

On Error GoTo 0 "при цьому ще відбувається очищення помилки аналогічно Err.Clear

If word_obj.Keyboard = 68748313 Then word_obj.Keyboard (1033) Else word_obj.Keyboard (1049)

"Якщо англійська – перемкнули на російську і навпаки.

If word_obj.Documents.Count = 0 Then word_obj.Application.Quit SaveChanges: = wdDoNotSaveChanges

"Перевірили, якщо немає більше документів – можемо взагалі закрити програму.

Set word_obj = Nothing "очистили пам'ять

End Sub

 

 

Цей момент показує наявність деяких зручних, але недоступних Access, механізмів Word. Так що чекаємо. Раптом і в Access таке буде можливо. Без WinApi.

Підіб'ємо підсумок всього, що тут написано.

Додаток Word досить складно і має безліч (мало сказано J) елементів, способів та ін. Навігацію по документах можна легко здійснювати програмно через метод range. Створення нового документа і передача в нього даних з Access з використанням вищенаведеного методу складно, проте при розробці чіткого алгоритму дозволить обійтися без зайвого шаблону. Доступ до механізмів заміни, сортування, і статистики можна також отримати тільки через цей метод.

Схожі статті:


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

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*