Шаг 219.
Автоматизация Microsoft Excel. Программирование свойств MS Excel.
Использование Visual Basic Editor. Свойства коллекции VBComponents

    На этом шаге мы рассмотрим использование некоторых методов и свойств коллекции VBComponents.

    Исследуем некоторые свойства и методы коллекции VBComponents. Свойство Count представляет собой количество элементов коллекции, точнее, суммарное количество модулей классов, форм, стандартных модулей и модулей документа. Чтобы добавить новый элемент коллекции VBComponents, используем метод Add. Единственным аргументом этого метода является числовая константа, определяющая тип создаваемого элемента. Например, создадим форму Microsoft, для этого в качестве аргумента метода Add используем константу vbext_ct_MSForm=3.

procedure TForm1.Button3Click(Sender: TObject);
//Создание формы Microsoft
const
  vbext_ct_MSForm=3;
begin
  E.VBE.VBProjects.Item(1).VBComponents.Add(vbext_ct_MSForm);
end;

    Рисунки 1 и 2 иллюстрируют результат выполнения этой процедуры.


Рис.1. Редактор Visual Basic до выполнения процедуры


Рис.2. Редактор Visual Basic после выполнения процедуры

    Для того, чтобы загрузить редактор Visual Basic, нужно выполнить Сервис | Макрос | Редактор Visual Basic.

    Для добавления других типов модулей используем метод Add с другой константой в качестве аргумента. На практике в приложениях Delphi часто требуется создавать стандартные модули, содержащие тексты макросов. С чем это связано? В предыдущих шагах для работы с книгами Excel мы использовали методы, аргументы которых имеют совместимые типы данных для Excel и Delphi. При этом не возникало проблем при экспорте и импорте информации между приложением Delphi и рабочей книгой Excel. Совместимыми типами данных являются целые числа и числа с плавающей точкой, строка и дата. Данные, представляющие собой, например, массив точек, не могут передаваться из Delphi в Excel. В таких случаях мы используем возможность создания макроса средствами Delphi и передачи ему команды на выполнение. При этом макросы могут храниться в виде текстовых файлов и загружаться в проект VBE непосредственно перед выполнением и удаляться после окончания выполнения. Рассмотрим процедуру, которая демонстрирует эту возможность.

procedure TForm1.Button5Click(Sender: TObject);
//Загрузка текста модуля из текстового файла
begin
  if OpenDialog1.Execute then
     E.VBE.VBProjects.Item(1).VBComponents.Import(OpenDialog1.FileName);
end;

    Результат выполнения этой процедуры изображен на рисунках 1 (до выполнения) и 3 (после выполнения).


Рис.3. Процедура выполнена (модуль создан)

    Как быть, если текст макроса, который требуется загрузить в проект и выполнить, создается в приложении? Для этого мы должны создать новый стандартный модуль. Используем метод Add(vbext_ct_StdModule), который возвращает ссылку на созданный объект CodeModule. Объект CodeModule содержит тексты макросов и методы работы с этими текстами. Используя метод AddFromString объекта CodeModule, загружаем текст макроса.

procedure TForm1.Button6Click(Sender: TObject);
//Загрузка текста макроса из строки
const
  vbext_ct_StdModule=1;
var
  S:String;
begin
  CM:=E.VBE.VBProjects.Item(1).VBComponents.
     Add(vbext_ct_StdModule).CodeModule;
  S:='Sub Новый_макрос()'+Chr(10)+Chr(13)+
  'MsgBox "Новый макрос"'+Chr(10)+Chr(13)+'End Sub  ';
  CM.AddFromString(S);
  E.Run ('Новый_макрос()');
end;

    В результате выполнения данной процедуры будет создан, а затем и выполнен новый макрос.


Рис.4. Выполение созданного макроса

    В представленном примере мы рассмотрели и использовали только одно свойство элемента коллекции VBComponents - объект CodeModule.

    Приведем полный текст приложения.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, CheckLst, Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    OpenDialog1: TOpenDialog;
    Button5: TButton;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  E: Variant;
  CM: Variant;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
//Создание объекта Excel и его визуализация
begin
  E:=CreateOleObject('Excel.Application');
  E.Visible:=True;
end;

procedure TForm1.Button4Click(Sender: TObject);
//Создание рабочей книги
begin
  E.WorkBooks.Add;
end;

procedure TForm1.Button2Click(Sender: TObject);
//Получение номера версии VBE
var
  Version: String;
begin
  Version:=E.VBE.Version;
  MessageBox(handle,PChar(Version),'Номер версии Visual Basic',0);
end;

procedure TForm1.Button3Click(Sender: TObject);
//Создание формы Microsoft
const
  vbext_ct_MSForm=3;
begin
  E.VBE.VBProjects.Item(1).VBComponents.Add(vbext_ct_MSForm);
end;


procedure TForm1.Button5Click(Sender: TObject);
//Загрузка текста модуля из текстового файла
begin
  if OpenDialog1.Execute then
     E.VBE.VBProjects.Item(1).VBComponents.Import(OpenDialog1.FileName);
end;

procedure TForm1.Button6Click(Sender: TObject);
//Загрузка текста макроса из строки
const
  vbext_ct_StdModule=1;
var
  S:String;
begin
  CM:=E.VBE.VBProjects.Item(1).VBComponents.
     Add(vbext_ct_StdModule).CodeModule;
  S:='Sub Новый_макрос()'+Chr(10)+Chr(13)+
  'MsgBox "Новый макрос"'+Chr(10)+Chr(13)+'End Sub  ';
  CM.AddFromString(S);
  E.Run ('Новый_макрос()');
end;

end.
Текст этого приложения вместе с файлом macro.txt можно взять здесь (7,2 Кб).

    На следующем шаге мы рассмотрим некоторые свойства и методы объекта CodeModule.




Предыдущий шаг Содержание Следующий шаг