До этого мы рассматривали доступ к элементам рабочей книги и элементам
управления из внешних приложений Delphi. Для полного представления о
возможностях управления приложением Excel из внешних программ этого
недостаточно. Объектная модель Excel позволяет управлять не только эле-
ментами создаваемых документов, но и элементами программ на встроен-
ном языке. Для доступа к элементам программ используется объект VBE.
Родительским объектом для VBE является Application (Application.VBE), a
свойства и методы самого объекта VBE позволяют полностью управлять
приложениями Visual Basic из внешних программ. На рис. 16.18 представле-
на часть общей объектной модели VBE, позволяющая понять, каким обра-
зом можно получить доступ непосредственно к текстам встроенных макро-
сов.
Объект VBE включает в себя коллекции проектов, областей программ, эле-
ментов управления и коллекцию окон редактора. Очевидно, что, используя
перечисленные ссылки, можно получить доступ к элементам этих коллек-
ций и к их свойствам. Кроме этих коллекций объект VBE включает ссылки
на активные элементы этих коллекций и собственные свойства. Собствен-
ным свойством является строка, содержащая номер версии редактора. В ко-
нечном итоге нам в целях разработки эффективных приложений достаточно
будет получить доступ к текстам макросов. Для того чтобы создать новые
или изменить уже существующие программные модули VB, используем
свойства VBE, представленные в табл. 16.5.
Таблица 16.5. Свойства объекта VBE
Когда по условиям логики работы вашего приложения требуется знать вер-
сию Visual Basic Editor, можно воспользоваться свойством Version объекта
VBE и получить номер версии редактора.
Получение номера версии VBE
procedure TForm1.Button17Click(Sender: TObject);
var Version:string;
begin
Version:=E.VBE.Version;
messagebox(handle,pchar(Version),'Номер версии Visual Basic',0);
end;
Для программирования приложений знать только номер версии часто быва-
ет недостаточно, поэтому обратим внимание на коллекции VBProjects и CodePanes.
Первая представляет собой список, как правило, совпадающий со
списком открытых рабочих книг. Каждая рабочая книга может содержать
программные модули, модули классов, формы и модули документов. Сово-
купность всех или части перечисленных элементов представляет собой про-
ект. Далее мы будем рассматривать только программные модули, которые
являются элементами коллекции VBComponents и могут быть добавлены
или удалены с помощью методов этой коллекции. Коллекция CodePanes
позволяет только обеспечить доступ к текстам программных модулей. На-
пример, доступ к программному модулю первого элемента CodePanes осу-
ществляется с помощью следующего оператора:
CodeModule :=E.VBE.CodePanes.Item(1).CodeModule
Рис. 16.18. Фрагмент объектной модели VBE
Программный модуль непосредственно содержит тексты макросов. Методы
и свойства этого объекта (CodeModule) мы рассмотрим позже. Сейчас вер-
немся к рассмотрению свойств элемента коллекции VBProjects, доступ
к которому обеспечивает метод Item(i:Integer). Его свойства перечислены
в табл. 16.6.
Таблица 16.6. Свойства элемента коллекции VBProjects
В табл. 16.6 перечислены свойства любого проекта, созданного в среде ра-
бочей книги Excel. Используем только коллекцию VBComponents, которая
представляет собой набор элементов, входящих в проект (табл. 16.7).
Таблица 16.7. Свойства и методы коллекции VBComponents
Исследуем некоторые свойства и методы этой коллекции. Свойство Count
представляет собой количество элементов коллекции, точнее, суммарное
количество модулей классов, форм, стандартных модулей и модулей доку-
мента. Чтобы добавить новый элемент коллекции VBComponents, использу-
ем метод Add. Единственным аргументом этого метода является числовая
константа, определяющая тип создаваемого элемента. Например, создадим
форму Microsoft, для этого в качестве аргумента метода Add используем
константу vbext_ct_MSForm=3.
Создание формы Microsoft
procedure TForm1.Button22Click(Sender: TObject);
begin
E.VBE.VBProjects.Item(l).VBComponents.Add (vbext_ct_MSForm)
end;
Рис. 16.19. В приложении VB создана новая форма Microsoft
На рис. 16.19 представлен результат выполнения данной процедуры.
Для добавления других типов модулей используем метод Add с другой кон-
стантой в качестве аргумента. На практике в приложениях Delphi часто тре-
буется создавать стандартные модули, содержащие тексты макросов. С чем
это связано? В предыдущих главах для работы с книгами Excel мы исполь-
зовали методы, аргументы которых имеют совместимые типы данных для
Excel и Delphi. При этом не возникало проблем при экспорте и импорте
информации между приложением Delphi и рабочей книгой Excel. Совмес-
тимыми типами данных являются целые числа и числа с плавающей точ-
кой, строка и дата. Данные, представляющие собой, например, массив то-
чек, не могут передаваться из Delphi в Excel. В таких случаях мы использу-
ем возможность создания макроса средствами Delphi и передачи ему
команды на выполнение. При этом макросы могут храниться в виде тексто-
вых файлов и загружаться в проект VBE непосредственно перед выполнени-
ем и удаляться после окончания выполнения. Рассмотрим процедуру, кото-
рая демонстрирует эту возможность.
Загрузка текста модуля из текстового файла
procedure TForml.Button23Click(Sender: TObject);
begin
i f not 0penDialog2.Execute then exit;
E.VBE.VBProjects.Item(l).VBComponents.Import(0penDialog2.FileName);
end;
Как быть, если текст макроса, который требуется загрузить в проект и вы-
полнить, создается в приложении? Для этого мы должны создать новый
стандартный модуль. Используем метод Add(vbext_ct_StdModule), который
возвращает ссылку на созданный объект CodeModule. Объект CodeModule
содержит тексты макросов и методы работы с этими текстами. Используя
метод AddFromString объекта CodeModule, загружаем текст макроса.
Загрузка текста макроса из строки
procedure TForml.Button24Click(Sender: TObject);
var text_macro:String;
begin
CodeModule:=E.VBE.VBProj ects.Item(1).VBComponents.
Add(vbext_ct_StdModule).CodeModule;
textjnacro:='Sub Новый_макрос()'+Chr(10)+Chr(13)+
'MsgBox "Новый макрос1" +Chr(10)+Chr(13) + 'End Sub ';
CodeModule.AddFromString(text_macro);
E.Run('Новый_макрос()');
end;
В результате выполнения данной процедуры будет создан, а затем и выпол-
нен новый макрос. В представленном примере мы рассмотрели и использо-
вали только одно свойство элемента коллекции VBComponents — объект
CodeModule. Сам объект CodeModule содержит тексты макросов и набор
методов и свойств, позволяющих манипулировать ими (табл. 16.8).
Таблица 16.8. Некоторые свойства и методы объекта CodeModule
Используя свойство Lines, получим текст модуля проекта на языке Visual
Basic. Для этого воспользуемся следующей процедурой.
Получение текста модуля
var CodeModule:variant;
procedure TForml.Button21Click(Sender: TObject);
var Text_modula:string;
begin
CodeModule:=E.VBE.VBProj ects.Item(1) .VBComponents.Item(1).CodeModule;
Text_modula:=CodeModule.Lines[1, CodeModule.CountOfLines];
messagebox(handle,pchar(Text_modula) , '',0) ;
end;
Перед тем как воспользоваться представленной процедурой, необходимо
открыть рабочую книгу, которая должна содержать макросы. При этом ре-
зультат выполнения процедуры будет выглядеть так, как показано на
рис. 16.20.
В заключение рассмотрим пример с использованием программирования па-
нелей, элементов управления и макросов. В этом примере мы из приложе-
ния Delphi создадим временные элементы управления и процедуру на http://www.vb2010.ru, выполним ее и удалим созданные компоненты.
Создание и использование макроса из приложений Delphi
Рис. 16.20. Отображаем содержимое программного модуля
В первом операторе данного примера мы создаем программный модуль и
получаем доступ к нему, чтобы записать текст создаваемого макроса. Далее
в строковую переменную записываем текст создаваемого макроса, учитывая
стиль написания операторов Visual Basic. Оператор
CodeModule.AddFromString(eee_);
где еее_ — строка, содержащая текст макроса, записывает текст макроса в
модуль. Далее создаем меню и кнопку, в свойство OnAction которой запи-
сываем строку — имя модуля и макроса, разделенные точкой. Метод
Execute кнопки запускает созданный макрос на выполнение. Далее удаляем
кнопку, панель и компонент, содержащий программный модуль.
Если эту процедуру выполнять по шагам, то сможем наблюдать следующее.
На первом этапе мы видим в окне редактора Visual Basic, как создается про-
граммный модуль и в него записывается текст макроса (рис. 16.21).
Рис. 16.21. Создан модуль и записан текст макроса
Рис. 16.22. Макрос запущен на выполнение
Далее выполняются метод Execute кнопки, с которой связан макрос, и про-
грамма на Visual Basic, записанная в программном модуле (рис. 16.22).
После выполнения удаляются созданные элементы управления и программ-
ный модуль с текстом подпрограммы на Visual Basic (рис. 16.23).
Рис. 16.23. Макрос выполнен, элементы управления и программный модуль удалены |