Шаг 183.
Автоматизация Microsoft Excel. Диаграммы в рабочей книге Excel.
Свойство Formula

    На этом шаге мы рассмотрим использование свойства Formula.

    Рассмотрим еще одно свойство объекта Series, являющееся альтернативой задания области исходных данных для построения диаграммы. Это свойство имеет строковый тип и содержит формулу, по которой строится ряд диаграммы. Свойство Formula принадлежит непосредственно объекту Series. Следующая процедура иллюстрирует его использование для получения выражения формулы для первого ряда (рисунок 1).

procedure TForm1.Button19Click(Sender: TObject);
//Получение формулы
var
  S: String;
begin
  Series:=Chart.SeriesCollection(1);
  S:=Series.Formula;
  MessageBox(handle,pchar(S),'',0);
end;


Рис.1. Формула для построения первого ряда

    Используя формулы для объекта Series, можно изменить область исходных данных для построения ряда.

    Следующая процедура изменяет границы области исходных данных построения для выбранного ряда диаграммы:

procedure TForm1.Button20Click(Sender: TObject);
//Изменение формулы
begin
  Series:=Chart.SeriesCollection(2); //Выбор ряда
  Series.FormulaLocal:='=РЯД(;;Лист1!A2:D2;3)';
end;

    Результат ее работы изображен на рисунке 2.


