На этом шаге мы рассмотрим способы определения выделенных областей.
Мы рассмотрели случаи, когда область задается программным путем посредством адресов. Но часто пользователь просто выделяет область ячеек, а затем выполняет с ней последовательность каких-либо действий. Программист Delphi, разрабатывая свое приложение, должен учесть этот случай и обработать выделенную часть листа рабочей книги Excel. Одним из свойств объекта Application является объект Selection, который обладает множеством свойств и методов, присущих визуальным компонентам Excel, в том числе некоторыми свойствами объекта Range, позволяющими обеспечить доступ к выделенной области. В общем случае для обеспечения доступа к выделенным ячейкам можно воспользоваться оператором
Range: =Е.Selection;
который присваивает переменной Range значение ссылки на область выделенных ячеек. После этого программист может воздействовать на эту область.
Есть и другой способ обращения к выделенной области - без использования промежуточных ссылочных переменных. Можно напрямую применять к объекту Selection методы и использовать свойства объекта Range, но только когда выделена хотя бы одна ячейка. Следующие процедуры демонстрируют это.
procedure TForm1.Button7Click(Sender: TObject); //Определение адреса диапазона ячеек begin Edit8.Text:=E.Selection.Address; end; procedure TForm1.Button8Click(Sender: TObject); //Заполнение выделенного диапазона begin E.Selection.Value:=Edit9.Text; end;
На рисунке 1 представлена форма приложения Delphi, в которой используются представленные процедуры, определяющие адрес выделенной области и заполняющие все ее ячейки значением, выбранным пользователем этого приложения.
Рис.1. Работа с областью выделенных ячеек
Вот полный текст приложения.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj, ComCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; PageControl1: TPageControl; TabSheet1: TTabSheet; Edit1: TEdit; Label1: TLabel; Label2: TLabel; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; Button3: TButton; Label4: TLabel; Edit4: TEdit; Button4: TButton; Button5: TButton; TabSheet2: TTabSheet; Label5: TLabel; Edit5: TEdit; Label6: TLabel; Edit6: TEdit; Label7: TLabel; Edit7: TEdit; Button6: TButton; TabSheet3: TTabSheet; Button7: TButton; Edit8: TEdit; Label8: TLabel; Edit9: TEdit; Button8: TButton; Button9: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Edit1Exit(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Edit5Exit(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation var E:variant; WB:variant; //Ссылка на рабочую книгу Range: Variant; //Диапазон ячеек Range1: Variant; //Диапазон ячеек {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); //Создание объекта Excel и отображение окна begin E:=CreateOleObject('Excel.Application'); E.Visible:=True; end; procedure TForm1.Button2Click(Sender: TObject); //Создание рабочей книги begin E.WorkBooks.Add; WB:=E.WorkBooks.Item[1]; // Ссылка на рабочую книгу end; procedure TForm1.Edit1Exit(Sender: TObject); //Определяем ссылку на область begin Range:=E.ActiveSheet.Range[Edit1.Text]; Edit2.Text:=IntToStr(Range.Count); // Количество ячеек в области Edit3.Text:=Range.Address; // Реальный адрес области end; procedure TForm1.Button3Click(Sender: TObject); // Выделяем область begin Range.Select; end; procedure TForm1.Button5Click(Sender: TObject); // Очищаем область begin Range.Clear; end; procedure TForm1.Button4Click(Sender: TObject); // Заполняем ячейки выбранной области begin Range.Value:=Edit4.Text; end; procedure TForm1.Edit5Exit(Sender: TObject); //Определяем реальный адрес дочерней области begin Range1:=Range.Range[Edit5.Text]; Edit6.Text:=Range1.Address; //Можно по-другому: //Edit6.Text:=Range.Range[Edit5.Text].Address; end; procedure TForm1.Button6Click(Sender: TObject); //Запись в дочернюю область begin Range1.Value:=Edit7.Text; //Можно по-другому: //Range.Range[Edit5.Text].Value:=Edit7.Text; end; procedure TForm1.Button7Click(Sender: TObject); //Определение адреса диапазона ячеек begin Edit8.Text:=E.Selection.Address; end; procedure TForm1.Button8Click(Sender: TObject); //Заполнение выделенного диапазона begin E.Selection.Value:=Edit9.Text; end; procedure TForm1.Button9Click(Sender: TObject); //Очистка выделенного диапазона begin E.Selection.Clear; end; end.
На следующем шаге мы рассмотрим очистку и заполнение выделенных областей.