Шаг 220.
Автоматизация Microsoft Excel. Программирование свойств MS Excel.
Использование Visual Basic Editor. Свойства и методы объекта CodeModule

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

    В примере предыдущего шага мы рассмотрели и использовали только одно свойство элемента коллекции VBComponents - объект CodeModule. Сам объект CodeModule содержит тексты макросов и набор методов и свойств, позволяющих манипулировать ими (таблица 1).

Таблица 1. Некоторые свойства и методы объекта CodeModule
Свойство или метод Тип Назначение
AddFromFile Метод Загрузка текста из файла
AddFromString Метод Загрузка текста из строки
CountOfLines Integer Количество строк текста в программном модуле
CountOfDeclarationLines Integer Количество строк текста в разделе описании
InsertLines Метод Вставка текста из строки
DeleteLines Метод Удаление текста из модуля
Lines Метод Возвращение текста модуля
ProcBodyLine Integer Номер первой строки процедуры
ProcCountLines Integer Количество строк в процедуре
ProcOfLine String Имя процедуры, содержащей строку с заданным номером
ProcStartLine Integer Номер строки, с которой начинается заданная процедура

    Используя свойство Lines, получим текст модуля проекта на языке Visual Basic. Для этого воспользуемся следующей процедурой.

procedure TForm1.Button7Click(Sender: TObject);
//Получение текста модуля
var
  S:string;
  Y:Integer;
begin
  //Количество элементов коллекции
  Y:=E.VBE.VBProjects.Item(1).VBComponents.Count;
  //Получить ссылку на последний элемент коллекции
  CM:=E.VBE.VBProjects.Item(1).VBComponents.
       Item(Y).CodeModule;
  S:=CM.Lines[1,CM.CountOfLines];
  MessageBox(handle,PChar(S),'',0);
end;

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


Рис.1. Отображаем содержимое программного модуля

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

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;
    Button7: 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);
    procedure Button7Click(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;

procedure TForm1.Button7Click(Sender: TObject);
//Получение текста модуля
var
  S:string;
  Y:Integer;
begin
  //Количество элементов коллекции
  Y:=E.VBE.VBProjects.Item(1).VBComponents.Count;
  //Получить ссылку на последний элемент коллекции
  CM:=E.VBE.VBProjects.Item(1).VBComponents.
       Item(Y).CodeModule;
  S:=CM.Lines[1,CM.CountOfLines];
  MessageBox(handle,PChar(S),'',0);
end;

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

    На следующем шаге мы рассмотрим пример небольшого приложения.




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