Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2007年03月11日] [更新 2014年02月13日] Delphi サンプルプログラム集
420_TExcelApplication でグラフの作成例
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010
420_Excel_ChartObject.zip [665 KB] 2014年01月12日版 (EXE 同梱)







TExcelApplication によるグラフの作成例


TExcelApplication を使用して,指定のシートにグラフを作成する例です.
Microsoft Office 2000 オートメーションサーバーラッパーコンポーネントを使用しています.使用する Office つまりエクセルのラッパークラスのバージョンによっては,使用可能なプロパティやメソッドあるいは,メソッドの引数が違う場合があります.

TExcelChart というコンポーネントがありますが,以下のコードでは,ChartObjectを使用してグラフに対する操作を行っています.


エクセルのオブジェクトを MSDN の記事で調べるには,例えば PlotArea であれば,PlotArea オブジェクトを調べます.階層的になっていなので注意が必要です.


図1
設計時画面
  • 以下のコンポーネントを配置
    TExcelApplication
    TExcelWorkBook
    TExcelWorkSheet
図2
添付のブックを開いた直後
  • グラフ用データの範囲に予め入力済み
図3
[チャート作成] 実行
図4
[チャートの操作] 実行

リスト1
エクセルのチャート操作例
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Excel2000, OleServer;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ExcelApplication1: TExcelApplication;
    ExcelWorksheet1: TExcelWorksheet;
    ExcelWorkbook1: TExcelWorkbook;
    OpenDialog1: TOpenDialog;
    Button3: TButton;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure BookOpen(ABookName: String);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

const
  LCID: DWORD = LOCALE_SYSTEM_DEFAULT;

{$R *.DFM}

//=============================================================================
//  エクセルに隠れないようにこのFormを常に最前面の右上に表示するようにする
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  FormStyle := fsStayOnTop;
  Self.Left := Screen.PrimaryMonitor.Width - Self.Width;
  Self.Top  := Screen.PrimaryMonitor.Top;
end;

//=============================================================================
//  Formを閉じる時はエクセルの終了処理も実行
//
//  順番にDisconnect.TExcelApplicationはQuitが必要.
//  もし複数のWorkbook,WorkSheetオブジェクトを生成している場合はそれらのClose
//  やDisconnect処理も必要.
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if ExcelApplication1.Application.Visible[LCID] then begin
     ExcelWorksheet1.Disconnect;
     ExcelWorkbook1.Close(False,EmptyParam);
     Application.ProcessMessages;
     ExcelWorkbook1.Disconnect;
   end;
   ExcelApplication1.Quit;
   ExcelApplication1.Disconnect;
end;

//=============================================================================
//  ブックを開く
//  ファイルオープンダイアログを使用して選択
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  EFile: String;
begin
  //開く対象はエクセルのブック
  OpenDialog1.Filter := 'Excelブック (*.xls)|*.xls';
  //初期フォルダは起動フォルダ
  OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
  if OpenDialog1.Execute then begin
    EFile := OpenDialog1.FileName;
    BookOpen(EFile);
  end;
end;

//=============================================================================
//  エクセルを閉じて終了
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

//=============================================================================
//  ブックを開くメソッド
//  開いたらSheet1をアクティブにする
//=============================================================================
procedure TForm1.BookOpen(ABookName: String);
var
  objExcelApp : OleVariant;
begin
  //表示更新停止
  ExcelApplication1.ScreenUpdating[LCID] := False;

  if ExcelApplication1.Application.Visible[LCID] then begin
    //現在のシートとブックのDisconnect処理
    ExcelWorksheet1.Disconnect;
    ExcelWorkbook1.Close(False, EmptyParam, False,LCID);
  end;
  ExcelWorkbook1.Disconnect;

  //ブックを開いてWorkbook,WorkSheetに接続
  //Openメソッドの引数は多いので,省略するためにOleVariant型で扱うものとする
  objExcelApp := ExcelApplication1.Application;
  objExcelApp.Workbooks.Open(FileName := ABookName);

  ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook as _workbook);
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets['Sheet1'] as _Worksheet);
  ExcelWorksheet1.Activate;

  //終了時に保存確認ダイアログを表示しない
  ExcelApplication1.DisplayAlerts[LCID] := False;

  //表示更新開始
  ExcelApplication1.ScreenUpdating[LCID] := True;
  ExcelApplication1.Visible[LCID] := True;
end;

//=============================================================================
//  チャート(グラフ)の作成
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  ExcelHandle : HWND;
  ARange      : ExcelRange;
  objChart    : Excel2000._Chart;
begin
  ExcelHandle := FindWindow('XLMAIN', nil);
  LockWindowUpdate(ExcelHandle);

  //チャート(グラフ)を作成
  ExcelApplication1.Charts.Add(EmptyParam, EmptyParam, 1, EmptyParam, LCID);
  //データ範囲(項目と系列ラベル分を含む)
  ARange := ExcelWorksheet1.Range['A1', 'C4'];

  //作成したばかりの時点ではこのグラフがActive.このグラフをSheet1に表示
  objChart := ExcelApplication1.ActiveChart.Location(xlLocationAsObject, 'Sheet1');
  objChart.ChartWizard(
                ARange,           //グラフ化するデータの範囲
                xlColumn,         //グラフの種類
                EmptyParam,       //組込みオートフォーマットのオプション番号
                xlColumns,        //データ系列の方向.xlRowsまたはxlColumns
                1,                //データ範囲の項目ラベルの行または列数
                1,                //データ範囲の系列ラベルの行または列数
                True,             //凡例を表示するにはTrue
                'グラフサンプル', //グラフのタイトル文字列
                '製品名',         //項目軸のタイトル文字列
                '出荷数',         //数値軸のタイトル文字列
                EmptyParam,       //3-D系列軸または2-Dの第2数値軸のタイトル
                LCID
                );

  LockWindowUpdate(0);
end;

//=============================================================================
//  いろいろ操作
//  テストのためChartObjectと,ActiveChartの両方を使用してみた
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
var
  ExcelHandle   : HWND;
  AChart        : ChartObject;
  objChart      : Excel2000._Chart;
  objCollection : OleVariant;
begin
  ExcelHandle := FindWindow('XLMAIN', nil);
  LockWindowUpdate(ExcelHandle);
  //チャートオブジェクトの選択
  AChart := ExcelWorksheet1.ChartObjects('グラフ 1') as ChartObject;

  //表示位置を変更(数値はポイント単位)
  AChart.Left   := 20;
  AChart.Top    := 100;
  AChart.Width  := 400;
  AChart.Height := 300;
  AChart.Activate;

  objChart := ExcelApplication1.ActiveChart;
  objChart.PlotArea[LCID].Top := 20;
  //プロット領域の背景はxlNone
  objChart.PlotArea[LCID].Interior.ColorIndex:=xlNone;
  //全体のフォントサイズは12pt
  objChart.ChartArea[LCID].Font.Size := 12;
  //グラフのタイトルだけは20pt
  objChart.ChartTitle[LCID].Font.Size := 20;

  //棒グラフの色を変更
  objCollection := objChart.SeriesCollection(1, LCID);
  objCollection.Interior.ColorIndex := 35;
  objCollection := objChart.SeriesCollection(2, LCID);
  objCollection.Interior.ColorIndex := 15;

  LockWindowUpdate(0);
end;

end.