Основы офисного программирования и документы Word

Общность и схожесть объектов Office 2000

Разбить на страницы
Показывать лекцию целиком

Общность и схожесть объектов Office 2000

Office 2000 это не просто совокупность отдельных приложений, - приложения Office 2000 тесно интегрированы между собой и имеют много общего - интерфейс, схожее поведение в различных ситуациях, единую среду Редакторов VBA и VBScript, возможность взаимодействия. За счет чего же достигается эта общность, как технологически выдерживается общая линия развития различных приложений? Достичь этого во многом удается за счет того, что Office построен по принципам объектно-ориентированного программирования (ООП), основан на COM-технологии и представляет множество объектов, объединенных в библиотеки. Совокупность этих библиотек составляет, как уже говорилось, каркас документов. При создании каждого нового документа Office 2000 автоматически строится каркас документа по умолчанию.

В зависимости от вида документа в его каркас включаются те или иные библиотеки из всей совокупности библиотек, а, следовательно, подключаются и объекты этих библиотек. Некоторые из этих библиотек содержат объекты, общие для всех приложений Office 2000, и включаются в каркасы всех документов. Благодаря этому, все приложения независимо от их типа будут иметь общие функции и во многом одинаково выглядеть в тех ситуациях, когда действия и внешний вид определяются методами и свойствами объектов этих библиотек. Общность (общие объекты) - это одна из главных, но не единственная причина, обуславливающая близость приложений Office 2000 и облегчающая работу в этой интегрированной среде. Другая причина - Схожесть (схожие объекты) - состоит в том, что многие объекты, принадлежащие специализированным библиотекам, имеют эквивалентные или весьма близкие свойства, методы и события. Объекты не являются совпадающими, но во многом их свойства и поведение может быть схожим.

Таким образом, в среде Office 2000 программист в своей работе часто сталкивается с общими и схожими объектами. Общими объектами являются, например, объекты класса CommandBar, FileSearch, новые объекты OWC - Office Web Components, введенные в Office 2000, и многие другие объекты. Не менее важную роль играют и схожие объекты, такие, у которых частично совпадают свойства, события и методы. В качестве примеров схожих объектов можно привести коллекции, большинство из которых имеют методы Add и Remove (Delete) для добавления и удаления элементов коллекций, свойство Count, возвращающее число элементов коллекции. Другими примерами являются объекты Range и Selection, представляющие, конечно же, разные объекты в приложениях Word и Excel, но, тем не менее, имеющие много схожего в их поведении. Microsoft использует оба способа достижения общности. Так, с одной стороны, в Office 2000 добавлены общие объекты OWC, с другой стороны, публикация документов Office 2000 на Web-страницах достигается за счет того, что добавлено общее поведение к схожим объектам, задающим документы Office 2000 (Document в приложении Word, WorkBook в приложении Excel и другие).

Общие библиотеки

