Зв’язок 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>

*

*