Рис.1. Результат изменения границы области исходных данных

    Обатите внимание, что второй ряд разместился на рисунке 2 на третьем месте. Место размещения определяется последним параметром в конструкции РЯД (смотри последнюю процедуру); его значение там равно 3.

    Было использовано свойство FormulaLocal для задания формулы, а не свойство Formula потому, что оно позволяет задавать формулу с учетом локализации Microsoft Excel.

    Вот полный текст приложения.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, Spin, ExtDlgs, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    ComboBox1: TComboBox;
    Label1: TLabel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Button6: TButton;
    SpinEdit1: TSpinEdit;
    ScrollBar1: TScrollBar;
    ComboBox2: TComboBox;
    Button7: TButton;
    ComboBox3: TComboBox;
    Label2: TLabel;
    TabSheet2: TTabSheet;
    CheckBox1: TCheckBox;
    Label3: TLabel;
    Edit1: TEdit;
    CheckBox2: TCheckBox;
    Button8: TButton;
    Button9: TButton;
    FontDialog1: TFontDialog;
    ColorDialog1: TColorDialog;
    TabSheet3: TTabSheet;
    Label9: TLabel;
    SpinEdit2: TSpinEdit;
    Label10: TLabel;
    ComboBox4: TComboBox;
    Panel1: TPanel;
    Label11: TLabel;
    Label12: TLabel;
    SpinEdit3: TSpinEdit;
    Label13: TLabel;
    Label14: TLabel;
    SpinEdit4: TSpinEdit;
    SpinEdit5: TSpinEdit;
    SpinEdit6: TSpinEdit;
    Label15: TLabel;
    Label16: TLabel;
    Panel2: TPanel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    SpinEdit7: TSpinEdit;
    SpinEdit8: TSpinEdit;
    SpinEdit9: TSpinEdit;
    SpinEdit10: TSpinEdit;
    TabSheet4: TTabSheet;
    Label23: TLabel;
    Label24: TLabel;
    ComboBox5: TComboBox;
    Label25: TLabel;
    Label26: TLabel;
    SpinEdit11: TSpinEdit;
    SpinEdit12: TSpinEdit;
    SpinEdit13: TSpinEdit;
    ListBox1: TListBox;
    Label27: TLabel;
    Button10: TButton;
    Button11: TButton;
    TabSheet5: TTabSheet;
    Button12: TButton;
    Button13: TButton;
    Label28: TLabel;
    Button14: TButton;
    Button15: TButton;
    Button16: TButton;
    TabSheet6: TTabSheet;
    ListBox2: TListBox;
    Label29: TLabel;
    Button17: TButton;
    Label30: TLabel;
    ComboBox6: TComboBox;
    Label31: TLabel;
    ComboBox7: TComboBox;
    Edit2: TEdit;
    Label32: TLabel;
    Label33: TLabel;
    ComboBox8: TComboBox;
    Label34: TLabel;
    SpinEdit14: TSpinEdit;
    TabSheet7: TTabSheet;
    Label35: TLabel;
    Button18: TButton;
    ListBox3: TListBox;
    ListBox4: TListBox;
    Label36: TLabel;
    Label37: TLabel;
    ComboBox9: TComboBox;
    SpinEdit15: TSpinEdit;
    Label38: TLabel;
    Label39: TLabel;
    ComboBox10: TComboBox;
    Label40: TLabel;
    ComboBox11: TComboBox;
    TabSheet8: TTabSheet;
    Button19: TButton;
    Button20: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
    procedure ComboBox4Change(Sender: TObject);
    procedure SpinEdit3Change(Sender: TObject);
    procedure SpinEdit4Change(Sender: TObject);
    procedure SpinEdit7Change(Sender: TObject);
    procedure SpinEdit8Change(Sender: TObject);
    procedure SpinEdit11Change(Sender: TObject);
    procedure ComboBox5Change(Sender: TObject);
    procedure SpinEdit12Change(Sender: TObject);
    procedure SpinEdit13Change(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure ComboBox7Change(Sender: TObject);
    procedure ComboBox8Change(Sender: TObject);
    procedure SpinEdit14Change(Sender: TObject);
    procedure Button17Click(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
    procedure ComboBox6Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure Button18Click(Sender: TObject);
    procedure ListBox3Click(Sender: TObject);
    procedure ListBox4Click(Sender: TObject);
    procedure ComboBox9Change(Sender: TObject);
    procedure SpinEdit15Change(Sender: TObject);
    procedure ComboBox10Change(Sender: TObject);
    procedure ComboBox11Change(Sender: TObject);
    procedure Button19Click(Sender: TObject);
    procedure Button20Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  E:variant;
  Chart:Variant;
  Legend:Variant;
  Axis:Variant;
  Series:Variant;
  DataLabels:Variant;
  PNTS,PNT:Variant;
const
  xlLocationAsNewSheet=1; //Размещение диаграммы на новом листе
  xlLocationAsObject=2; //Размещение диаграммы на листе с данными

{$R *.dfm}
//Функция задания шрифта заголовка диаграммы
Function  SetFontRange(c:variant;font:Tfont):boolean;
begin
  SetFontRange:=true;
  try
  c.Font.Name:=font.Name;
  if fsBold in font.Style  then c.Font.Bold:=True // Жирный
  else c.Font.Bold:=False; // Тонкий
  if fsItalic in font.Style then c.Font.Italic:=True // Наклонный
  else c.Font.Italic:=False;  // Наклонный
  c.Font.Size:=font.Size;  // Размер
  if fsStrikeOut in font.Style then c.Font.Strikethrough:=True // Перечеркнутый
  else c.Font.Strikethrough:=False;  // Перечеркнутый
  //xlUnderlineStyleSingle - Подчеркивание
  if fsUnderline in font.Style then c.Font.Underline:=2
  else c.Font.Underline:=-4142; //xlUnderlineStyleNone - Подчеркивание
  c.Font.Color:=font.Color; // Цвет
  except
  SetFontRange:=false;
  end;
end;

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

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

procedure TForm1.Button3Click(Sender: TObject);
//Добавление диаграммы и получение ссылки на нее
var
  i:Integer;
const xl3DColumn=-4100;
      xlColumns=2;
begin
  Randomize;
  for i:=1 to 5 do
  begin
    E.ActiveSheet.Cells(1,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(2,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(3,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(4,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(5,i):=i*(1+Random(50));
  end;
  Chart:=E.Charts.Add;
  Legend:=Chart.Legend; //Ссылка на легенду
  Chart.ChartType:=xl3DColumn;
  Chart.SetSourceData(Source:=E.ActiveWorkbook.Sheets.Item['Лист1'].Range['A1:F5'],
     PlotBy:=xlColumns);
end;

procedure TForm1.Button4Click(Sender: TObject);
//Перемещение диаграммы на лист с данными
begin
  Chart.Location(Where:=xlLocationAsObject, Name:='Лист1');
  Chart:=E.ActiveChart;
  Legend:=Chart.Legend; //Ссылка на легенду
end;

procedure TForm1.Button5Click(Sender: TObject);
//Перемещение диаграммы на новый лист
begin
  Chart.Location(Where:=xlLocationAsNewSheet);
  Chart:=E.ActiveChart;
  Legend:=Chart.Legend; //Ссылка на легенду
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
//Изменение типа диаграммы
begin
  Chart.ChartType:=ComboBox1.ItemIndex+51;
end;

procedure TForm1.Button6Click(Sender: TObject);
//Задание цвета заливки
begin
   Chart.ChartArea.Fill.ForeColor.SchemeColor:=
      SpinEdit1.Value;
end;

procedure TForm1.Button7Click(Sender: TObject);
//Одноцветная градиентная заливка
begin
 Chart.ChartArea.Fill.OneColorGradient(ComboBox2.ItemIndex+1,
     ComboBox3.ItemIndex+1, ScrollBar1.Position*0.01);
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
//Показ/скрытие заголовка
begin
  if CheckBox1.State=cbUnChecked then
       Chart.HasTitle:=False
  else
    begin
       Chart.HasTitle:=True;
       Chart.ChartTitle.Text:=Edit1.Text;
    end;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
//Включение выключение тени
begin
  Chart.ChartTitle.Shadow:=CheckBox2.Checked;
end;

procedure TForm1.Button8Click(Sender: TObject);
//Задание шрифта
begin
   if FontDialog1.Execute then
     SetFontRange(Chart.ChartTitle,FontDialog1.Font);
end;

procedure TForm1.Button9Click(Sender: TObject);
//Задание цвета области Interior
begin
  if ColorDialog1.Execute then
     Chart.ChartTitle.Interior.Color:=ColorDialog1.Color
end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
//Толщина линии области построения диаграммы
begin
  Chart.PlotArea.Border.Weight:=SpinEdit2.Value;
end;

procedure TForm1.ComboBox4Change(Sender: TObject);
//Устанавливаем тип линии границы ячейки
begin
 Case ComboBox4.ItemIndex Of
  0:Chart.PlotArea.Border.LineStyle:=1;    //xlContinuous
  1:Chart.PlotArea.Border.LineStyle:=-4115;//xlDash
  2:Chart.PlotArea.Border.LineStyle:=4;    //xlDashDot
  3:Chart.PlotArea.Border.LineStyle:=5;    //xlDashDotDot
  4:Chart.PlotArea.Border.LineStyle:=-4118;//xlDot
  5:Chart.PlotArea.Border.LineStyle:=-4119;//xlDouble
  6:Chart.PlotArea.Border.LineStyle:=-4142;//xlLineStyleNone
  7:Chart.PlotArea.Border.LineStyle:=13;   //xlSlantDashDot
 End;
end;

procedure TForm1.SpinEdit3Change(Sender: TObject);
//Толщина линии основания
begin
  Chart.Floor.Border.Weight:=SpinEdit3.Value;
end;

procedure TForm1.SpinEdit4Change(Sender: TObject);
//Задание цвета основания
begin
  Chart.Floor.Border.Color:=RGB(SpinEdit4.Value,
           SpinEdit5.Value,SpinEdit6.Value);
end;

procedure TForm1.SpinEdit7Change(Sender: TObject);
//Толщина линии стен
begin
  Chart.Walls.Border.Weight:=SpinEdit7.Value;
end;

procedure TForm1.SpinEdit8Change(Sender: TObject);
//Задание цвета стен
begin
  Chart.Walls.Interior.Color:=RGB(SpinEdit8.Value,
           SpinEdit9.Value,SpinEdit10.Value);
end;

procedure TForm1.SpinEdit11Change(Sender: TObject);
//Толщина линии легенды
begin
  Legend.Border.Weight:=SpinEdit11.Value;
end;

procedure TForm1.ComboBox5Change(Sender: TObject);
//Выбор вида штриховки
begin
  Legend.Fill.Patterned(ComboBox5.ItemIndex+1);
end;

procedure TForm1.SpinEdit12Change(Sender: TObject);
//Выбор цвета изображения
begin
  Legend.Fill.ForeColor.SchemeColor:=SpinEdit12.Value;
end;

procedure TForm1.SpinEdit13Change(Sender: TObject);
//Выбор цвета фона
begin
  Legend.Fill.BackColor.SchemeColor:=SpinEdit13.Value;
end;

procedure TForm1.Button10Click(Sender: TObject);
//Заполнение списка элементов легенды
var
  i: Integer;
begin
  ListBox1.Items.Clear;
  for i:=1 to Legend.LegendEntries.Count do
    ListBox1.Items.Add(IntToStr(i));
end;

procedure TForm1.Button11Click(Sender: TObject);
//Изменяем выбранный элемент
Var
  LegendEntry,LegendKey: Variant;
begin
  // Получаем ссылку на элемент легенды
  LegendEntry:=Legend.LegendEntries.item[ListBox1.ItemIndex+1];
  // Получаем ссьшку на ключ легенды
  LegendKey:= LegendEntry.LegendKey;
  // Изменяем толщину пинии.
  LegendKey.Border.Weight:=4;
  // Изменяем цвет заливки
  LegendKey.Interior.Color:=RGB(200,50,0);
  // Получаем доступ к шрифту надписи и изменяем его.
  LegendEntry.Font.Size:=16;
end;

procedure TForm1.Button12Click(Sender: TObject);
//Настройка оси значений
const
  xlValue=2;
var
  Border:variant;
begin
  Axis:=Chart.Axes.Item(xlValue); // Получаем доступ к оси значений
  Border:=Axis.Border;       // Получаем доступ к линии оси значений
  Border.Color:=RGB(200,0,0); // и настраиваем ее свойства
  Border.Weight:=4;
end;

procedure TForm1.Button13Click(Sender: TObject);
// Показываем заголовок оси значений, получаем доступ
// к нему и настраиваем его свойства
var
  AxisTitle:variant;
begin
  Axis.HasTitle:=True;
  AxisTitle:=Axis.AxisTitle;
  AxisTitle.Border.Color:=RGB(0,200,200);
  AxisTitle.Interior.Color:=RGB(200,200,0);
  AxisTitle.Caption:='Значения';
  AxisTitle.Font.Size:=24;
end;

procedure TForm1.Button14Click(Sender: TObject);
// Получаем доступ к меткам делений оси и настраиваем их свойства
// (шрифт, формат числовых меток и направление текста (угол))
var
  TickLabels:variant;
begin
  TickLabels:=Axis.TickLabels;
  TickLabels.Font.Size:=20;
  TickLabels.NumberFormat:='$0000';
  TickLabels.Orientation:=0;
end;


procedure TForm1.Button15Click(Sender: TObject);
// Получаем доступ к меткам делений оси и настраиваем их свойства
// (толщину и цвет основных линий меток)
var
  MajorGridlines:variant;
begin
  Axis.HasMajorGridlines:=True;
  Axis.HasMinorGridlines:=False;
  MajorGridlines:=Axis.MajorGridlines;
  MajorGridlines.Border.Weight:=2;
  MajorGridlines.Border.Color:=RGB(0,0,0);
end;

procedure TForm1.Button16Click(Sender: TObject);
// Показываем линии основных и промежуточных меток.
const
  xlTickMarkCross=4;
  xlTickMarkInside=2;
begin
  Axis.MajorTickMark:=xlTickMarkCross;
  Axis.MinorTickMark:=xlTickMarkInside;
end;

procedure TForm1.ComboBox7Change(Sender: TObject);
//Задание горизонтального выравнивания
begin
 case ComboBox1.ItemIndex of
  0: DataLabels.HorizontalAlignment:=-4108; //xlHAlignCenter
  1: DataLabels.HorizontalAlignment:=-4131; //xlHAlignLeft
  2: DataLabels.HorizontalAlignment:=-4152; //xlHAlignRight
 end;
end;

procedure TForm1.ComboBox8Change(Sender: TObject);
//Задание вертикального выравнивания
begin
 case ComboBox2.ItemIndex of
  0: DataLabels.VerticalAlignment:=-4107; //xlVAlignBottom
  1: DataLabels.VerticalAlignment:=-4108; //xlVAlignCenter
  2: DataLabels.VerticalAlignment:=-4160; //xlVAlignTop
 end;
end;

procedure TForm1.SpinEdit14Change(Sender: TObject);
// Угол (направление) текста
begin
  DataLabels.Orientation:=SpinEdit14.Value;
end;

procedure TForm1.Button17Click(Sender: TObject);
//Заполнение рядов диаграмм
var
  a: Integer;
begin
  ListBox2.Items.Clear;
  for a:=1 to Chart.SeriesCollection.Count do
    ListBox2.Items.Add(Chart.SeriesCollection.Item(a).Name{IntToStr(a)});
end;

procedure TForm1.ListBox2Click(Sender: TObject);
//Выбор ряда
begin
  Series:=Chart.SeriesCollection(ListBox2.ItemIndex+1);
  DataLabels:=Series.DataLabels;
end;

procedure TForm1.ComboBox6Change(Sender: TObject);
//Выбор типа подписи
var
  XlDataLabelsType: Integer;
begin
 case ComboBox6.ItemIndex of
  0: XlDataLabelsType:=6;    //xlDataLabelsShowBubbleSizes
  1: XlDataLabelsType:=4;    //xlDataLabelsShowLabel
  2: XlDataLabelsType:=5;    //xlDataLabelsShowLabelAndPercent
  3: XlDataLabelsType:=-4142;//xlDataLabelsShowNone
  4: XlDataLabelsType:=3;    //xlDataLabelsShowPercent
  5: XlDataLabelsType:=2;    //xlDataLabelsShowValue
 end;
  Series.ApplyDataLabels(Type:=XlDataLabelsType);
  //Выбор числового формата
  DataLabels.NumberFormat:=Edit2.Text;
end;

procedure TForm1.Edit2Change(Sender: TObject);
//Выбор числового формата для отображения значений
begin
  DataLabels.NumberFormat:=Edit2.Text;
end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin

end;
//--------------- Работа с отдельными точками
procedure TForm1.Button18Click(Sender: TObject);
//Заполнение рядов диаграмм
var
  a: Integer;
begin
  ListBox3.Items.Clear;
  for a:=1 to Chart.SeriesCollection.Count do
    ListBox3.Items.Add(Chart.SeriesCollection.Item(a).Name);
end;

procedure TForm1.ListBox3Click(Sender: TObject);
//Выбор ряда и заполнение списка точек
var
  a: Integer;
begin
  Series:=Chart.SeriesCollection(ListBox3.ItemIndex+1);
  PNTS:=Series.Points;
  ListBox4.Items.Clear;
  for a:=1 to PNTS.Count do
    ListBox4.Items.Add(IntToStr(a){PNTS.Item(a).Name});
end;

procedure TForm1.ListBox4Click(Sender: TObject);
//Выбор точки
begin
  PNT:=PNTS.Item(ListBox4.ItemIndex+1);
end;

procedure TForm1.ComboBox9Change(Sender: TObject);
//Выбор типа подписи точки
var
  XlDataLabelsType: Integer;
begin
 case ComboBox9.ItemIndex of
  0: XlDataLabelsType:=6;    //xlDataLabelsShowBubbleSizes
  1: XlDataLabelsType:=4;    //xlDataLabelsShowLabel
  2: XlDataLabelsType:=-4142;//xlDataLabelsShowNone
  3: XlDataLabelsType:=2;    //xlDataLabelsShowValue
 end;
  PNT.ApplyDataLabels(Type:=XlDataLabelsType);
end;


procedure TForm1.SpinEdit15Change(Sender: TObject);
// Угол (направление) текста
begin
  PNT.DataLabel.Orientation:=SpinEdit15.Value;
end;

procedure TForm1.ComboBox10Change(Sender: TObject);
//Задание горизонтального выравнивания
begin
 case ComboBox10.ItemIndex of
  0: PNT.DataLabel.HorizontalAlignment:=-4108; //xlHAlignCenter
  1: PNT.DataLabel.HorizontalAlignment:=-4131; //xlHAlignLeft
  2: PNT.DataLabel.HorizontalAlignment:=-4152; //xlHAlignRight
 end;
end;

procedure TForm1.ComboBox11Change(Sender: TObject);
//Задание вертикального выравнивания
begin
 case ComboBox11.ItemIndex of
  0: PNT.DataLabel.VerticalAlignment:=-4107; //xlVAlignBottom
  1: PNT.DataLabel.VerticalAlignment:=-4108; //xlVAlignCenter
  2: PNT.DataLabel.VerticalAlignment:=-4160; //xlVAlignTop
 end;
end;
//==================== Формулы ============================
procedure TForm1.Button19Click(Sender: TObject);
//Получение формулы
var
  S: String;
begin
  Series:=Chart.SeriesCollection(1);
  S:=Series.Formula;
  MessageBox(handle,pchar(S),'',0);
end;

procedure TForm1.Button20Click(Sender: TObject);
//Изменение формулы
begin
  Series:=Chart.SeriesCollection(2);
  Series.FormulaLocal:='=РЯД(;;Лист1!A2:D2;3)';
end;

end.
Текст этого приложения можно взять здесь (21,6 Кб).

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




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