Начнем наше подробное обсуждение общности и схожести с рассмотрения основных библиотек, содержащих общие объекты:

  • Microsoft Office 9.0 Object Library. В этой библиотеке находятся классы, определяющие многие общие свойства приложений Office 2000 - инструментальные панели (коллекция Command Bars), класс Assistant и связанные с ним классы, общие средства поиска файлов, языковые установки, свойства HTML-проекта и другие классы объектов.
  • Microsoft Forms 2.0 Object Library. Эта библиотека подключается автоматически в тех случаях, когда в документ включаются формы, - диалоговые окна, населенные элементами управления. Эта библиотека содержит класс UserForm, задающий саму форму, и все классы, задающие стандартные элементы управления, которые могут быть размещены в формах. Заметим, что эта библиотека используется Microsoft не только в Office 2000, но и в некоторых других продуктах, где требуется введение элементов управления.
  • OLE Automation. Специальная библиотека, позволяющая работать с OLE-объектами. Эта библиотека носит общий характер, она не входит в состав Office 2000, а является частью операционной системы Windows.
  • Visual Basic For Applications. Эта библиотека содержит несколько общих объектов, среди которых класс Collection, задающий коллекции, встроенные в язык VBA. В эту же библиотеку входят различные константы и функции, встроенные в язык VBA.
  • Visual Basic For Applications Extensibility 5.3. Эта библиотека содержит корневой объект VBE и классы других объектов, определяющих среду Редактора VBA и программные проекты приложений Office 2000.
  • проекты приложений Office 2000. Перейдем теперь к систематическому изучению объектов, входящих в состав этих библиотек.

    Объекты библиотеки Office 9.0

    Объекты, входящие в состав этой библиотеки, приведены в таблице:

    Объекты библиотеки Office 9.0
    Объекты Основные Свойства Основные Методы Назначение
    AnswerWizard Files ClearFileList, ResetFileList Единый для всего приложения Мастер Ответов.
    AnswerWizardFiles Item, Count Add, Delete Коллекция файлов Мастера Ответов. Свойство Files объекта AnswerWizard возвращает объект этого класса.
    Assistant Name, FileName, NewBalloon, On, Visible. Всего 26 свойств ActivateWizard, StartWizard, EndWizard, Help, Move, ResetTips Хорошо знакомый по справочной системе объект Помощник. Существует в единственном экземпляре, хотя может изменять свой внешний вид.
    Balloon и связанные с ним классы: BalloonCheckBoxes, BalloonCheckBox, BalloonLabeles, BalloonLabel Всего BalloonType, Text, Name, Button, CallBack, Mode, CheckBoxes, Labels. Show, Close, SetAvoidRectangle Диалоговое окно Помощника. Свойство NewBalloon объекта Assistant возвращает объект этого класса. В свою очередь свойства CheckBoxes и Labels объекта Balloon возвращают коллекции соответствующих классов.
    COMAddIns Count Update Коллекция Com-объектов, расширяющих возможности приложений Office 2000.
    COMAddIn Creator, Connect, Description, Guid, Object, ProgId нет Com-объект, - элемент коллекции COMAddIns.
    CommandBars ActionControl, ActiveMenuBar, Count, MenuAnimationStyle. Всего 13 свойств. Add, FindControl, FindControls + событие OnUpdate Коллекция инструментальных панелей с командными кнопками и меню.
    CommandBar Controls, Enabled, Type, Protection, Name, NameLocal, Index, IndexRow, Visible. Всего 19 свойств FindControl, Delete, Reset, ShowPopUp Объект, задающий инструментальную панель, элемент коллекции CommandBars. Свойство Controls возвращает коллекцию элементов управления - объект класса CommandBarControls.
    CommandBarControls, CommandBarControl, CommandBarComboBox, CommandBarButton, CommandBarPopup Классы, задающие элементы управления, размещаемых на инструментальных панелях - команды меню, списки и командные кнопки.
    DocumentProperties Count, Item Add Коллекция встроенных и пользовательских свойств документа.
    DocumentProperty LinkSource, LinkToContent, Name, Type, Value Delete Объект, задающий свойство документа, элемент коллекции DocumentProperties
    FileSearch, FoundFiles, PropertyTest, PropertyTests Эти объекты используются при поиске файлов
    IFind IFoundFiles Эти объекты используются при поиске файлов при работе с Macintosh
    HTMLProject HTMLProjectItems, State Open, RefreshDocument, RefreshProject Объект определяет документ, открываемый в Редакторе VBScript в формате HTML и рассматриваемый как проект. Его свойство HTMLProjectItems возвращает коллекцию элементов этого проекта (документа)
    HTMLProjectItems Count Item Коллекция элементов HTML-проекта, открываемого в Редакторе VBScript. Возвращается одноименным свойством объекта HTMLProject.
    HTMLProjectItem Name, Text, IsOpen Open, SaveCopyAs, LoadFromFile Элемент проекта (документа) - член коллекции HTMLProjectItems.
    LanguageSettings LanguagePreferredForEditing, LanguageID нет Языковые предпочтения
    Mso Префиксом Mso начинаются общие константы, используемые в приложениях Office 2000.
    Scripts Count Add, Item, Delete Коллекция объектов Script данного документа
    Script ScriptText, Shape, Id, Language, Location, Extended Delete Объект Script - элемент коллекции Scripts
    WebPageFonts Count, Item нет Коллекция шрифтов, используемых при сохранении документа как Web-страницы.
    WebPageFont FixedWidthFont, FixedWidthFontSize, ProportionalFont, ProportionalFontSize нет Объект, задающий шрифт, - элемент коллекции WebPageFonts.

    Обратите внимание, насколько в Office 2000 расширилась библиотека Office 9.0. К четырем группам объектов, определяющим Помощника, Инструментальные панели, Поиск файлов и Свойства документа, добавились еще 6 групп - Мастер Ответов, Com - расширения, HTML- проект и объекты Script, а также языковые предпочтения и шрифты Web-страниц.

    Рассмотрим эти группы объектов.

    Работа с Помощником

    Объект Assistant, задающий Помощника, появился в предыдущей версии Office 97. Этот объект используется во всех приложениях Office 97 и Office 2000 для реализации справочной системы. Для этой же цели этот объект может использоваться и при построении собственных решений. Я уделил особое внимание возможностям применения этого объекта в решениях, создаваемых на базе Office 2000.

    Инструментальные панели

    Инструментальные панели являются основой интерфейса документов Office 2000 любых типов. В собственных разработках не обойтись без создания собственного меню, собственных инструментальных кнопок.

    Поиск файлов и свойства документа

    Еще две группы объектов, общих для приложений Office 2000, связаны с такими типичными задачами, как поиск файлов и определение свойств документов. Давайте рассмотрим эти задачи чуть более подробно.

    Поиск файлов

    Задача поиска нужного файла периодически возникает у всех, кто работает с компьютером. В Office 2000 возможности системы поиска возросли, добавились новые критерии поиска. Нужный файл можно разыскать, используя различные ключи и их комбинацию. Ключами поиска могут служить тип файла, его размер, дата создания, дата последней модификации, любая часть имени файла, ключевые слова, наконец, любой текст, содержащийся в файле.

    Я уже говорил, что в Office 2000, - во всех его приложениях изменился внешний вид диалогового окна открытия файла (меню Файл | Открыть…). Это диалоговое окно служит и для поиска файлов. Используя многочисленные флажки, окна ввода, раскрывающиеся списки можно задать сложный критерий поиска, представляющий логическое выражение, где отдельные выражения объединены логическими операциями конъюнкции и дизъюнкции - "И" и "ИЛИ".

    У программиста есть две возможности в организации поиска файлов - использовать объект FileSearch или коллекцию Dialogs, которая является схожим, а не общим объектом, имея свою специфику в каждом приложении. О коллекции Dialogs поговорим позже, когда будем рассматривать объекты конкретного приложения, а сейчас займемся объектом FileSearch, который обладает всей функциональностью системы поиска файлов, не требуя при этом от пользователя формирования критериев поиска вручную в диалоговом окне. Для программистов это может быть важным, поскольку по тем или иным причинам он может не хотеть предоставлять пользователям возможности самостоятельного поиска нужного файла, оберегая их, например, от возможных ошибок.

    Следует сказать, что хотя в Office 2000 возможности поиска расширились и даже, как я уже говорил, изменился интерфейс соответствующего диалогового окна, это не сказалось на объектной модели. Объект FileSearch был спроектирован достаточно хорошо, так что он сохранил практически все свои свойства и методы, а его новые возможности реализуются простым расширением набора возможных значений его параметров. Я постараюсь рассказать обо всех возможностях программной организации поиска файлов на примере, в котором использую практически все методы и свойства объекта Filesearch. Так что перейдем к примеру:

    Public Sub LookingFor()
    	'Для поиска файлов используется объект FileSearch
    	Dim Report As String
    	Dim i As Integer
    	With Application.FileSearch
    		.NewSearch
    		.FileName = "Ch"
    		.FileType = msoFileTypeWordDocuments
    		.LastModified = msoLastModifiedAnyTime
    		.LookIn = "e:"
    		.SearchSubFolders = True
    		.TextOrProperty = "Общее"
    		.MatchAllWordForms = True
    		.MatchTextExactly = False
    		'Добавление других критериев поиска
    		AddCriteria
    		If .Execute(SortBy:=msoSortByLastModified, _
    				 SortOrder:=msoSortOrderDescending) > 0 Then
    			Report = "Найдено "  .FoundFiles.Count  " файлов!"  vbCrLf
    			For i = 1 To .FoundFiles.Count
    			Report = Report  .FoundFiles(i)  vbCrLf
    			Next i
    			Call MsgBox(Report, vbInformation, "Отчет о найденных файлах!")
    		 End If
    	 End With
    	PrintTest
    End Sub

    Прежде всего, следует заметить, что объект FileSearch находится на самом верху иерархии объектов, он встроен непосредственно в объект Application и возвращается при вызове соответствующего свойства этого объекта. Таким образом, для всех документов приложения действует единый объект FileSearch, что необходимо учитывать при многократном обращении к этому объекту. Именно поэтому наш поиск начинается с вызова метода NewSearch, который восстанавливает значения параметров поиска, принятые по умолчанию, так как в противном случае будут сохраняться значения параметров, установленные в предыдущем вызове объекта FileSearch. Далее в примере устанавливаются различные свойства объекта FileSearch, задающие критерии поиска. Рассмотрим их подробнее:

  • Свойство Filename задает строку, представляющую полное имя или часть имени разыскиваемого файла. В нашем примере разыскиваются файлы, имя которых содержит сочетание "Ch".
  • Свойство FileType ограничивает поиск, задавая тип разыскиваемого файла. Значения этого свойства задаются соответствующим набором констант. В нашем примере разыскиваются файлы, представляющие документы Word.
  • Свойство LastModified задает время последней модификации файла, - это может быть последний месяц или прошлая неделя, что устанавливается соответствующей константой. В нашем примере не накладываются ограничения на время модификации файла, он мог быть модифицирован в любое время .
  • Свойство LookIn задает местоположение разыскиваемого файла. В данном случае ищутся файлы, расположенные на локальном диске "E".
  • Булево свойство SearchSubFolders позволяет указать, как в нашем примере, что поиск следует вести в глубину, используя все подпапки исследуемых каталогов.
  • Свойство TextOrProperty позволяет задать строку, вхождение которой будет разыскиваться в теле файла или в его свойствах. В нашем примере я задаю для поиска слово "общее", но будут найдены все файлы, содержащие различные словоформы, например, слово "общность".
  • Булево свойство MatchAllWordForms позволяет указать, как в нашем примере, что при поиске будут использоваться все словоформы слов текста, указанного в свойстве TextOrProperty. Необходимым условием возможности такого поиска является подключение на этапе инсталляции приложения соответствующего словаря, содержащего словоформы.
  • Булево свойство MatchTextExactly является альтернативой предыдущему свойству и, когда оно задано значением true, требует точного соответствия текста при поиске.
  • Как видите, многие критерии поиска можно задать, установив требуемые значения свойств объекта FileSearch. Однако этот объект имеет и другой, более общий способ задания критериев. Дело в том, что среди свойств этого объекта есть свойство PropertyTests, возвращающее одноименную коллекцию, элементами которой являются объекты класса PropertyTest. Каждый из этих объектов задает один критерий поиска, а вся коллекция в целом - сложный критерий поиска, элементы которого объединены логическими операциями конъюнкции и дизъюнкции. При задании свойств объекта FileSearch автоматически формируются элементы коллекции PropertyTests. Но эта коллекция имеет и собственный метод Add, позволяющий добавлять новые критерии. Возникает коллизия - пересечение со свойствами, поскольку одни и те же критерии можно задать, используя свойства объекта FileSearch, либо метод Add коллекции PropertyTests. Я рекомендую в таких ситуациях использовать свойства. Достоинство метода Add состоит в том, что можно добавлять новые критерии поиска, не вводя новых свойств объекта FileSearch. Давайте рассмотрим небольшую процедуру AddCriteria, добавляющую критерии поиска и вызываемую в нашем примере:

    Public Sub AddCriteria()
    	'Добавление критериев поиска файлов
    	With Application.FileSearch
    		'Первый критерий
    		.PropertyTests.Add name:="Дата создания", _
    		Condition:=msoConditionAnytimeBetween, _
    		Value:="1/10/1999", SecondValue:="1/06/2000"
    		'Второй критерий
    		.PropertyTests.Add name:="Размер", _
    		Condition:=msoConditionMoreThan, _
    		Value:=200000, Connector:=msoConnectorOr
    		
    	End With
    End Sub

    У метода Add пять параметров:

  • Name - задает имя критерия. Оно должно принадлежать фиксированному набору возможных критериев. Для добавления новых критериев поиска достаточно просто расширить набор возможных имен.
  • Condition - задает одно из возможных условий для данного критерия. Каждому критерию соответствует свой набор условий, задаваемых соответствующими константами.
  • Value - задает значение условия. Тип значения зависит от используемого условия.
  • SecondValue - некоторые условия требуют задания двух значений, как правило, определяющих границы интервала возможных значений.
  • Connector - этот параметр имеет два возможных значения и определяет логическую связку "И" или "ИЛИ", используемую при добавлении критерия к общему условию поиска.
  • В нашем примере добавлены два критерия к тем, что были заданы с помощью свойств объекта FileSearch. В соответствии с выбранными установками будут разыскиваться файлы, созданные в течение 8 месяцев, начиная с 1-го октября 1999 года до 1-го июня 2000 года, либо файлы, чей размер превосходит 200К. Заметьте, что при задании размера файла единицей измерения является байт, так что можно задать точный размер файла, если он конечно известен.

    Но вернемся к рассмотрению процедуры LookingFor. После того, как критерий поиска сформирован, в ней вызывается метод Execute, запускающий сам поиск. В результате работы этого метода формируется коллекция файлов FoundFiles, удовлетворяющих условиям поиска. Эту коллекцию можно получить, вызвав свойство FoundFiles объекта FileSearch. Метод Execute возвращает в качестве результата число найденных файлов или, что тоже, число элементов коллекции FoundFiles. Параметры метода Execute позволяют отсортировать требуемым образом элементы этой коллекции. Взгляните, как выглядит сформированный отчет о результатах работы поиска:

    (рис 5.1) Отчет о найденных файлах

    Заметьте, коллекция FoundFiles обладает одной интересной особенностью, отличающей ее от других коллекций, - ее элементы не являются объектами некоторого класса (FoundFile), как это обычно бывает. Но, конечно, обращение FoundFiles(i) позволяет получить доступ к i-му элементу этой коллекции - строке, задающей полный путь к файлу.

    В заключение приведу тестовую процедуру печати всех свойств объекта FileSearch:

    Public Sub PrintTest()
    	'Печать свойств объекта FileSearch
    	With Application.FileSearch
    		Debug.Print "Имя файла содержит ", .FileName
    		Debug.Print "Тип файла", .FileType
    		Debug.Print "Последняя модификация", .LastModified
    		Debug.Print "Поиск ведется в ", .LookIn
    		Debug.Print "Учет словоформ ", .MatchAllWordForms
    		Debug.Print "Точное соответствие", .MatchTextExactly
    		Debug.Print "Поиск в подпапках", .SearchSubFolders
    		Debug.Print "Текст или свойство", .TextOrProperty
    		
    	End With
    	'Печать критериев поиска
    	Dim Ptest As PropertyTest
    	For Each Ptest In Application.FileSearch.PropertyTests
    		With Ptest
    			Debug.Print "Имя =", .name
    			Debug.Print "Номер условия =", .Condition
    			Debug.Print "Коннектор =", .Connector
    			Debug.Print "Значение =", .Value
    			Debug.Print "Второе значение =", .SecondValue
    			
    		End With
    	Next Ptest
    	'Печать найденных файлов
    		Dim Namefile As Variant
    		With Application.FileSearch
    			Debug.Print "Найдено файлов - ", .FoundFiles.Count
    			For Each Namefile In .FoundFiles
    				Debug.Print "Путь найденного файла -", Namefile
    			Next Namefile
    		End With
    
    End Sub

    Я не буду приводить результатов тестовой печати, отмечу лишь, в коллекции PropertyTests содержится пять элементов, три из которых сформированы на основе заданных свойств объекта FileSearch, а два добавлены в результате вызова метода Add.

    Свойства документа

    Все документы Office имеют общие встроенные свойства, начиная с имени автора, заглавия документа, даты его создания, кончая такими свойствами, как размер, дата последней модификации или, например, дата последней печати документа. Наряду со встроенными свойствами ко всем документам разрешается добавлять собственные свойства, определенные пользователем. В объектной модели Office эти факты нашли отражение в существовании коллекции DocumentProperties, элементы которой являются объектами класса DocumentProperty. Следует заметить, что в каждом конкретном приложении (Word, Excel, Power Point и так далее) у документов нет свойства DocumentProperties, а есть два свойства BuiltinDocumentProperties и CustomDocumentProperties. Эти свойства возвращают две подколлекции встроенных и пользовательских свойств с элементами, принадлежащими общему классу DocumentProperty и в совокупности составляющих коллекцию DocumentProperties.

    Работа с этими объектами достаточно проста. В коллекцию можно добавлять элементы, используя метод Add, а для удаления используется метод Delete, который, как это часто бывает с коллекциями Office 2000, принадлежит не самой коллекции, а классу, связанному с элементом, в данном случае - классу DocumentProperty. Должно быть также понятно, что методы Add и Delete применимы только к пользовательским свойствам, поскольку встроенные свойства нельзя ни добавлять, ни удалять.

    Значения всех свойств доступны как для чтения, так и для записи. Однако встроенные свойства, как правило, формируются автоматически при работе с документом, как, например, дата создания документа. Еще одно важное замечание, состоит в том, что в коллекцию встроенных свойств включены не только свойства, общие для всех приложений Office 2000, но и некоторые свойства, характерные только для определенных приложений. Например, свойства "Number Of Paragraphs" или "Number Of Slides" не определены в приложении Excel и их вызов приводит к ошибке. Приведем теперь пару процедур, в которых добавляются пользовательские свойства, устанавливаются и анализируются значения некоторых встроенных свойств документа:

    Public Sub AddCustomProperties()
    	'Добавление в документ трех пользовательских свойств
    	With ActiveDocument.CustomDocumentProperties
    		If Not ExistProperty("Кому") Then
    			.Add name:="Кому", _
    			LinkToContent:=False, _
    			Type:=msoPropertyTypeString, _
    			Value:="Документ предназначен программистам!", _
    			LinkSource:=""
    		End If
    		If Not ExistProperty("Оценка") Then
    			.Add name:="Оценка", _
    			LinkToContent:=False, _
    			Type:=msoPropertyTypeNumber, _
    			Value:=5, _
    			LinkSource:=""
    		End If
    		 If Not ExistProperty("NewProp") Then
    			.Add name:="NewProp", _
    			LinkToContent:=True, _
    			Type:=msoPropertyTypeString, _
    			LinkSource:="Название"
    		End If
    	End With
    End Sub
    
    Public Function ExistProperty(PropertyName As String) As Boolean
    	'Возвращает True, если в коллекции DocumentProperties
    	'существует свойство с именем PropertyName
    	Dim prop As DocumentProperty, Exist As Boolean
    	Exist = False
    	For Each prop In ActiveDocument.CustomDocumentProperties
    		If prop.name = PropertyName Then
    			Exist = True
    			Exit For
    		End If
    	Next prop
    	ExistProperty = Exist
    End Function

    В процедуре AddCustomProperties к активному документу добавляются три пользовательских свойства. В двух первых случаях указывается имя свойства, его тип и значение. При задании значения свойства булев параметр LinkToContent должен быть установлен как False. Если же этот параметр установлен как True, то должен быть задан параметр LinkSource, определяющий источник в документе, связываемый со свойством. Заметьте, добавление свойства в коллекцию приводит к ошибке, если в ней уже есть свойство с аналогичным именем. По этой причине для корректности перед добавлением свойства производится проверка на существование.

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

    Public Sub PrintingProperties()
    	'Печать свойств - встроенных и пользовательских
    	Dim prop As DocumentProperty
    	 For Each prop In ActiveDocument.BuiltInDocumentProperties
    		Debug.Print "Имя свойства - ", prop.name
    		On Error Resume Next
    		If prop.LinkToContent Then
    			Debug.Print "Источник -", prop.LinkSource
    		Else: Debug.Print "Значение - ", prop.Value
    		End If
    	Next prop
    	For Each prop In ActiveDocument.CustomDocumentProperties
    		Debug.Print "Имя свойства - ", prop.name
    		If prop.LinkToContent Then
    			Debug.Print "Источник -", prop.LinkSource
    		Else: Debug.Print "Значение - ", prop.Value
    		End If
    	Next prop
    End Sub

    Перейдем теперь к рассмотрению новинок, появившихся в библиотеке Office 9.0. Напомню, к ним относятся следующие группы объектов: Мастер Ответов, Com - расширения, HTML- проект и объекты Script, а также языковые предпочтения и шрифты Web-страниц.

    Мастер Ответов

    Мастер Ответов (Answer Wizard) хорошо знаком пользователям Office 2000, благодаря работе с Помощником (Office Assistant). Всякий раз, когда нужно получить справку, в окне Помощника можно сформулировать вопрос в свободном формате, используемом в естественных языках. Так вот, ответ на этот вопрос дает Мастер Ответов. Так ведется работа в самой системе Office 2000, но точно также можно организовать работу и в собственной системе. Для этого необходимо только использовать возможности нового объекта Answer Wizard, доступного теперь в Office 2000. Чтобы Мастер Ответов корректно готовил ответы на вопросы пользователя, касающиеся специфики разработанной программистом системы, необходимо в коллекцию файлов Мастера Ответов - объект AnswerWizardFiles добавить один или несколько специальных файлов с расширением "aw", содержащие, по сути, ответы на все возможные вопросы пользователя. Возникает естественный вопрос, где же взять такие файлы? Ответ прост, - нужно подготовить их, используя специальный инструментарий - Answer Wizard Builder. Этот Построитель Ответов строит aw- файл, используя ранее созданный chm-файл. Возникает естественный вопрос, где же взять такой файл? Ответ прост, - его нужно создать, используя специальный инструментарий - HTML Help Workshop. Я надеюсь, что Вы это все уже знаете, разобрались с двумя предыдущими лекциями этого курса, знаете все об инструментарии AWB и HHW, умеете работать с объектом Answer Wizard и применять его в собственных разработках.

    COM-расширения

    Технология COM лежит в основе создания продуктов Microsoft. Технология претендует на роль стандарта, ее используют многие фирмы, разрабатывающие программное обеспечение. Элементом этой технологии стали COM AddIns, появившиеся в Office 2000. Надстройки или расширения (AddIns) появились в предыдущей версии Office 97. В Office 2000 наряду с коллекцией AddIns появился и новый объект, задающий коллекцию COMAddIns.

    Надстройки предназначены для расширения функциональных возможностей приложений Office 2000. Надстройка, ориентированная на конкретное приложение (AddIn), создается внутри этого приложения, не требует никакого специального инструментария, и представляет своего рода глобальный шаблон. Надстройка COM AddIn, организованная, обычно, в виде DLL может работать в разных приложениях Office 2000. Для ее создания требуется специальный инструментарий, - ее можно создать, например, в среде Visual Basic или в Office 2000 версии Developer, где имеются необходимые для этого средства.

    Объекты ComAddIn и их коллекция ComAddIns устроены достаточно просто и рассказ о них не требует большого времени. Однако детальное рассмотрение всех вопросов, связанных с созданием и применением надстроек, требует, по крайней мере, отдельной главы, а подробный разговор о COM-технологии и отдельной книги. Насчет отдельной книги не знаю, а лекцию, посвященную надстройкам - Addins и ComAddIns, Вы сможете прочесть в этой книге.

    HTML-проект и объект Script

    В первой лекции этой книги я отмечал, что одной из основных тенденций развития Office 2000 является миграция в Интернет. Документы Office 2000 становятся доступными для коллективной работе в сети, и Web-страницы, видимо, станут основной формой представления документов, с которыми в ближайшем будущем будет работать массовый пользователь. Office и Интернет - наиболее перспективное и интересное направление развития офисного программирования. Но в этой книге я, к сожалению, не буду подробно рассматривать эту тему. Поэтому и разговор о новых общих объектах Script, коллекции Scripts, HtmlProject, появившихся в библиотеке Office 2000, будет носить обзорный характер.

    Прежде всего, поговорим о том, откуда берутся эти объекты, как они создаются, и в каких ситуациях возникает необходимость работы с ними. Начну с последнего вопроса, - необходимость работы с этими объектами возникает только в том случае, если предполагается публиковать документы Office 2000 в Internet и предоставить пользователям возможность активной работы с этими документами. Более того, эти объекты необходимы лишь тогда, когда предполагается создание VBSript-кода "на лету". Тогда без этих объектов точно уж не обойтись. А теперь несколько слов о том, как и когда эти объекты появляются. Я коротко напомню то, что уже говорилось в первой лекции. Все документы Office 2000 могут быть сохранены в формате HTML и могут просматриваться в Internet тем или иным браузером, как Web-страницы. Конечно же, в большинстве случаев простого просмотра документов недостаточно и пользователь должен иметь возможность активной работы со страницами, производить над ней те или иные действия. Активность Web-страниц всегда предполагает выполнение некоторого программного кода. В то же время современные обозреватели (браузеры) могут выполнять код, написанный только на JavaScript или VBScript. Язык сценариев VBScript, также как и язык VBA, является членом семейства Visual Basic. В отличие от VB и VBA этот язык является бестиповым или, что тоже, языком с одним единственным типом Variant. В объявлениях переменных их тип не указывается. Во многом, язык VBScript похож на язык VBA, является событийно-управляемым, имеет многие из его встроенных функций. Так что программирование на VBScript напоминает программирование на VBA, хотя и имеет свою специфику. Программирование на VBScript ведется в среде специального Редактора VBScript, вызываемого из всех приложений Office 2000. Напомню, нажатие комбинации клавиш "ALT + F11" открывает среду Редактора VBA, а нажатие - "ALT + Shift + F11" открывает похожую среду Редактора VBScript. Работа в этом Редакторе и является основным источником появления объектов Script и, соответственно, коллекции Scripts. Всякий раз, когда в Редакторе в HTML-текст вставляется тег <Script> с соответствующим кодом, в коллекцию Scripts добавляется очередной объект Script, задающий добавленный тег. Наряду с таким обычным способом создания программного кода, возможно программирование "на лету", когда Script-код создается программно. Для этой цели можно использовать либо свойства объекта Script, либо метод Add коллекции Scripts, позволяющий добавить тег Script к тексту Web-страницы. Параметры этого метода позволяю задать сам добавляемый код, местоположение тега, его ID. Метод Delete позволяет программно удалять элементы коллекции Scripts, удаляя, тем самым, соответствующие теги. Добраться до нужного элемента коллекции можно либо по индексу, либо по ID элемента. Конечно, предпочтительнее использовать ID, а не индексы, поскольку индексы элементов коллекции могут меняться в ходе редактирования HTML-текста. По этой причине желательно всегда задавать ID у тегов Script, как при программном создании кода, так и при работе в среде Редактора VBScript.

    Объект HtmlProject схож с объектом VBProject. Он используется при программном создании элементов Web-страницы и позволяет программно добраться не только до Script-кода, но и до других элементов, располагаемых на Web-странице, в частности до форм и элементов управления, расположенных на форме. На самом этом объекте я не буду останавливаться подробно, но о схожем объекте - VBProject я расскажу подробно. Оба объекта описывают программные проекты, связанные с документом. Один объект описывает проект, написанный на VBA, другой - на VBScript.

    В заключение хочу все-таки дать первое представление об HTML-проекте и программировании на VBScript. Приведу один небольшой и традиционный пример "Приветствие", в котором программный проект создается на VBScript, частично руками, частично программно. Взгляните, как выглядит среда Редактора VBScript.

    (рис 5.2) Редактор VBScript

    Я не буду останавливаться на подробном описании среды Редактора, отмечу только еще раз схожесть интерфейса при создании HTML-проекта и VBA-проекта. В левом окне Project Explorer - Обозревателя Проектов показана структура HTML-проекта. В правом окне кода показан HTML-код страницы. Окно открыто на вкладке "Source". Следующая вкладка "Quick View" позволяет осуществить быстрый просмотр страницы, увидев ее так, как она будет видна в браузере Internet Explorer. На рисунке можно увидеть и часть Script-кода, добавленного мной в проект.

    Какой же код я добавил в HTML-проект, чтобы заработало традиционное приветствие? Прежде всего, я добавил тег <Script> с описанием функции Hello. Этот тег был вставлен в конец заголовка проекта непосредственно перед закрывающим тегом <Head>. Вот этот текст:

    <script id="Hello" language="VBScript">
    	
    <!--
    	Function Hello()
    		Dim Answer
    		Answer = InputBox("Enter Your Name, please")
    		MsgBox ("Hi "  Answer  "!")
    		UserName.innerText = "Hello, "  Answer "!"
    	End Function 
    -->
    </script>

    Я задал также атрибут "onload" тега <body> и добавил тег <div>, для которого установил значение id, равное "UserName". Тег <div> (от division - раздел) задает местоположение раздела, в который программным путем я запишу имя, введенное пользователем.

    Приведу полный код, начиная с открывающего и кончая закрывающим тегом <body>. Большая часть этого кода сформирована автоматически.

    <body lang=EN-US style='tab-interval:36.0pt' onload="Hello()">
    
    <div class=Section1>
    
    <h3><span lang=RU>Документ, содержащий </span><span style='mso-ansi-language:
    EN-US'>Script</span><span lang=RU> код.<o:p></o:p></span></h3>
    </div>
    <div id=UserName>
    
    <!-- Сюда вставляется имя, введенное пользователем -->
    
    </div>
    
    
    </body>

    Учитывая, что не все знакомы с языками HTML и VBScript, приведу подробные комментарии.

  • Замечу, прежде всего, что я, как и многие авторы, пишущие о языке HTML, допустил некоторую терминологическую вольность. Когда я говорил, что мною добавлен тег Script, то фактически речь шла об элементе Script языка HTML. Как и большинство других элементов языка HTML, элемент Script состоит из открывающего и закрывающего тега Script и внутреннего HTML-текста. Для элемента Script внутренний HTML-текст задает Script-код, который может служить описанием функций, а может и непосредственно исполняться.
  • Открывающий тег Script содержит два атрибута - id и language. Для них заданы соответственно значения "Hello" и "VBScript". Выше я отмечал, что значение атрибута id, позволяет идентифицировать объект Script в соответствующей коллекции Scripts. Значение "VBScript" атрибута language указывает браузеру, что код написан на языке VBScript, альтернативой могло бы быть значение "JavaScript".
  • Script-код, содержащий описание функции Hello, закомментирован, - находится в теле тега комментария, начинающегося символами "<!--" и заканчивающегося последовательностью "-->". Браузер Internet Explorer понимает такой код и принимает его к исполнению. Другие же браузеры, не умеющие выполнять код VBScript как, например, Netscape Navigator, воспримут этот текст, как комментарий.
  • Заметьте, описание функции Hello на VBScript за исключением последней строчки было бы приемлемым и для функции, написанной на VBA. Здесь вызываются известные встроенные функции InputBox и MsgBox, позволяющие организовать диалог с пользователем - запросить у него имя и затем открыть окно с приветствием пользователя, используя введенное имя. Заметьте также, что тип переменной Answer при объявлении не указан.

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

  • Последняя строчка описания функции Hello специфична для VBScript, поскольку в ней используется объект Web-страницы. Каждый тег, расположенный на Web-странице, рассматривается как объект. Зная его id, с ним можно работать. Я уже ввел тег <div>, задал его id, а в функции Hello программным путем формирую его внутренний текст, зная имя, введенное пользователем.
  • Задание значения "Hello" для атрибута "onload" тега <body> означает, что в момент загрузки документа будет вызываться функция "Hello", которая и организует нужный диалог с пользователем. Здесь используется типичная обработка события, обработчик события Load вызывает функцию Hello. Вот как выглядит открытие этого документа в Internet Explorer:
  • (рис 5.3) Открытие документа, содержащего Script-код

    Я не буду приводить окно приветствия, открываемое функцией MsgBox, - оно выглядит стандартным образом, но все-таки приведу окончательный вид Web-страницы после программного добавления текста в тег <div>:

    (рис 5.4) Программная вставка текста на Web-странице

    Побочным результатом моей работы в Редакторе VBScript является появление у документа объекта Script и, соответственно, непустой коллекции объектов Scripts, так что появилась возможность программной работы с этими объектами. В окне отладки я провел несколько экспериментов, анализируя некоторые свойства этих объектов. Вот эти результаты:

    ? ActiveDocument.Scripts.Count
     1 
    ? ActiveDocument.Scripts(1).Id
    Hello
    ? ActiveDocument.Scripts(1).Language
     2 
    ? ActiveDocument.Scripts(1).Location
     1 
    ? ActiveDocument.Scripts(1).ScriptText
    	
    <!--
    	Function Hello()
    		Dim Answer
    		Answer = InputBox("Enter Your Name, please")
    		MsgBox ("Hi "  Answer  "!")
    		UserName.innerText = "Hello, "  Answer "!"
    	End Function 
    -->

    Единственный элемент коллекции Scripts - объект Script появился в момент создания в Редакторе соответствующего элемента HTML. Свойства объекта полностью отражают свойства этого элемента. Свойство Location, например, указывает, что элемент Script расположен в заголовочной части Web-страницы, - принадлежит тегу <Head>, а не <Body>. Значения некоторых свойств можно менять программно. В частности, программно можно изменить сам Script-код. Вот, функция, добавляющая еще одну строку в тело функции "Hello":

    Public Sub ChangeProperties()
    	'Изменение свойств объекта Script
    	Dim Txt1 As String, Txt2 As String
    	Dim Ind As Integer
    	Dim TxtAdd As String
    	'Добавляемая строка кода
    	TxtAdd = "MsgBox (""Bye-Bye ""  Answer  ""!"")" _
    		 vbCrLf  vbTab
    	With ActiveDocument.Scripts("Hello")
    		Txt1 = .ScriptText
    		'Добавление строки кода в текст функции
    		Ind = VBA.InStrRev(Txt1, "End Function")
    		Txt2 = VBA.Left(Txt1, Ind - 1)  TxtAdd _
    			 VBA.Right(Txt1, VBA.Len(Txt1) - Ind + 1)
    		.ScriptText = Txt2
    		' Нельзя программно изменить значение свойства Location
    		'.Location = 2
    	End With
    	'Обновление проекта после сделанных изменений
    	ActiveDocument.HTMLProject.RefreshProject
    End Sub

    В процедуре читается Script-код объекта Script, затем этот код модифицируется программным путем и измененное значение присваивается вновь объекту, что меняет его поведение. Обратите внимание, после введения изменений вызывается метод RefreshProject объекта HTMLProject, сохраняющий в проекте сделанные изменения.

    Эта процедура демонстрирует один из возможных способов "программирования на лету". Другой способ использует уже упоминавшийся метод Add, которым обладает коллекция Scripts. Я не буду углубляться в детали описания и использования объектов Script и HTMLProject, надеясь, что этих обзорных сведений достаточно, чтобы понять суть этих объектов и их возможности. В заключение скажу только, что работа с объектами Script возможна только в приложениях Word, Excel и Power Point.

    Языковые предпочтения и шрифты Web-страниц

    Нововведения в Office 2000 полезны разработчикам, использующим разные языки. Одно из таких замечательных качеств - возможность изменять язык интерфейса, справочной системы буквально "на лету". Раз языковые установки можно менять, то появился общий для приложений Office 2000 объект LanguageSettings, свойства которого позволяют проверить, какие именно установки приняты для интерфейса, справочной системы, инсталляционные установки, определяющие, например, вид цифр. Используя свойства этого объекта, можно также определить, какие языки (их может быть несколько) являются предпочтительными при редактировании текстов. Вот процедура, проверяющая все эти установки:

    Public Sub LangSet()
    	'Проверка языковых установок
    	With Application.LanguageSettings
    	If .LanguagePreferredForEditing(msoLanguageIDRussian) _
    		And .LanguagePreferredForEditing(msoLanguageIDEnglishUS) Then
    		MsgBox "Русский и Английский - оба являются предпочтительными языками редактирования"
    	End If
    	MsgBox "Для данного документа выбраны следующие языковые установки "  _
    	vbCrLf  "Язык инсталляции - "  .LanguageID(msoLanguageIDInstall)  _
    	vbCrLf  " Язык интерфейса - "  .LanguageID(msoLanguageIDUI)  _
    	vbCrLf  " Язык справки - "  .LanguageID(msoLanguageIDHelp)
    
    	End With
    End Sub

    Появление нового объекта WebPageFont и соответствующей коллекции связано с уже многократно упоминавшейся тенденцией представления документов Office 2000 в виде Web-страниц. Объект WebPageFont позволяет установить, какой шрифт будет использоваться по умолчанию на Web-страницах в качестве пропорционального шрифта и шрифта фиксированной ширины, а также размер этих шрифтов. Вот простая процедура, изменяющая эти установки:

    Public Sub ChangeFonts()
    	'Изменение свойств Web-шрифтов
    	With Application.DefaultWebOptions
    	.Fonts(msoCharacterSetCyrillic) _
    		.ProportionalFont = "Arial Cyr"
    	.Fonts(msoCharacterSetCyrillic) _
    		.FixedWidthFont = "Times New Roman Cyr"
    	.Fonts(msoCharacterSetCyrillic) _
    		.ProportionalFontSize = 12
    	.Fonts(msoCharacterSetCyrillic) _
    		.FixedWidthFontSize = 14
    	Debug.Print .Fonts(msoCharacterSetCyrillic).ProportionalFont
    	Debug.Print .Fonts(msoCharacterSetCyrillic).ProportionalFontSize
    	Debug.Print .Fonts(msoCharacterSetCyrillic).FixedWidthFont
    	Debug.Print .Fonts(msoCharacterSetCyrillic).FixedWidthFontSize
    	End With
    End Sub

    Константы mso…

    Библиотека Office 9.0 содержит набор констант, начинающихся с префикса mso. Каждая константа является элементом некоторого перечисления, задающее возможное множество значений, которые допустимы при работе со свойствами и методами объектов, входящих в эту библиотеку. Две последние процедуры являются хорошим примером использования таких констант.

    На этом я закончу описание общих объектов, входящих в библиотеку Office 9.0, подключаемую по умолчанию ко всем документам Office 2000.

    Объекты библиотеки Microsoft Forms 2.0

    В отличие от библиотеки Microsoft Office 9.0 Object Library библиотека Microsoft Forms 2.0 не входит в каркас документа в момент его создания. Тем не менее, эта библиотека подключается к большинству документов Office 2000, поскольку документы, не имеющие развитых средств интерфейса с пользователем, являются редкостью, а интерфейс, как правило, основан на формах - диалоговых окнах, населенных элементами управления. При создании интерфейса документа, обычно в режиме проектирования, но, возможно, и программно, при первом же подключении формы к документу, библиотека Microsoft Forms 2.0 автоматически подключается к проекту документа.

    Эта библиотека содержит класс объектов UserForm, определяющий саму форму, и классы объектов, задающих различные элементы управления, такие как CheckBox, ComboBox, CommandButton и другие. Когда на форме размещается тот или иной элемент управления - кнопка, список, текстовое поле, то в программном проекте, точнее в модуле, связанном с формой, автоматически создается объект соответствующего класса, с которым можно программно работать. Классы, задающие элементы управления, входят в состав библиотеки Forms 2.0 и составляют ее основу. Их относительно немного, - они соответствуют так называемым стандартным элементам управления.

    Что же еще входит в состав этой библиотеки? Прежде всего, следует упомянуть два класса - Control и Controls. Первый из них задает общий класс элементов управления, задающий их свойства, методы и события, независящие от конкретного типа элемента управления. Таким образом, каждый объект, задающий элемент управления, одновременно принадлежит двум классам - конкретному и общему. Класс Controls, как обычно, задает коллекцию элементов управления.

    Хочу обратить внимание, на важность класса Control. Дело в том, что на форме можно размещать как стандартные, так и дополнительные элементы управления. Число возможных дополнительных элементов управления велико и все время пополняется, - они разрабатываются, как Microsoft, так и независимыми фирмами. Напомню, как можно поместить дополнительные элементы управления в форму. Если в режиме проектирования на инструментальной панели ToolBox нажать правую кнопку, то в контекстном меню появится пункт "Additional Controls", при выборе которого появится длинный список дополнительных элементов управления. Любой элемент из этого списка можно включить, поместив его тем самым на инструментальную панель, а затем уже обычным способом перенести при необходимости в форму. Понятно, что в библиотеке Forms 2.0 нет классов, задающих такие объекты. Но зато есть общий класс Control, которому принадлежат как стандартные, так и дополнительные элементы управления, что позволяет со всеми элементами управления работать программно.

    Я не буду сейчас подробно рассказывать о каждом из классов объектов, входящих в состав библиотеки Forms 2.0, ограничусь только этим кратким обзором. Разрешите поставить точку, но прежде одно замечание. В библиотеку Forms 2.0 включен и ряд стандартных элементов управления, используемых при работе в формате HTML. По существу, для многих классов, задающих стандартные элементы управления, имеются и соответствующие HTML-классы, как, например, HTMLCheckBox, HTMLOption, HTMLText, HTMLPassword. В справочной системе сведения о них отсутствуют, а я пока не разобрался, как с ними можно работать. Я подозреваю, что эти объекты появляются в проекте, когда в Редакторе VBScript на Web-страницу добавляются соответствующие элементы управления. Но это гипотеза, требующая проверки. Напомню, что и в Редакторе VBScript есть своя инструментальная панель ToolBox c HTML-элементами управления.

    Библиотека объектов VBA

    При описании объектов этой библиотеки я также ограничусь обзором, прежде всего, по той причине, что эту библиотеку в отличие от прочих составляют не столько объекты, сколько методы, собранные в стандартные модули. Библиотеку VBA составляют три класса объектов, 13 модулей и большое число перечислений, задающих константы, используемых в тех или иных ситуациях.

    Классы библиотеки VBA

    В библиотеку VBA входят три класса объектов:

  • Collection - встроенный в язык VBA динамический класс данных. Очень мощная языковая конструкция, объединяющая достоинства массивов и динамических линейных списков. Также как и массив задает упорядоченную совокупность элементов, к каждому из которых возможен прямой доступ. Но, в отличие от массива может объединять элементы разного типа, не имеет фиксированной длины, создается динамически. Допускается эффективная вставка и удаление любых элементов коллекции, что для массивов, вообще говоря, недопустимо. В сравнении с динамическими списками, для которых также возможны эффективно реализуемые операции по вставке и удалению элементов, несомненным преимуществом коллекции является возможность прямого доступа к ее элементам. При этом доступ возможен как по индексу элемента, так и по ключу, в качестве которого может использоваться произвольное строковое выражение. В классе определены методы Add, Item, Remove и свойство Count.
  • ErrObject - этот специфический класс описывает единственный объект Err, создаваемый автоматически вместе с проектом и имеющим глобальную область определения. Этот объект содержит информацию о последней ошибке выполнения. Он имеет два метода - Clear и Raise и шесть свойств: Number, Source, Descrition, HelpFile, HelpContext и LastDLLError.
  • Global - этот класс имеет одно свойство UserForms и два метода - Load и Unload. Глобальное свойство UserForms позволяет получить коллекцию форм, связанных с приложением. Заметьте, сам объект UserForm находится в одной библиотеке - Forms 2.0, а коллекция этих объектов принадлежит глобальному классу библиотеки VBA. Методы Load и UnLoad также связаны с формами. Они позволяют загрузить и выгрузить форму. Оба метода должны быть глобальными и не могут принадлежать к методам самой формы, поскольку первый начинает работать, когда формы еще нет, а второй заканчивает работу, когда формы уже нет.

    Модули библиотеки VBA

    Как я уже говорил, большую часть библиотеки VBA составляют различные стандартные процедуры, встроенные в язык. Эти процедуры и функции, называемые методами, объединены в зависимости от их предназначения в те или иные модули. Ограничусь кратким описанием этих модулей:

  • Conversion - в этот модули собраны различные функции, выполняющие преобразование между типами. Прежде всего, сюда входит большая группа функций приведения к типу. Имена этих функций состоят из префикса "C", за которым следует имя типа, к которому идет приведение. Так функция CInt(x) выражение x приводит к целому типу, если, конечно, такое преобразование возможно. В этом же модуле находятся и такие известные функции, как Val и Str, осуществляющие взаимное преобразование численного и строкового значения, представляющего число.
  • DateTime - в этом модуле собраны не только методы, но и свойства, в совокупности, обеспечивающие работу с датами и временами.
  • FileSystem - этот модуль содержит функции, необходимые при работе с файлами.
  • Financial - модуль, содержит финансовые функции. Набор этих функций не столь внушителен в сравнении с набором финансовых функций, доступных в Excel. Но, несомненно, и эти функции полезны, в тех ситуациях, когда в процедурах программного проекта нужно вести финансовые расчеты, а проект не связан с документом Excel.
  • Math и Strings - модули, содержащие наборы математических и функций для работы со строками.
  • Information - большинство из функций этого набора позволяют отвечать на ряд вопросов, снабжая программиста дополнительной информацией. К ним относятся Is- функции, имя которых состоит из префикса Is, после которого следует имя типа. Эти функции позволяют уточнить тип значения переменной, объявленной как Variant. Так функция IsObject позволяет узнать, представляет ли значение такой переменной некоторый объект. В этот же набор входит и такая функция, как RGB, позволяющая задать требуемый цвет по его трем компонентам - красной, зеленой и голубой составляющим цвета.
  • Interaction - модуль, включающий очень важные функции, обеспечивающие взаимодействие с пользователем. Упомяну лишь четыре функции из этого набора. Функции InputBox и MsgBox используются для ввода и вывода сообщений в процессе диалога с пользователем. Без них практически не обходится ни один пример. Функция Shell позволяет запускать на выполнение exe-модуль. Пример ее использования приведен в лекции 8, где рассказывается о том, как организовать просмотр созданного справочного руководства. Функция CreateObject позволяет создать объект, хранящийся в DLL. Она используется, если такой объект не может быть создан конструкцией New. В этот же модуль входят и многие другие полезные функции.
  • Constants, ColorConstants, KeyCodeConstants, SystemColorConstants - в этих четырех модулях сгруппированы различные константы, назначение которых можно определить по имени модуля.
  • На этом я закончу обзор этой библиотеки.

    Библиотека объектов VBIDE

    В отличие от большинства библиотек, содержащих общие объекты, библиотека VBIDE не подключается к каркасу документа по умолчанию. Она не подключается автоматически, как это происходит с библиотекой Forms 2.0 при создании формы. Эту библиотеку необходимо подключать самому вручную или программно в тех случаях, когда предполагается программная работа с самим программным проектом. Программирование на лету, программное создание форм, инструментальных панелей и других элементов интерфейса - все это требует работы с объектами, содержащимися в этой библиотеке. Так что это одна из важнейших библиотек объектов, необходимых в работе программиста. Приведу обзор содержимого этой библиотеки.

    Объекты библиотеки VBIDE
    Объекты Основные Свойства Основные Методы Назначение
    AddIn Collection, Connect, Description, GUID, Object, ProgID, VBE нет Класс Addin описывает надстройки, специфические для того или иного приложения и самого VBA. Поэтому этот класс включен во все библиотеки - Word, Excel и, в том числе, библиотеку VBIDE.
    AddIns Count, VBE Item, Update Коллекция объектов AddIn, доступных в среде разработки программного проекта.
    CodeModule CodePane, CountOfLines, CountOfDeclarationLines, ProcBodyLine Всего 11 свойств AddFromFile, AddFromString, InsertLines, ReplaceLines, Find, CreateEventsProc, DeleteLines Представляет код модуля. Является одним из основных объектов, с которым приходится работать при программировании на лету. Примеры использования даны в лекции 4.
    CodePane CodeModule, CodePaneView, Collection, CountOfVisibleLines, TopLine, VBE, Windows GetSelection, SetSelection, Show Подокно, в котором отображается код модуля. Такое окно может быть не единственным.
    CodePanes Count, Parent, VBE Item Коллекция активных подокон кода.
    ContainedVBControls Count, Parent, VBE Add, Item. Remove Коллекция объектов VBControl
    Events и связанные с ним классы: CommandBarEvents, FileControlsEvents, RefererncesEvents, SelectedVBControlsEvents, VBComponentsEvents, VBControlsEvents, VBProjectsEvents Свойства класса Events возвращают объект одного из связанных классов, каждый из которых обладает некоторым набором событий. Эти события могут включаться в AddIn для VBA.
    IDTExtensibility Нет OnAddInsUpdate, OnConnection, OnDisConnection, OnStartUpComplete Этот объект позволяет реализовать стандартный интерфейс в AddIn для VBA.
    LinkedWindows Count, VBE Add, Item, Remove Коллекция окон, связанных с VB IDE
    Member Всего 19 свойств нет Некоторый набор свойств, допустимых при работе с проектом. Включает общедоступные (public) атрибуты из библиотеки типов.
    Members Count, Parent, VBE Item Коллекция элементов модуля. Соответствует тому, что можно увидеть в правом окне при выборе модуля в окне просмотра объектов.
    Property Collection, IndexedValue, Name, NumIndices, Object, Value, VBE нет Представляет свойства объекта
    Properties Count, Parent, VBE Item Коллекция объектов Property
    References Count, Parent, VBE AddFromFile, AddFromGUID, Item, Remove. Два события: ItemAdded, ItemRemoved Коллекция ссылок. Позволяет программным путем добавлять и удалять ссылки на библиотеки и проекты.
    SelectedVBControls Count, Parent, VBE Clear, Copy, Cut, Item. Два события: ItemAdded, ItemRemoved Коллекция выбранных элементов формы.
    VBComponent CodeModule, Designer, HelpContextId и другие. Всего 15 свойств. Activate, InsertFile, SaveAs и другие. Всего 7 методов. Представляет компоненту программного проекта - модуль или форму. Один из центральных объектов при работе с программным проектом.
    VBComponents Count, Parent, VBE, StartUpObject Add, AddCustom, AddFromFile, AddFromTemplate, Item, Remove + 6 событий Коллекция компонент, составляющих программный проект.
    VBControl ClassName, ControlObject, ControlType и другие. Всего 10 свойств. ZOrder Представляет объект VBControl - элемент управления, размещаемый на форме.
    VBControls Count, Parent, VBE Add, Item, Remove. 3 события: ItemAdded, itemRemoved, ItemRenamed Коллекция объектов VBControl.
    VBE ActiveVBProject, DisplayModel, Name, 5 свойств возвращают основные коллекции: AddIns, CodePanes, CommandBars, VBProjects, Windows. Всего 18 свойств. Quit Корневой объект, задающий Редактор Visual Basic. Все остальные объекты библиотеки, так или иначе, вложены в объект VBE. С другой стороны, из любого объекта можно подняться в корень, поскольку все объекты библиотеки VBIDE содержат свойство VBE, возвращающее этот объект.
    VBForm CanPaste, ContainedVBControls, Parent, SelectedVBControls, VBControls, VBE Paste, SelectAll Объект, задающий форму в программном проекте.
    VBNewProjects Count, VBE Item Коллекция проектов, добавленных в результате выполнения специальных операций.
    VBProject VBComponents, Name, HelpFile, HelpContextID, IsDirty и другие. Всего 16 свойств. AddToolBoxProgId, MakeCompiledFile, ReadProperty, SaveAs, WriteProperty Представляет программный проект. Один из центральных объектов, без которого не обойтись при программной работе с проектом.
    VBProjects Count, Parent, VBE, IconState, StartProject. Add, AddFromFile, AddFRomTemplate, FileName, Item, Remove, SaveAs. События: ItemActivate, ItemAdded, ItemRemoved, ItemRenamed Коллекция объектов VBProject.

    Я решил привести сводку всех объектов, включенных в библиотеку VBIDE, основываясь на том, какие объекты можно увидеть в окне просмотра объектов. Для программистов, создающих достаточно серьезные программные проекты, не обойтись без работы с этими объектами, без знания их свойств и методов. Хочу предупредить, что справочная система по этим объектам частично отсутствует, а там, где она есть, оставляет желать лучшего. Более того, не со всеми из указанных свойств и методов можно реально работать в Office 2000. Некоторые из них будут реализованы в следующих версиях.

    Схожесть объектов

    Как видите, общих объектов, с которыми приходится работать в различных приложениях Office 2000, достаточно много. Схожих объектов еще больше. Вряд ли представляется возможным их перечисление. Я напомню, что схожими, я назвал объекты, имеющие общие методы или свойства. Фактически, схожими называются объекты, у которых доля одинаковых свойств и методов достаточно высока. Такое определение не является строгим и допускает определенный произвол в толковании того, являются ли два объекта схожими. Тем не менее, понятие схожести достаточно важное, поскольку облегчает изучение объектов, позволяет лучше ориентироваться в этом сложном мире объектов Office 2000.

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

  • Самый большой класс схожих объектов составляют коллекции. Заметьте, коллекции составляют, чуть ли не половину всех классов, образующих библиотеки Office 2000. Все коллекции обладают свойством Count и методом Item, который иногда называется свойством. Большинство коллекций имеют метод Add и Delete, который иногда называется Remove. Конечно же, важно при изучении этого семейства классов иметь общее представление о коллекции. В качестве эталона можно рассматривать класс Collection, встроенного в язык VBA. Все остальные классы можно рассматривать как вариации этого эталона. Замечу, что если бы и разработчики Office 2000, проектируя очередной класс коллекции, исходили бы из определенного эталона (шаблона класса), то мера схожести этих классов была бы выше. Реально, многие различия в этих классах можно было бы устранить. Понятно, что некоторые различия носят принципиальный характер. Так для коллекций, элементы которых являются встроенными объектами, методы Add и Delete являются недопустимыми.
  • Можно ожидать, что схожими будут объекты Application - Word.Application, Excel.Application и другие. Действительно, определенная схожесть есть, хотя, с моей точки зрения и здесь могла бы быть достигнута более высокая степень схожести.
  • Объекты следующего уровня, задающие документы Office 2000 в разных приложениях, - объекты Document, WorkBook, Slide и другие, еще один пример схожих объектов.
  • Много схожего в поведении объектов более низкого уровня - Range и Selection, задающих рабочую область в приложениях Word и Excel.
  • Коллекция Dialogs и объекты Dialog, входящие в состав всех приложений, представляют еще одну важную и типичную группу схожих объектов.
  • Поставим точку.

    Страницы:

    Общность и схожесть объектов Office 2000

    Office 2000 это не просто совокупность отдельных приложений, - приложения Office 2000 тесно интегрированы между собой и имеют много общего - интерфейс, схожее поведение в различных ситуациях, единую среду Редакторов VBA и VBScript, возможность взаимодействия. За счет чего же достигается эта общность, как технологически выдерживается общая линия развития различных приложений? Достичь этого во многом удается за счет того, что Office построен по принципам объектно-ориентированного программирования (ООП), основан на COM-технологии и представляет множество объектов, объединенных в библиотеки. Совокупность этих библиотек составляет, как уже говорилось, каркас документов. При создании каждого нового документа Office 2000 автоматически строится каркас документа по умолчанию.

    В зависимости от вида документа в его каркас включаются те или иные библиотеки из всей совокупности библиотек, а, следовательно, подключаются и объекты этих библиотек. Некоторые из этих библиотек содержат объекты, общие для всех приложений Office 2000, и включаются в каркасы всех документов. Благодаря этому, все приложения независимо от их типа будут иметь общие функции и во многом одинаково выглядеть в тех ситуациях, когда действия и внешний вид определяются методами и свойствами объектов этих библиотек. Общность (общие объекты) - это одна из главных, но не единственная причина, обуславливающая близость приложений Office 2000 и облегчающая работу в этой интегрированной среде. Другая причина - Схожесть (схожие объекты) - состоит в том, что многие объекты, принадлежащие специализированным библиотекам, имеют эквивалентные или весьма близкие свойства, методы и события. Объекты не являются совпадающими, но во многом их свойства и поведение может быть схожим.

    Таким образом, в среде Office 2000 программист в своей работе часто сталкивается с общими и схожими объектами. Общими объектами являются, например, объекты класса CommandBar, FileSearch, новые объекты OWC - Office Web Components, введенные в Office 2000, и многие другие объекты. Не менее важную роль играют и схожие объекты, такие, у которых частично совпадают свойства, события и методы. В качестве примеров схожих объектов можно привести коллекции, большинство из которых имеют методы Add и Remove (Delete) для добавления и удаления элементов коллекций, свойство Count, возвращающее число элементов коллекции. Другими примерами являются объекты Range и Selection, представляющие, конечно же, разные объекты в приложениях Word и Excel, но, тем не менее, имеющие много схожего в их поведении. Microsoft использует оба способа достижения общности. Так, с одной стороны, в Office 2000 добавлены общие объекты OWC, с другой стороны, публикация документов Office 2000 на Web-страницах достигается за счет того, что добавлено общее поведение к схожим объектам, задающим документы Office 2000 (Document в приложении Word, WorkBook в приложении Excel и другие).

    Общие библиотеки

    Начнем наше подробное обсуждение общности и схожести с рассмотрения основных библиотек, содержащих общие объекты:

  • Microsoft Office 9.0 Object Library. В этой библиотеке находятся классы, определяющие многие общие свойства приложений Office 2000 - инструментальные панели (коллекция Command Bars), класс Assistant и связанные с ним классы, общие средства поиска файлов, языковые установки, свойства HTML-проекта и другие классы объектов.
  • Microsoft Forms 2.0 Object Library. Эта библиотека подключается автоматически в тех случаях, когда в документ включаются формы, - диалоговые окна, населенные элементами управления. Эта библиотека содержит класс UserForm, задающий саму форму, и все классы, задающие стандартные элементы управления, которые могут быть размещены в формах. Заметим, что эта библиотека используется Microsoft не только в Office 2000, но и в некоторых других продуктах, где требуется введение элементов управления.
  • OLE Automation. Специальная библиотека, позволяющая работать с OLE-объектами. Эта библиотека носит общий характер, она не входит в состав Office 2000, а является частью операционной системы Windows.
  • Visual Basic For Applications. Эта библиотека содержит несколько общих объектов, среди которых класс Collection, задающий коллекции, встроенные в язык VBA. В эту же библиотеку входят различные константы и функции, встроенные в язык VBA.
  • Visual Basic For Applications Extensibility 5.3. Эта библиотека содержит корневой объект VBE и классы других объектов, определяющих среду Редактора VBA и программные проекты приложений Office 2000.
  • проекты приложений Office 2000. Перейдем теперь к систематическому изучению объектов, входящих в состав этих библиотек.

    Объекты библиотеки Office 9.0

    Объекты, входящие в состав этой библиотеки, приведены в таблице:

    Объекты библиотеки Office 9.0
    Объекты Основные Свойства Основные Методы Назначение
    AnswerWizard Files ClearFileList, ResetFileList Единый для всего приложения Мастер Ответов.
    AnswerWizardFiles Item, Count Add, Delete Коллекция файлов Мастера Ответов. Свойство Files объекта AnswerWizard возвращает объект этого класса.
    Assistant Name, FileName, NewBalloon, On, Visible. Всего 26 свойств ActivateWizard, StartWizard, EndWizard, Help, Move, ResetTips Хорошо знакомый по справочной системе объект Помощник. Существует в единственном экземпляре, хотя может изменять свой внешний вид.
    Balloon и связанные с ним классы: BalloonCheckBoxes, BalloonCheckBox, BalloonLabeles, BalloonLabel Всего BalloonType, Text, Name, Button, CallBack, Mode, CheckBoxes, Labels. Show, Close, SetAvoidRectangle Диалоговое окно Помощника. Свойство NewBalloon объекта Assistant возвращает объект этого класса. В свою очередь свойства CheckBoxes и Labels объекта Balloon возвращают коллекции соответствующих классов.
    COMAddIns Count Update Коллекция Com-объектов, расширяющих возможности приложений Office 2000.
    COMAddIn Creator, Connect, Description, Guid, Object, ProgId нет Com-объект, - элемент коллекции COMAddIns.
    CommandBars ActionControl, ActiveMenuBar, Count, MenuAnimationStyle. Всего 13 свойств. Add, FindControl, FindControls + событие OnUpdate Коллекция инструментальных панелей с командными кнопками и меню.
    CommandBar Controls, Enabled, Type, Protection, Name, NameLocal, Index, IndexRow, Visible. Всего 19 свойств FindControl, Delete, Reset, ShowPopUp Объект, задающий инструментальную панель, элемент коллекции CommandBars. Свойство Controls возвращает коллекцию элементов управления - объект класса CommandBarControls.
    CommandBarControls, CommandBarControl, CommandBarComboBox, CommandBarButton, CommandBarPopup Классы, задающие элементы управления, размещаемых на инструментальных панелях - команды меню, списки и командные кнопки.
    DocumentProperties Count, Item Add Коллекция встроенных и пользовательских свойств документа.
    DocumentProperty LinkSource, LinkToContent, Name, Type, Value Delete Объект, задающий свойство документа, элемент коллекции DocumentProperties
    FileSearch, FoundFiles, PropertyTest, PropertyTests Эти объекты используются при поиске файлов
    IFind IFoundFiles Эти объекты используются при поиске файлов при работе с Macintosh
    HTMLProject HTMLProjectItems, State Open, RefreshDocument, RefreshProject Объект определяет документ, открываемый в Редакторе VBScript в формате HTML и рассматриваемый как проект. Его свойство HTMLProjectItems возвращает коллекцию элементов этого проекта (документа)
    HTMLProjectItems Count Item Коллекция элементов HTML-проекта, открываемого в Редакторе VBScript. Возвращается одноименным свойством объекта HTMLProject.
    HTMLProjectItem Name, Text, IsOpen Open, SaveCopyAs, LoadFromFile Элемент проекта (документа) - член коллекции HTMLProjectItems.
    LanguageSettings LanguagePreferredForEditing, LanguageID нет Языковые предпочтения
    Mso Префиксом Mso начинаются общие константы, используемые в приложениях Office 2000.
    Scripts Count Add, Item, Delete Коллекция объектов Script данного документа
    Script ScriptText, Shape, Id, Language, Location, Extended Delete Объект Script - элемент коллекции Scripts
    WebPageFonts Count, Item нет Коллекция шрифтов, используемых при сохранении документа как Web-страницы.
    WebPageFont FixedWidthFont, FixedWidthFontSize, ProportionalFont, ProportionalFontSize нет Объект, задающий шрифт, - элемент коллекции WebPageFonts.

    Обратите внимание, насколько в Office 2000 расширилась библиотека Office 9.0. К четырем группам объектов, определяющим Помощника, Инструментальные панели, Поиск файлов и Свойства документа, добавились еще 6 групп - Мастер Ответов, Com - расширения, HTML- проект и объекты Script, а также языковые предпочтения и шрифты Web-страниц.

    Рассмотрим эти группы объектов.

    Работа с Помощником

    Объект Assistant, задающий Помощника, появился в предыдущей версии Office 97. Этот объект используется во всех приложениях Office 97 и Office 2000 для реализации справочной системы. Для этой же цели этот объект может использоваться и при построении собственных решений. Я уделил особое внимание возможностям применения этого объекта в решениях, создаваемых на базе Office 2000.

    Инструментальные панели

    Инструментальные панели являются основой интерфейса документов Office 2000 любых типов. В собственных разработках не обойтись без создания собственного меню, собственных инструментальных кнопок.

    Поиск файлов и свойства документа

    Еще две группы объектов, общих для приложений Office 2000, связаны с такими типичными задачами, как поиск файлов и определение свойств документов. Давайте рассмотрим эти задачи чуть более подробно.

    Поиск файлов

    Задача поиска нужного файла периодически возникает у всех, кто работает с компьютером. В Office 2000 возможности системы поиска возросли, добавились новые критерии поиска. Нужный файл можно разыскать, используя различные ключи и их комбинацию. Ключами поиска могут служить тип файла, его размер, дата создания, дата последней модификации, любая часть имени файла, ключевые слова, наконец, любой текст, содержащийся в файле.

    Я уже говорил, что в Office 2000, - во всех его приложениях изменился внешний вид диалогового окна открытия файла (меню Файл | Открыть…). Это диалоговое окно служит и для поиска файлов. Используя многочисленные флажки, окна ввода, раскрывающиеся списки можно задать сложный критерий поиска, представляющий логическое выражение, где отдельные выражения объединены логическими операциями конъюнкции и дизъюнкции - "И" и "ИЛИ".

    У программиста есть две возможности в организации поиска файлов - использовать объект FileSearch или коллекцию Dialogs, которая является схожим, а не общим объектом, имея свою специфику в каждом приложении. О коллекции Dialogs поговорим позже, когда будем рассматривать объекты конкретного приложения, а сейчас займемся объектом FileSearch, который обладает всей функциональностью системы поиска файлов, не требуя при этом от пользователя формирования критериев поиска вручную в диалоговом окне. Для программистов это может быть важным, поскольку по тем или иным причинам он может не хотеть предоставлять пользователям возможности самостоятельного поиска нужного файла, оберегая их, например, от возможных ошибок.

    Следует сказать, что хотя в Office 2000 возможности поиска расширились и даже, как я уже говорил, изменился интерфейс соответствующего диалогового окна, это не сказалось на объектной модели. Объект FileSearch был спроектирован достаточно хорошо, так что он сохранил практически все свои свойства и методы, а его новые возможности реализуются простым расширением набора возможных значений его параметров. Я постараюсь рассказать обо всех возможностях программной организации поиска файлов на примере, в котором использую практически все методы и свойства объекта Filesearch. Так что перейдем к примеру:

    Public Sub LookingFor()
    	'Для поиска файлов используется объект FileSearch
    	Dim Report As String
    	Dim i As Integer
    	With Application.FileSearch
    		.NewSearch
    		.FileName = "Ch"
    		.FileType = msoFileTypeWordDocuments
    		.LastModified = msoLastModifiedAnyTime
    		.LookIn = "e:"
    		.SearchSubFolders = True
    		.TextOrProperty = "Общее"
    		.MatchAllWordForms = True
    		.MatchTextExactly = False
    		'Добавление других критериев поиска
    		AddCriteria
    		If .Execute(SortBy:=msoSortByLastModified, _
    				 SortOrder:=msoSortOrderDescending) > 0 Then
    			Report = "Найдено "  .FoundFiles.Count  " файлов!"  vbCrLf
    			For i = 1 To .FoundFiles.Count
    			Report = Report  .FoundFiles(i)  vbCrLf
    			Next i
    			Call MsgBox(Report, vbInformation, "Отчет о найденных файлах!")
    		 End If
    	 End With
    	PrintTest
    End Sub

    Прежде всего, следует заметить, что объект FileSearch находится на самом верху иерархии объектов, он встроен непосредственно в объект Application и возвращается при вызове соответствующего свойства этого объекта. Таким образом, для всех документов приложения действует единый объект FileSearch, что необходимо учитывать при многократном обращении к этому объекту. Именно поэтому наш поиск начинается с вызова метода NewSearch, который восстанавливает значения параметров поиска, принятые по умолчанию, так как в противном случае будут сохраняться значения параметров, установленные в предыдущем вызове объекта FileSearch. Далее в примере устанавливаются различные свойства объекта FileSearch, задающие критерии поиска. Рассмотрим их подробнее:

  • Свойство Filename задает строку, представляющую полное имя или часть имени разыскиваемого файла. В нашем примере разыскиваются файлы, имя которых содержит сочетание "Ch".
  • Свойство FileType ограничивает поиск, задавая тип разыскиваемого файла. Значения этого свойства задаются соответствующим набором констант. В нашем примере разыскиваются файлы, представляющие документы Word.
  • Свойство LastModified задает время последней модификации файла, - это может быть последний месяц или прошлая неделя, что устанавливается соответствующей константой. В нашем примере не накладываются ограничения на время модификации файла, он мог быть модифицирован в любое время .
  • Свойство LookIn задает местоположение разыскиваемого файла. В данном случае ищутся файлы, расположенные на локальном диске "E".
  • Булево свойство SearchSubFolders позволяет указать, как в нашем примере, что поиск следует вести в глубину, используя все подпапки исследуемых каталогов.
  • Свойство TextOrProperty позволяет задать строку, вхождение которой будет разыскиваться в теле файла или в его свойствах. В нашем примере я задаю для поиска слово "общее", но будут найдены все файлы, содержащие различные словоформы, например, слово "общность".
  • Булево свойство MatchAllWordForms позволяет указать, как в нашем примере, что при поиске будут использоваться все словоформы слов текста, указанного в свойстве TextOrProperty. Необходимым условием возможности такого поиска является подключение на этапе инсталляции приложения соответствующего словаря, содержащего словоформы.
  • Булево свойство MatchTextExactly является альтернативой предыдущему свойству и, когда оно задано значением true, требует точного соответствия текста при поиске.
  • Как видите, многие критерии поиска можно задать, установив требуемые значения свойств объекта FileSearch. Однако этот объект имеет и другой, более общий способ задания критериев. Дело в том, что среди свойств этого объекта есть свойство PropertyTests, возвращающее одноименную коллекцию, элементами которой являются объекты класса PropertyTest. Каждый из этих объектов задает один критерий поиска, а вся коллекция в целом - сложный критерий поиска, элементы которого объединены логическими операциями конъюнкции и дизъюнкции. При задании свойств объекта FileSearch автоматически формируются элементы коллекции PropertyTests. Но эта коллекция имеет и собственный метод Add, позволяющий добавлять новые критерии. Возникает коллизия - пересечение со свойствами, поскольку одни и те же критерии можно задать, используя свойства объекта FileSearch, либо метод Add коллекции PropertyTests. Я рекомендую в таких ситуациях использовать свойства. Достоинство метода Add состоит в том, что можно добавлять новые критерии поиска, не вводя новых свойств объекта FileSearch. Давайте рассмотрим небольшую процедуру AddCriteria, добавляющую критерии поиска и вызываемую в нашем примере:

    Public Sub AddCriteria()
    	'Добавление критериев поиска файлов
    	With Application.FileSearch
    		'Первый критерий
    		.PropertyTests.Add name:="Дата создания", _
    		Condition:=msoConditionAnytimeBetween, _
    		Value:="1/10/1999", SecondValue:="1/06/2000"
    		'Второй критерий
    		.PropertyTests.Add name:="Размер", _
    		Condition:=msoConditionMoreThan, _
    		Value:=200000, Connector:=msoConnectorOr
    		
    	End With
    End Sub

    У метода Add пять параметров:

  • Name - задает имя критерия. Оно должно принадлежать фиксированному набору возможных критериев. Для добавления новых критериев поиска достаточно просто расширить набор возможных имен.
  • Condition - задает одно из возможных условий для данного критерия. Каждому критерию соответствует свой набор условий, задаваемых соответствующими константами.
  • Value - задает значение условия. Тип значения зависит от используемого условия.
  • SecondValue - некоторые условия требуют задания двух значений, как правило, определяющих границы интервала возможных значений.
  • Connector - этот параметр имеет два возможных значения и определяет логическую связку "И" или "ИЛИ", используемую при добавлении критерия к общему условию поиска.
  • В нашем примере добавлены два критерия к тем, что были заданы с помощью свойств объекта FileSearch. В соответствии с выбранными установками будут разыскиваться файлы, созданные в течение 8 месяцев, начиная с 1-го октября 1999 года до 1-го июня 2000 года, либо файлы, чей размер превосходит 200К. Заметьте, что при задании размера файла единицей измерения является байт, так что можно задать точный размер файла, если он конечно известен.

    Но вернемся к рассмотрению процедуры LookingFor. После того, как критерий поиска сформирован, в ней вызывается метод Execute, запускающий сам поиск. В результате работы этого метода формируется коллекция файлов FoundFiles, удовлетворяющих условиям поиска. Эту коллекцию можно получить, вызвав свойство FoundFiles объекта FileSearch. Метод Execute возвращает в качестве результата число найденных файлов или, что тоже, число элементов коллекции FoundFiles. Параметры метода Execute позволяют отсортировать требуемым образом элементы этой коллекции. Взгляните, как выглядит сформированный отчет о результатах работы поиска:

    (рис 5.1) Отчет о найденных файлах

    Заметьте, коллекция FoundFiles обладает одной интересной особенностью, отличающей ее от других коллекций, - ее элементы не являются объектами некоторого класса (FoundFile), как это обычно бывает. Но, конечно, обращение FoundFiles(i) позволяет получить доступ к i-му элементу этой коллекции - строке, задающей полный путь к файлу.

    В заключение приведу тестовую процедуру печати всех свойств объекта FileSearch:

    Public Sub PrintTest()
    	'Печать свойств объекта FileSearch
    	With Application.FileSearch
    		Debug.Print "Имя файла содержит ", .FileName
    		Debug.Print "Тип файла", .FileType
    		Debug.Print "Последняя модификация", .LastModified
    		Debug.Print "Поиск ведется в ", .LookIn
    		Debug.Print "Учет словоформ ", .MatchAllWordForms
    		Debug.Print "Точное соответствие", .MatchTextExactly
    		Debug.Print "Поиск в подпапках", .SearchSubFolders
    		Debug.Print "Текст или свойство", .TextOrProperty
    		
    	End With
    	'Печать критериев поиска
    	Dim Ptest As PropertyTest
    	For Each Ptest In Application.FileSearch.PropertyTests
    		With Ptest
    			Debug.Print "Имя =", .name
    			Debug.Print "Номер условия =", .Condition
    			Debug.Print "Коннектор =", .Connector
    			Debug.Print "Значение =", .Value
    			Debug.Print "Второе значение =", .SecondValue
    			
    		End With
    	Next Ptest
    	'Печать найденных файлов
    		Dim Namefile As Variant
    		With Application.FileSearch
    			Debug.Print "Найдено файлов - ", .FoundFiles.Count
    			For Each Namefile In .FoundFiles
    				Debug.Print "Путь найденного файла -", Namefile
    			Next Namefile
    		End With
    
    End Sub

    Я не буду приводить результатов тестовой печати, отмечу лишь, в коллекции PropertyTests содержится пять элементов, три из которых сформированы на основе заданных свойств объекта FileSearch, а два добавлены в результате вызова метода Add.

    Свойства документа

    Все документы Office имеют общие встроенные свойства, начиная с имени автора, заглавия документа, даты его создания, кончая такими свойствами, как размер, дата последней модификации или, например, дата последней печати документа. Наряду со встроенными свойствами ко всем документам разрешается добавлять собственные свойства, определенные пользователем. В объектной модели Office эти факты нашли отражение в существовании коллекции DocumentProperties, элементы которой являются объектами класса DocumentProperty. Следует заметить, что в каждом конкретном приложении (Word, Excel, Power Point и так далее) у документов нет свойства DocumentProperties, а есть два свойства BuiltinDocumentProperties и CustomDocumentProperties. Эти свойства возвращают две подколлекции встроенных и пользовательских свойств с элементами, принадлежащими общему классу DocumentProperty и в совокупности составляющих коллекцию DocumentProperties.

    Работа с этими объектами достаточно проста. В коллекцию можно добавлять элементы, используя метод Add, а для удаления используется метод Delete, который, как это часто бывает с коллекциями Office 2000, принадлежит не самой коллекции, а классу, связанному с элементом, в данном случае - классу DocumentProperty. Должно быть также понятно, что методы Add и Delete применимы только к пользовательским свойствам, поскольку встроенные свойства нельзя ни добавлять, ни удалять.

    Значения всех свойств доступны как для чтения, так и для записи. Однако встроенные свойства, как правило, формируются автоматически при работе с документом, как, например, дата создания документа. Еще одно важное замечание, состоит в том, что в коллекцию встроенных свойств включены не только свойства, общие для всех приложений Office 2000, но и некоторые свойства, характерные только для определенных приложений. Например, свойства "Number Of Paragraphs" или "Number Of Slides" не определены в приложении Excel и их вызов приводит к ошибке. Приведем теперь пару процедур, в которых добавляются пользовательские свойства, устанавливаются и анализируются значения некоторых встроенных свойств документа:

    Public Sub AddCustomProperties()
    	'Добавление в документ трех пользовательских свойств
    	With ActiveDocument.CustomDocumentProperties
    		If Not ExistProperty("Кому") Then
    			.Add name:="Кому", _
    			LinkToContent:=False, _
    			Type:=msoPropertyTypeString, _
    			Value:="Документ предназначен программистам!", _
    			LinkSource:=""
    		End If
    		If Not ExistProperty("Оценка") Then
    			.Add name:="Оценка", _
    			LinkToContent:=False, _
    			Type:=msoPropertyTypeNumber, _
    			Value:=5, _
    			LinkSource:=""
    		End If
    		 If Not ExistProperty("NewProp") Then
    			.Add name:="NewProp", _
    			LinkToContent:=True, _
    			Type:=msoPropertyTypeString, _
    			LinkSource:="Название"
    		End If
    	End With
    End Sub
    
    Public Function ExistProperty(PropertyName As String) As Boolean
    	'Возвращает True, если в коллекции DocumentProperties
    	'существует свойство с именем PropertyName
    	Dim prop As DocumentProperty, Exist As Boolean
    	Exist = False
    	For Each prop In ActiveDocument.CustomDocumentProperties
    		If prop.name = PropertyName Then
    			Exist = True
    			Exit For
    		End If
    	Next prop
    	ExistProperty = Exist
    End Function

    В процедуре AddCustomProperties к активному документу добавляются три пользовательских свойства. В двух первых случаях указывается имя свойства, его тип и значение. При задании значения свойства булев параметр LinkToContent должен быть установлен как False. Если же этот параметр установлен как True, то должен быть задан параметр LinkSource, определяющий источник в документе, связываемый со свойством. Заметьте, добавление свойства в коллекцию приводит к ошибке, если в ней уже есть свойство с аналогичным именем. По этой причине для корректности перед добавлением свойства производится проверка на существование.

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

    Public Sub PrintingProperties()
    	'Печать свойств - встроенных и пользовательских
    	Dim prop As DocumentProperty
    	 For Each prop In ActiveDocument.BuiltInDocumentProperties
    		Debug.Print "Имя свойства - ", prop.name
    		On Error Resume Next
    		If prop.LinkToContent Then
    			Debug.Print "Источник -", prop.LinkSource
    		Else: Debug.Print "Значение - ", prop.Value
    		End If
    	Next prop
    	For Each prop In ActiveDocument.CustomDocumentProperties
    		Debug.Print "Имя свойства - ", prop.name
    		If prop.LinkToContent Then
    			Debug.Print "Источник -", prop.LinkSource
    		Else: Debug.Print "Значение - ", prop.Value
    		End If
    	Next prop
    End Sub

    Перейдем теперь к рассмотрению новинок, появившихся в библиотеке Office 9.0. Напомню, к ним относятся следующие группы объектов: Мастер Ответов, Com - расширения, HTML- проект и объекты Script, а также языковые предпочтения и шрифты Web-страниц.

    Мастер Ответов

    Мастер Ответов (Answer Wizard) хорошо знаком пользователям Office 2000, благодаря работе с Помощником (Office Assistant). Всякий раз, когда нужно получить справку, в окне Помощника можно сформулировать вопрос в свободном формате, используемом в естественных языках. Так вот, ответ на этот вопрос дает Мастер Ответов. Так ведется работа в самой системе Office 2000, но точно также можно организовать работу и в собственной системе. Для этого необходимо только использовать возможности нового объекта Answer Wizard, доступного теперь в Office 2000. Чтобы Мастер Ответов корректно готовил ответы на вопросы пользователя, касающиеся специфики разработанной программистом системы, необходимо в коллекцию файлов Мастера Ответов - объект AnswerWizardFiles добавить один или несколько специальных файлов с расширением "aw", содержащие, по сути, ответы на все возможные вопросы пользователя. Возникает естественный вопрос, где же взять такие файлы? Ответ прост, - нужно подготовить их, используя специальный инструментарий - Answer Wizard Builder. Этот Построитель Ответов строит aw- файл, используя ранее созданный chm-файл. Возникает естественный вопрос, где же взять такой файл? Ответ прост, - его нужно создать, используя специальный инструментарий - HTML Help Workshop. Я надеюсь, что Вы это все уже знаете, разобрались с двумя предыдущими лекциями этого курса, знаете все об инструментарии AWB и HHW, умеете работать с объектом Answer Wizard и применять его в собственных разработках.

    COM-расширения

    Технология COM лежит в основе создания продуктов Microsoft. Технология претендует на роль стандарта, ее используют многие фирмы, разрабатывающие программное обеспечение. Элементом этой технологии стали COM AddIns, появившиеся в Office 2000. Надстройки или расширения (AddIns) появились в предыдущей версии Office 97. В Office 2000 наряду с коллекцией AddIns появился и новый объект, задающий коллекцию COMAddIns.

    Надстройки предназначены для расширения функциональных возможностей приложений Office 2000. Надстройка, ориентированная на конкретное приложение (AddIn), создается внутри этого приложения, не требует никакого специального инструментария, и представляет своего рода глобальный шаблон. Надстройка COM AddIn, организованная, обычно, в виде DLL может работать в разных приложениях Office 2000. Для ее создания требуется специальный инструментарий, - ее можно создать, например, в среде Visual Basic или в Office 2000 версии Developer, где имеются необходимые для этого средства.

    Объекты ComAddIn и их коллекция ComAddIns устроены достаточно просто и рассказ о них не требует большого времени. Однако детальное рассмотрение всех вопросов, связанных с созданием и применением надстроек, требует, по крайней мере, отдельной главы, а подробный разговор о COM-технологии и отдельной книги. Насчет отдельной книги не знаю, а лекцию, посвященную надстройкам - Addins и ComAddIns, Вы сможете прочесть в этой книге.

    HTML-проект и объект Script

    В первой лекции этой книги я отмечал, что одной из основных тенденций развития Office 2000 является миграция в Интернет. Документы Office 2000 становятся доступными для коллективной работе в сети, и Web-страницы, видимо, станут основной формой представления документов, с которыми в ближайшем будущем будет работать массовый пользователь. Office и Интернет - наиболее перспективное и интересное направление развития офисного программирования. Но в этой книге я, к сожалению, не буду подробно рассматривать эту тему. Поэтому и разговор о новых общих объектах Script, коллекции Scripts, HtmlProject, появившихся в библиотеке Office 2000, будет носить обзорный характер.

    Прежде всего, поговорим о том, откуда берутся эти объекты, как они создаются, и в каких ситуациях возникает необходимость работы с ними. Начну с последнего вопроса, - необходимость работы с этими объектами возникает только в том случае, если предполагается публиковать документы Office 2000 в Internet и предоставить пользователям возможность активной работы с этими документами. Более того, эти объекты необходимы лишь тогда, когда предполагается создание VBSript-кода "на лету". Тогда без этих объектов точно уж не обойтись. А теперь несколько слов о том, как и когда эти объекты появляются. Я коротко напомню то, что уже говорилось в первой лекции. Все документы Office 2000 могут быть сохранены в формате HTML и могут просматриваться в Internet тем или иным браузером, как Web-страницы. Конечно же, в большинстве случаев простого просмотра документов недостаточно и пользователь должен иметь возможность активной работы со страницами, производить над ней те или иные действия. Активность Web-страниц всегда предполагает выполнение некоторого программного кода. В то же время современные обозреватели (браузеры) могут выполнять код, написанный только на JavaScript или VBScript. Язык сценариев VBScript, также как и язык VBA, является членом семейства Visual Basic. В отличие от VB и VBA этот язык является бестиповым или, что тоже, языком с одним единственным типом Variant. В объявлениях переменных их тип не указывается. Во многом, язык VBScript похож на язык VBA, является событийно-управляемым, имеет многие из его встроенных функций. Так что программирование на VBScript напоминает программирование на VBA, хотя и имеет свою специфику. Программирование на VBScript ведется в среде специального Редактора VBScript, вызываемого из всех приложений Office 2000. Напомню, нажатие комбинации клавиш "ALT + F11" открывает среду Редактора VBA, а нажатие - "ALT + Shift + F11" открывает похожую среду Редактора VBScript. Работа в этом Редакторе и является основным источником появления объектов Script и, соответственно, коллекции Scripts. Всякий раз, когда в Редакторе в HTML-текст вставляется тег <Script> с соответствующим кодом, в коллекцию Scripts добавляется очередной объект Script, задающий добавленный тег. Наряду с таким обычным способом создания программного кода, возможно программирование "на лету", когда Script-код создается программно. Для этой цели можно использовать либо свойства объекта Script, либо метод Add коллекции Scripts, позволяющий добавить тег Script к тексту Web-страницы. Параметры этого метода позволяю задать сам добавляемый код, местоположение тега, его ID. Метод Delete позволяет программно удалять элементы коллекции Scripts, удаляя, тем самым, соответствующие теги. Добраться до нужного элемента коллекции можно либо по индексу, либо по ID элемента. Конечно, предпочтительнее использовать ID, а не индексы, поскольку индексы элементов коллекции могут меняться в ходе редактирования HTML-текста. По этой причине желательно всегда задавать ID у тегов Script, как при программном создании кода, так и при работе в среде Редактора VBScript.

    Объект HtmlProject схож с объектом VBProject. Он используется при программном создании элементов Web-страницы и позволяет программно добраться не только до Script-кода, но и до других элементов, располагаемых на Web-странице, в частности до форм и элементов управления, расположенных на форме. На самом этом объекте я не буду останавливаться подробно, но о схожем объекте - VBProject я расскажу подробно. Оба объекта описывают программные проекты, связанные с документом. Один объект описывает проект, написанный на VBA, другой - на VBScript.

    В заключение хочу все-таки дать первое представление об HTML-проекте и программировании на VBScript. Приведу один небольшой и традиционный пример "Приветствие", в котором программный проект создается на VBScript, частично руками, частично программно. Взгляните, как выглядит среда Редактора VBScript.

    (рис 5.2) Редактор VBScript

    Я не буду останавливаться на подробном описании среды Редактора, отмечу только еще раз схожесть интерфейса при создании HTML-проекта и VBA-проекта. В левом окне Project Explorer - Обозревателя Проектов показана структура HTML-проекта. В правом окне кода показан HTML-код страницы. Окно открыто на вкладке "Source". Следующая вкладка "Quick View" позволяет осуществить быстрый просмотр страницы, увидев ее так, как она будет видна в браузере Internet Explorer. На рисунке можно увидеть и часть Script-кода, добавленного мной в проект.

    Какой же код я добавил в HTML-проект, чтобы заработало традиционное приветствие? Прежде всего, я добавил тег <Script> с описанием функции Hello. Этот тег был вставлен в конец заголовка проекта непосредственно перед закрывающим тегом <Head>. Вот этот текст:

    <script id="Hello" language="VBScript">
    	
    <!--
    	Function Hello()
    		Dim Answer
    		Answer = InputBox("Enter Your Name, please")
    		MsgBox ("Hi "  Answer  "!")
    		UserName.innerText = "Hello, "  Answer "!"
    	End Function 
    -->
    </script>

    Я задал также атрибут "onload" тега <body> и добавил тег <div>, для которого установил значение id, равное "UserName". Тег <div> (от division - раздел) задает местоположение раздела, в который программным путем я запишу имя, введенное пользователем.

    Приведу полный код, начиная с открывающего и кончая закрывающим тегом <body>. Большая часть этого кода сформирована автоматически.

    <body lang=EN-US style='tab-interval:36.0pt' onload="Hello()">
    
    <div class=Section1>
    
    <h3><span lang=RU>Документ, содержащий </span><span style='mso-ansi-language:
    EN-US'>Script</span><span lang=RU> код.<o:p></o:p></span></h3>
    </div>
    <div id=UserName>
    
    <!-- Сюда вставляется имя, введенное пользователем -->
    
    </div>
    
    
    </body>

    Учитывая, что не все знакомы с языками HTML и VBScript, приведу подробные комментарии.

  • Замечу, прежде всего, что я, как и многие авторы, пишущие о языке HTML, допустил некоторую терминологическую вольность. Когда я говорил, что мною добавлен тег Script, то фактически речь шла об элементе Script языка HTML. Как и большинство других элементов языка HTML, элемент Script состоит из открывающего и закрывающего тега Script и внутреннего HTML-текста. Для элемента Script внутренний HTML-текст задает Script-код, который может служить описанием функций, а может и непосредственно исполняться.
  • Открывающий тег Script содержит два атрибута - id и language. Для них заданы соответственно значения "Hello" и "VBScript". Выше я отмечал, что значение атрибута id, позволяет идентифицировать объект Script в соответствующей коллекции Scripts. Значение "VBScript" атрибута language указывает браузеру, что код написан на языке VBScript, альтернативой могло бы быть значение "JavaScript".
  • Script-код, содержащий описание функции Hello, закомментирован, - находится в теле тега комментария, начинающегося символами "<!--" и заканчивающегося последовательностью "-->". Браузер Internet Explorer понимает такой код и принимает его к исполнению. Другие же браузеры, не умеющие выполнять код VBScript как, например, Netscape Navigator, воспримут этот текст, как комментарий.
  • Заметьте, описание функции Hello на VBScript за исключением последней строчки было бы приемлемым и для функции, написанной на VBA. Здесь вызываются известные встроенные функции InputBox и MsgBox, позволяющие организовать диалог с пользователем - запросить у него имя и затем открыть окно с приветствием пользователя, используя введенное имя. Заметьте также, что тип переменной Answer при объявлении не указан.

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

  • Последняя строчка описания функции Hello специфична для VBScript, поскольку в ней используется объект Web-страницы. Каждый тег, расположенный на Web-странице, рассматривается как объект. Зная его id, с ним можно работать. Я уже ввел тег <div>, задал его id, а в функции Hello программным путем формирую его внутренний текст, зная имя, введенное пользователем.
  • Задание значения "Hello" для атрибута "onload" тега <body> означает, что в момент загрузки документа будет вызываться функция "Hello", которая и организует нужный диалог с пользователем. Здесь используется типичная обработка события, обработчик события Load вызывает функцию Hello. Вот как выглядит открытие этого документа в Internet Explorer:
  • (рис 5.3) Открытие документа, содержащего Script-код

    Я не буду приводить окно приветствия, открываемое функцией MsgBox, - оно выглядит стандартным образом, но все-таки приведу окончательный вид Web-страницы после программного добавления текста в тег <div>:

    (рис 5.4) Программная вставка текста на Web-странице

    Побочным результатом моей работы в Редакторе VBScript является появление у документа объекта Script и, соответственно, непустой коллекции объектов Scripts, так что появилась возможность программной работы с этими объектами. В окне отладки я провел несколько экспериментов, анализируя некоторые свойства этих объектов. Вот эти результаты:

    ? ActiveDocument.Scripts.Count
     1 
    ? ActiveDocument.Scripts(1).Id
    Hello
    ? ActiveDocument.Scripts(1).Language
     2 
    ? ActiveDocument.Scripts(1).Location
     1 
    ? ActiveDocument.Scripts(1).ScriptText
    	
    <!--
    	Function Hello()
    		Dim Answer
    		Answer = InputBox("Enter Your Name, please")
    		MsgBox ("Hi "  Answer  "!")
    		UserName.innerText = "Hello, "  Answer "!"
    	End Function 
    -->

    Единственный элемент коллекции Scripts - объект Script появился в момент создания в Редакторе соответствующего элемента HTML. Свойства объекта полностью отражают свойства этого элемента. Свойство Location, например, указывает, что элемент Script расположен в заголовочной части Web-страницы, - принадлежит тегу <Head>, а не <Body>. Значения некоторых свойств можно менять программно. В частности, программно можно изменить сам Script-код. Вот, функция, добавляющая еще одну строку в тело функции "Hello":

    Public Sub ChangeProperties()
    	'Изменение свойств объекта Script
    	Dim Txt1 As String, Txt2 As String
    	Dim Ind As Integer
    	Dim TxtAdd As String
    	'Добавляемая строка кода
    	TxtAdd = "MsgBox (""Bye-Bye ""  Answer  ""!"")" _
    		 vbCrLf  vbTab
    	With ActiveDocument.Scripts("Hello")
    		Txt1 = .ScriptText
    		'Добавление строки кода в текст функции
    		Ind = VBA.InStrRev(Txt1, "End Function")
    		Txt2 = VBA.Left(Txt1, Ind - 1)  TxtAdd _
    			 VBA.Right(Txt1, VBA.Len(Txt1) - Ind + 1)
    		.ScriptText = Txt2
    		' Нельзя программно изменить значение свойства Location
    		'.Location = 2
    	End With
    	'Обновление проекта после сделанных изменений
    	ActiveDocument.HTMLProject.RefreshProject
    End Sub

    В процедуре читается Script-код объекта Script, затем этот код модифицируется программным путем и измененное значение присваивается вновь объекту, что меняет его поведение. Обратите внимание, после введения изменений вызывается метод RefreshProject объекта HTMLProject, сохраняющий в проекте сделанные изменения.

    Эта процедура демонстрирует один из возможных способов "программирования на лету". Другой способ использует уже упоминавшийся метод Add, которым обладает коллекция Scripts. Я не буду углубляться в детали описания и использования объектов Script и HTMLProject, надеясь, что этих обзорных сведений достаточно, чтобы понять суть этих объектов и их возможности. В заключение скажу только, что работа с объектами Script возможна только в приложениях Word, Excel и Power Point.

    Языковые предпочтения и шрифты Web-страниц

    Нововведения в Office 2000 полезны разработчикам, использующим разные языки. Одно из таких замечательных качеств - возможность изменять язык интерфейса, справочной системы буквально "на лету". Раз языковые установки можно менять, то появился общий для приложений Office 2000 объект LanguageSettings, свойства которого позволяют проверить, какие именно установки приняты для интерфейса, справочной системы, инсталляционные установки, определяющие, например, вид цифр. Используя свойства этого объекта, можно также определить, какие языки (их может быть несколько) являются предпочтительными при редактировании текстов. Вот процедура, проверяющая все эти установки:

    Public Sub LangSet()
    	'Проверка языковых установок
    	With Application.LanguageSettings
    	If .LanguagePreferredForEditing(msoLanguageIDRussian) _
    		And .LanguagePreferredForEditing(msoLanguageIDEnglishUS) Then
    		MsgBox "Русский и Английский - оба являются предпочтительными языками редактирования"
    	End If
    	MsgBox "Для данного документа выбраны следующие языковые установки "  _
    	vbCrLf  "Язык инсталляции - "  .LanguageID(msoLanguageIDInstall)  _
    	vbCrLf  " Язык интерфейса - "  .LanguageID(msoLanguageIDUI)  _
    	vbCrLf  " Язык справки - "  .LanguageID(msoLanguageIDHelp)
    
    	End With
    End Sub

    Появление нового объекта WebPageFont и соответствующей коллекции связано с уже многократно упоминавшейся тенденцией представления документов Office 2000 в виде Web-страниц. Объект WebPageFont позволяет установить, какой шрифт будет использоваться по умолчанию на Web-страницах в качестве пропорционального шрифта и шрифта фиксированной ширины, а также размер этих шрифтов. Вот простая процедура, изменяющая эти установки:

    Public Sub ChangeFonts()
    	'Изменение свойств Web-шрифтов
    	With Application.DefaultWebOptions
    	.Fonts(msoCharacterSetCyrillic) _
    		.ProportionalFont = "Arial Cyr"
    	.Fonts(msoCharacterSetCyrillic) _
    		.FixedWidthFont = "Times New Roman Cyr"
    	.Fonts(msoCharacterSetCyrillic) _
    		.ProportionalFontSize = 12
    	.Fonts(msoCharacterSetCyrillic) _
    		.FixedWidthFontSize = 14
    	Debug.Print .Fonts(msoCharacterSetCyrillic).ProportionalFont
    	Debug.Print .Fonts(msoCharacterSetCyrillic).ProportionalFontSize
    	Debug.Print .Fonts(msoCharacterSetCyrillic).FixedWidthFont
    	Debug.Print .Fonts(msoCharacterSetCyrillic).FixedWidthFontSize
    	End With
    End Sub

    Константы mso…

    Библиотека Office 9.0 содержит набор констант, начинающихся с префикса mso. Каждая константа является элементом некоторого перечисления, задающее возможное множество значений, которые допустимы при работе со свойствами и методами объектов, входящих в эту библиотеку. Две последние процедуры являются хорошим примером использования таких констант.

    На этом я закончу описание общих объектов, входящих в библиотеку Office 9.0, подключаемую по умолчанию ко всем документам Office 2000.

    Объекты библиотеки Microsoft Forms 2.0

    В отличие от библиотеки Microsoft Office 9.0 Object Library библиотека Microsoft Forms 2.0 не входит в каркас документа в момент его создания. Тем не менее, эта библиотека подключается к большинству документов Office 2000, поскольку документы, не имеющие развитых средств интерфейса с пользователем, являются редкостью, а интерфейс, как правило, основан на формах - диалоговых окнах, населенных элементами управления. При создании интерфейса документа, обычно в режиме проектирования, но, возможно, и программно, при первом же подключении формы к документу, библиотека Microsoft Forms 2.0 автоматически подключается к проекту документа.

    Эта библиотека содержит класс объектов UserForm, определяющий саму форму, и классы объектов, задающих различные элементы управления, такие как CheckBox, ComboBox, CommandButton и другие. Когда на форме размещается тот или иной элемент управления - кнопка, список, текстовое поле, то в программном проекте, точнее в модуле, связанном с формой, автоматически создается объект соответствующего класса, с которым можно программно работать. Классы, задающие элементы управления, входят в состав библиотеки Forms 2.0 и составляют ее основу. Их относительно немного, - они соответствуют так называемым стандартным элементам управления.

    Что же еще входит в состав этой библиотеки? Прежде всего, следует упомянуть два класса - Control и Controls. Первый из них задает общий класс элементов управления, задающий их свойства, методы и события, независящие от конкретного типа элемента управления. Таким образом, каждый объект, задающий элемент управления, одновременно принадлежит двум классам - конкретному и общему. Класс Controls, как обычно, задает коллекцию элементов управления.

    Хочу обратить внимание, на важность класса Control. Дело в том, что на форме можно размещать как стандартные, так и дополнительные элементы управления. Число возможных дополнительных элементов управления велико и все время пополняется, - они разрабатываются, как Microsoft, так и независимыми фирмами. Напомню, как можно поместить дополнительные элементы управления в форму. Если в режиме проектирования на инструментальной панели ToolBox нажать правую кнопку, то в контекстном меню появится пункт "Additional Controls", при выборе которого появится длинный список дополнительных элементов управления. Любой элемент из этого списка можно включить, поместив его тем самым на инструментальную панель, а затем уже обычным способом перенести при необходимости в форму. Понятно, что в библиотеке Forms 2.0 нет классов, задающих такие объекты. Но зато есть общий класс Control, которому принадлежат как стандартные, так и дополнительные элементы управления, что позволяет со всеми элементами управления работать программно.

    Я не буду сейчас подробно рассказывать о каждом из классов объектов, входящих в состав библиотеки Forms 2.0, ограничусь только этим кратким обзором. Разрешите поставить точку, но прежде одно замечание. В библиотеку Forms 2.0 включен и ряд стандартных элементов управления, используемых при работе в формате HTML. По существу, для многих классов, задающих стандартные элементы управления, имеются и соответствующие HTML-классы, как, например, HTMLCheckBox, HTMLOption, HTMLText, HTMLPassword. В справочной системе сведения о них отсутствуют, а я пока не разобрался, как с ними можно работать. Я подозреваю, что эти объекты появляются в проекте, когда в Редакторе VBScript на Web-страницу добавляются соответствующие элементы управления. Но это гипотеза, требующая проверки. Напомню, что и в Редакторе VBScript есть своя инструментальная панель ToolBox c HTML-элементами управления.

    Библиотека объектов VBA

    При описании объектов этой библиотеки я также ограничусь обзором, прежде всего, по той причине, что эту библиотеку в отличие от прочих составляют не столько объекты, сколько методы, собранные в стандартные модули. Библиотеку VBA составляют три класса объектов, 13 модулей и большое число перечислений, задающих константы, используемых в тех или иных ситуациях.

    Классы библиотеки VBA

    В библиотеку VBA входят три класса объектов:

  • Collection - встроенный в язык VBA динамический класс данных. Очень мощная языковая конструкция, объединяющая достоинства массивов и динамических линейных списков. Также как и массив задает упорядоченную совокупность элементов, к каждому из которых возможен прямой доступ. Но, в отличие от массива может объединять элементы разного типа, не имеет фиксированной длины, создается динамически. Допускается эффективная вставка и удаление любых элементов коллекции, что для массивов, вообще говоря, недопустимо. В сравнении с динамическими списками, для которых также возможны эффективно реализуемые операции по вставке и удалению элементов, несомненным преимуществом коллекции является возможность прямого доступа к ее элементам. При этом доступ возможен как по индексу элемента, так и по ключу, в качестве которого может использоваться произвольное строковое выражение. В классе определены методы Add, Item, Remove и свойство Count.
  • ErrObject - этот специфический класс описывает единственный объект Err, создаваемый автоматически вместе с проектом и имеющим глобальную область определения. Этот объект содержит информацию о последней ошибке выполнения. Он имеет два метода - Clear и Raise и шесть свойств: Number, Source, Descrition, HelpFile, HelpContext и LastDLLError.
  • Global - этот класс имеет одно свойство UserForms и два метода - Load и Unload. Глобальное свойство UserForms позволяет получить коллекцию форм, связанных с приложением. Заметьте, сам объект UserForm находится в одной библиотеке - Forms 2.0, а коллекция этих объектов принадлежит глобальному классу библиотеки VBA. Методы Load и UnLoad также связаны с формами. Они позволяют загрузить и выгрузить форму. Оба метода должны быть глобальными и не могут принадлежать к методам самой формы, поскольку первый начинает работать, когда формы еще нет, а второй заканчивает работу, когда формы уже нет.

    Модули библиотеки VBA

    Как я уже говорил, большую часть библиотеки VBA составляют различные стандартные процедуры, встроенные в язык. Эти процедуры и функции, называемые методами, объединены в зависимости от их предназначения в те или иные модули. Ограничусь кратким описанием этих модулей:

  • Conversion - в этот модули собраны различные функции, выполняющие преобразование между типами. Прежде всего, сюда входит большая группа функций приведения к типу. Имена этих функций состоят из префикса "C", за которым следует имя типа, к которому идет приведение. Так функция CInt(x) выражение x приводит к целому типу, если, конечно, такое преобразование возможно. В этом же модуле находятся и такие известные функции, как Val и Str, осуществляющие взаимное преобразование численного и строкового значения, представляющего число.
  • DateTime - в этом модуле собраны не только методы, но и свойства, в совокупности, обеспечивающие работу с датами и временами.
  • FileSystem - этот модуль содержит функции, необходимые при работе с файлами.
  • Financial - модуль, содержит финансовые функции. Набор этих функций не столь внушителен в сравнении с набором финансовых функций, доступных в Excel. Но, несомненно, и эти функции полезны, в тех ситуациях, когда в процедурах программного проекта нужно вести финансовые расчеты, а проект не связан с документом Excel.
  • Math и Strings - модули, содержащие наборы математических и функций для работы со строками.
  • Information - большинство из функций этого набора позволяют отвечать на ряд вопросов, снабжая программиста дополнительной информацией. К ним относятся Is- функции, имя которых состоит из префикса Is, после которого следует имя типа. Эти функции позволяют уточнить тип значения переменной, объявленной как Variant. Так функция IsObject позволяет узнать, представляет ли значение такой переменной некоторый объект. В этот же набор входит и такая функция, как RGB, позволяющая задать требуемый цвет по его трем компонентам - красной, зеленой и голубой составляющим цвета.
  • Interaction - модуль, включающий очень важные функции, обеспечивающие взаимодействие с пользователем. Упомяну лишь четыре функции из этого набора. Функции InputBox и MsgBox используются для ввода и вывода сообщений в процессе диалога с пользователем. Без них практически не обходится ни один пример. Функция Shell позволяет запускать на выполнение exe-модуль. Пример ее использования приведен в лекции 8, где рассказывается о том, как организовать просмотр созданного справочного руководства. Функция CreateObject позволяет создать объект, хранящийся в DLL. Она используется, если такой объект не может быть создан конструкцией New. В этот же модуль входят и многие другие полезные функции.
  • Constants, ColorConstants, KeyCodeConstants, SystemColorConstants - в этих четырех модулях сгруппированы различные константы, назначение которых можно определить по имени модуля.
  • На этом я закончу обзор этой библиотеки.

    Библиотека объектов VBIDE

    В отличие от большинства библиотек, содержащих общие объекты, библиотека VBIDE не подключается к каркасу документа по умолчанию. Она не подключается автоматически, как это происходит с библиотекой Forms 2.0 при создании формы. Эту библиотеку необходимо подключать самому вручную или программно в тех случаях, когда предполагается программная работа с самим программным проектом. Программирование на лету, программное создание форм, инструментальных панелей и других элементов интерфейса - все это требует работы с объектами, содержащимися в этой библиотеке. Так что это одна из важнейших библиотек объектов, необходимых в работе программиста. Приведу обзор содержимого этой библиотеки.

    Объекты библиотеки VBIDE
    Объекты Основные Свойства Основные Методы Назначение
    AddIn Collection, Connect, Description, GUID, Object, ProgID, VBE нет Класс Addin описывает надстройки, специфические для того или иного приложения и самого VBA. Поэтому этот класс включен во все библиотеки - Word, Excel и, в том числе, библиотеку VBIDE.
    AddIns Count, VBE Item, Update Коллекция объектов AddIn, доступных в среде разработки программного проекта.
    CodeModule CodePane, CountOfLines, CountOfDeclarationLines, ProcBodyLine Всего 11 свойств AddFromFile, AddFromString, InsertLines, ReplaceLines, Find, CreateEventsProc, DeleteLines Представляет код модуля. Является одним из основных объектов, с которым приходится работать при программировании на лету. Примеры использования даны в лекции 4.
    CodePane CodeModule, CodePaneView, Collection, CountOfVisibleLines, TopLine, VBE, Windows GetSelection, SetSelection, Show Подокно, в котором отображается код модуля. Такое окно может быть не единственным.
    CodePanes Count, Parent, VBE Item Коллекция активных подокон кода.
    ContainedVBControls Count, Parent, VBE Add, Item. Remove Коллекция объектов VBControl
    Events и связанные с ним классы: CommandBarEvents, FileControlsEvents, RefererncesEvents, SelectedVBControlsEvents, VBComponentsEvents, VBControlsEvents, VBProjectsEvents Свойства класса Events возвращают объект одного из связанных классов, каждый из которых обладает некоторым набором событий. Эти события могут включаться в AddIn для VBA.
    IDTExtensibility Нет OnAddInsUpdate, OnConnection, OnDisConnection, OnStartUpComplete Этот объект позволяет реализовать стандартный интерфейс в AddIn для VBA.
    LinkedWindows Count, VBE Add, Item, Remove Коллекция окон, связанных с VB IDE
    Member Всего 19 свойств нет Некоторый набор свойств, допустимых при работе с проектом. Включает общедоступные (public) атрибуты из библиотеки типов.
    Members Count, Parent, VBE Item Коллекция элементов модуля. Соответствует тому, что можно увидеть в правом окне при выборе модуля в окне просмотра объектов.
    Property Collection, IndexedValue, Name, NumIndices, Object, Value, VBE нет Представляет свойства объекта
    Properties Count, Parent, VBE Item Коллекция объектов Property
    References Count, Parent, VBE AddFromFile, AddFromGUID, Item, Remove. Два события: ItemAdded, ItemRemoved Коллекция ссылок. Позволяет программным путем добавлять и удалять ссылки на библиотеки и проекты.
    SelectedVBControls Count, Parent, VBE Clear, Copy, Cut, Item. Два события: ItemAdded, ItemRemoved Коллекция выбранных элементов формы.
    VBComponent CodeModule, Designer, HelpContextId и другие. Всего 15 свойств. Activate, InsertFile, SaveAs и другие. Всего 7 методов. Представляет компоненту программного проекта - модуль или форму. Один из центральных объектов при работе с программным проектом.
    VBComponents Count, Parent, VBE, StartUpObject Add, AddCustom, AddFromFile, AddFromTemplate, Item, Remove + 6 событий Коллекция компонент, составляющих программный проект.
    VBControl ClassName, ControlObject, ControlType и другие. Всего 10 свойств. ZOrder Представляет объект VBControl - элемент управления, размещаемый на форме.
    VBControls Count, Parent, VBE Add, Item, Remove. 3 события: ItemAdded, itemRemoved, ItemRenamed Коллекция объектов VBControl.
    VBE ActiveVBProject, DisplayModel, Name, 5 свойств возвращают основные коллекции: AddIns, CodePanes, CommandBars, VBProjects, Windows. Всего 18 свойств. Quit Корневой объект, задающий Редактор Visual Basic. Все остальные объекты библиотеки, так или иначе, вложены в объект VBE. С другой стороны, из любого объекта можно подняться в корень, поскольку все объекты библиотеки VBIDE содержат свойство VBE, возвращающее этот объект.
    VBForm CanPaste, ContainedVBControls, Parent, SelectedVBControls, VBControls, VBE Paste, SelectAll Объект, задающий форму в программном проекте.
    VBNewProjects Count, VBE Item Коллекция проектов, добавленных в результате выполнения специальных операций.
    VBProject VBComponents, Name, HelpFile, HelpContextID, IsDirty и другие. Всего 16 свойств. AddToolBoxProgId, MakeCompiledFile, ReadProperty, SaveAs, WriteProperty Представляет программный проект. Один из центральных объектов, без которого не обойтись при программной работе с проектом.
    VBProjects Count, Parent, VBE, IconState, StartProject. Add, AddFromFile, AddFRomTemplate, FileName, Item, Remove, SaveAs. События: ItemActivate, ItemAdded, ItemRemoved, ItemRenamed Коллекция объектов VBProject.

    Я решил привести сводку всех объектов, включенных в библиотеку VBIDE, основываясь на том, какие объекты можно увидеть в окне просмотра объектов. Для программистов, создающих достаточно серьезные программные проекты, не обойтись без работы с этими объектами, без знания их свойств и методов. Хочу предупредить, что справочная система по этим объектам частично отсутствует, а там, где она есть, оставляет желать лучшего. Более того, не со всеми из указанных свойств и методов можно реально работать в Office 2000. Некоторые из них будут реализованы в следующих версиях.

    Схожесть объектов

    Как видите, общих объектов, с которыми приходится работать в различных приложениях Office 2000, достаточно много. Схожих объектов еще больше. Вряд ли представляется возможным их перечисление. Я напомню, что схожими, я назвал объекты, имеющие общие методы или свойства. Фактически, схожими называются объекты, у которых доля одинаковых свойств и методов достаточно высока. Такое определение не является строгим и допускает определенный произвол в толковании того, являются ли два объекта схожими. Тем не менее, понятие схожести достаточно важное, поскольку облегчает изучение объектов, позволяет лучше ориентироваться в этом сложном мире объектов Office 2000.

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

  • Самый большой класс схожих объектов составляют коллекции. Заметьте, коллекции составляют, чуть ли не половину всех классов, образующих библиотеки Office 2000. Все коллекции обладают свойством Count и методом Item, который иногда называется свойством. Большинство коллекций имеют метод Add и Delete, который иногда называется Remove. Конечно же, важно при изучении этого семейства классов иметь общее представление о коллекции. В качестве эталона можно рассматривать класс Collection, встроенного в язык VBA. Все остальные классы можно рассматривать как вариации этого эталона. Замечу, что если бы и разработчики Office 2000, проектируя очередной класс коллекции, исходили бы из определенного эталона (шаблона класса), то мера схожести этих классов была бы выше. Реально, многие различия в этих классах можно было бы устранить. Понятно, что некоторые различия носят принципиальный характер. Так для коллекций, элементы которых являются встроенными объектами, методы Add и Delete являются недопустимыми.
  • Можно ожидать, что схожими будут объекты Application - Word.Application, Excel.Application и другие. Действительно, определенная схожесть есть, хотя, с моей точки зрения и здесь могла бы быть достигнута более высокая степень схожести.
  • Объекты следующего уровня, задающие документы Office 2000 в разных приложениях, - объекты Document, WorkBook, Slide и другие, еще один пример схожих объектов.
  • Много схожего в поведении объектов более низкого уровня - Range и Selection, задающих рабочую область в приложениях Word и Excel.
  • Коллекция Dialogs и объекты Dialog, входящие в состав всех приложений, представляют еще одну важную и типичную группу схожих объектов.
  • Поставим точку.

    Вернуться к учебному плану