Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年06月04日] [更新 2013年12月01日] ワード操作フォームEx
ワード操作フォームEx   参考コード類
グラフの操作 - Shapeオブジェクト
動作確認等 Windows 7 U64(SP1) + Delphi XE2 + Word 2010







Microsoft Graph を使用したグラフの操作


文書に [挿入] [図] [グラフ] で Microsoft Graph を挿入し,必要な設定をしておきます.
このグラフに対する操作例です.この Microsoft Graph は Access (アクセス) や Power Point (パワーポイント) 等で使用されているものです.
Delphi で Microsoft Graph を使用するには,[Microsoft Graph X.X Object Libray] を [タイプライブラリの取り込み] でユニットを作成します.作成した Graph_TLB.pas を uses に追加して利用します.
利用の際,オブジェクトの型を OleVariant にすれば,多少の修正が必要ですが,VBA のコードがほとんどそのまま使用できます.


図1
タイプライブラリの取り込み
  • [コンポーネント]
    [コンポーネントのインポート] で
  • 14.0 の値は,インストールされているワードのバージョンによって異なる
図2
コンポーネントラッパーの作成
  • パッケージにはインストールしないので[パレットページ]の設定は無効
  • [ユニットディレクトリ] はパスの通った場所とする
図3
[ユニットの作成] で完了

以下のテストで使用した時の初期データは下図のようになっています.
以下のテストコードは,従来の doc ファイル文書内のグラフだけしか扱えません.Word 2007 の docx 文書内のグラフでは例外が発生して処理できませんでした.


図4
初期データ




[ 位置を固定した図形 ] の Shape オブジェクトの場合


[位置を固定した図形] とは,文書の行間に配置した図形です.インラインの図形とも言います.ワードで操作する際は,InlineShape オブジェクトとなります.
この設定は,[オブジェクトの書式設定] ダイアログの [レイアウト] または,[レイアウト] の [詳細設定] で変更できます.
実際には数値の変更ぐらいで使用することになると思いますが,参考のために,ここではいろいろ操作してみました.


図5
操作前のグラフ
図6
操作後のグラフ

リスト1
棒グラフの操作例
uses に Word2000, GRAPH_TLB が必要
//=============================================================================
//  Microsoft GraphのChart操作例
//  [位置を固定した図形]の場合
//  文書のInlineShapesのインデックスで取得する(位置を固定しない場合はShapes)
//
//  テスト用の文書には,あらかじめ,[挿入][図][グラフ]で埋め込みグラフを挿入
//=============================================================================
procedure TplWordFormEx2.Button1Click(Sender: TObject);
var
  AShape            : Word2000.InlineShape;
  pIndex            : OleVariant;
  pVerb             : OleVariant;
  objGraphChart     : OleVariant;
  objGraphDataSheet : OleVariant;
  objGraphRange     : OleVariant;
  objGraphAxis      : OleVariant;
  objGraphSeries    : OleVariant;
  objGraphLegend    : OleVariant;
begin
  pIndex := 1;

  try
    AShape := wdfWordDoc.InlineShapes.Item(pIndex);

    //種類を調べてそれがMicrosoft Graphの場合のみ処理続行
    if Copy(UpperCase(AShape.OLEFormat.ProgID),1, 7) = 'MSGRAPH' then begin
      wdfWordApp.ScreenUpdating := False;

      //OLEオブジェクトに接続(起動)
      pVerb := wdOLEVerbHide;
      AShape.OLEFormat.DoVerb(pVerb);

      //サイズ指定
      //位置は文書の文字列と一緒に移動空白行の挿入や空白文字数で決まる
      AShape.Height := 300;
      AShape.Width  := 450;

      //MSGraphのChartオブジェトを取得
      objGraphChart := AShape.OLEFormat.Object_;

      //グラフの種類(ここでは集合縦棒)
      objGraphChart.ChartType := xlColumnClustered;

      //タイトル
      objGraphChart.HasTitle             := True;
      objGraphChart.ChartTitle.Font.Size := 16;
      objGraphChart.ChartTitle.Caption   := 'ワード操作フォームEx テストプログラム';

      //グラフ領域の設定
      objGraphChart.ChartArea.Interior.Color    := $00FFE7B5;
      objGraphChart.ChartArea.Border.Weight     := xlThin;
      objGraphChart.ChartArea.Border.LineStyle  := xlContinuous;
      objGraphChart.ChartArea.Border.ColorIndex := clBlack;

      //プロット領域の設定
      objGraphChart.PlotArea.Border.Weight  := xlThin;
      objGraphChart.PlotArea.Interior.Color := $00E0E0E0;
      objGraphChart.PlotArea.Width          := 380;

      //グラフの色(ここでは棒の色)
      objGraphSeries := objGraphChart.SeriesCollection(1);
      objGraphSeries.Interior.ColorIndex := 6;
      objGraphSeries.HasDataLabels       := True;

      //データラベルの文字サイズ設定
      objGraphSeries.DataLabels(1).Font.Size := 16;
      objGraphSeries.DataLabels(2).Font.Size := 16;
      objGraphSeries.DataLabels(3).Font.Size := 16;
      objGraphSeries.DataLabels(4).Font.Size := 16;

      objGraphSeries := objGraphChart.SeriesCollection(2);
      objGraphSeries.Interior.ColorIndex := 35;

      objGraphSeries := objGraphChart.SeriesCollection(3);
      objGraphSeries.Interior.ColorIndex := 10;

      //データの値をセット
      objGraphDataSheet := objGraphChart.Application.DataSheet;
      objGraphRange := objGraphDataSheet.Cells;
      objGraphRange.Item[4, 1] := '京都';
      objGraphRange.Item[2, 3] := 100;

      //軸の設定
      objGraphAxis := objGraphChart.Axes(xlCategory, xlPrimary);
      objGraphAxis.HasTitle             := True;
      objGraphAxis.AxisTitle.Font.Size  := 12;
      objGraphAxis.AxisTitle.Text       := '営業月';
      objGraphAxis.TickLabels.Font.Size := 12;

      //目盛線
      objGraphAxis := objGraphChart.Axes(xlValue, xlPrimary);
      objGraphAxis.HasTitle             := False;
      objGraphAxis.TickLabels.Font.Size := 12;
      objGraphAxis.HasMajorGridlines    := True;
      objGraphAxis.HasMinorGridlines    := True;
      objGraphAxis.MaximumScale         := 100;
      objGraphAxis.MinimumScale         := 0;
      objGraphAxis.MajorUnit            := 50;
      objGraphAxis.MinorUnit            := 10;

      //凡例
      objGraphLegend := objGraphChart.Legend;
      objGraphLegend.Interior.Color := clWhite;
      objGraphLegend.Top            := 30;
      objGraphLegend.Left           := 300;
      objGraphLegend.Font.Size      := 15;
    end;
  except
    raise;
  end;
  wdfWordApp.ScreenUpdating := True;
end;




[ 位置を固定しない図形 ] の Shape オブジェクトの場合


[位置を固定しない図形] とは,マウスドラッグで文書の任意の位置に移動可能な図形です.ワードではテキストボックスと同じく Shape オブジェクトとなります.この設定は [オブジェクトの書式設定] で変更できます.
処理コードは,Shape オブジェクトを取得した後は,上のサンプルと同じです.


図7
操作前のグラフ
図8
操作後のグラフ

リスト2
棒グラフの操作例
uses に Word2000, GRAPH_TLB が必要
//=============================================================================
//  Microsoft GraphのChart操作例
//  [オブジェクトの書式設定]で位置を固定しない設定にした場合
//
//  テスト用の文書には,あらかじめ,[挿入][図][グラフ]で埋め込みグラフを挿入
//=============================================================================
procedure TplWordFormEx2.Button2Click(Sender: TObject);
var
  AShape            : Twdf2000Shape;
  pIndex            : OleVariant;
  pVerb             : OleVariant;
  objGraphChart     : OleVariant;
  objGraphDataSheet : OleVariant;
  objGraphRange     : OleVariant;
  objGraphAxis      : OleVariant;
  objGraphSeries    : OleVariant;
  objGraphLegend    : OleVariant;
begin
  pIndex := 1;

  try
    AShape := wdfWordDoc.Shapes.Item(pIndex);

    //種類を調べてそれがMicrosoft Graphの場合のみ処理続行
    if Copy(UpperCase(AShape.OLEFormat.ProgID), 1, 7) = 'MSGRAPH' then begin
      LockWindowUpdate(wdfWordHandle);

      //OLEオブジェクトに接続(起動)
      pVerb := wdOLEVerbHide;
      AShape.OLEFormat.DoVerb(pVerb);

      //サイズ指定
      AShape.Height := 300;
      AShape.Width  := 420;

      //MSGraphのChartオブジェトを取得
      objGraphChart := AShape.OLEFormat.Object_;

      //グラフの種類(ここでは集合縦棒)
      objGraphChart.ChartType := xlColumnClustered;

      //タイトル
      objGraphChart.HasTitle := True;
      objGraphChart.ChartTitle.Font.Size := 16;
      objGraphChart.ChartTitle.Caption   := 'ワード操作フォームEx テストプログラム';

      //グラフ領域の設定
      objGraphChart.ChartArea.Interior.Color    := clSkyBlue;
      objGraphChart.ChartArea.Border.Weight     := xlThin;
      objGraphChart.ChartArea.Border.LineStyle  := xlContinuous;
      objGraphChart.ChartArea.Border.ColorIndex := clBlack;

      //プロット領域の設定
      objGraphChart.PlotArea.Border.Weight  := xlThin;
      objGraphChart.PlotArea.Interior.Color := $00E0E0E0;
      objGraphChart.PlotArea.Width          := 360;

      //グラフの色(ここでは棒の色)
      objGraphSeries := objGraphChart.SeriesCollection(1);
      objGraphSeries.Interior.ColorIndex := 6;
      objGraphSeries.HasDataLabels       := True;

      //データラベルの文字サイズ設定
      objGraphSeries.DataLabels(1).Font.Size := 12;
      objGraphSeries.DataLabels(2).Font.Size := 12;
      objGraphSeries.DataLabels(3).Font.Size := 12;
      objGraphSeries.DataLabels(4).Font.Size := 12;

      objGraphSeries := objGraphChart.SeriesCollection(2);
      objGraphSeries.Interior.ColorIndex := 35;

      objGraphSeries := objGraphChart.SeriesCollection(3);
      objGraphSeries.Interior.ColorIndex := 10;

      //データの操作
      objGraphDataSheet := objGraphChart.Application.DataSheet;
      objGraphRange := objGraphDataSheet.Cells;
      objGraphRange.Item[4, 1] := '京都';
      objGraphRange.Item[2, 3] := 100;

      //軸の設定
      objGraphAxis := objGraphChart.Axes(xlCategory, xlPrimary);
      objGraphAxis.HasTitle             := True;
      objGraphAxis.AxisTitle.Font.Size  := 12;
      objGraphAxis.AxisTitle.Text       := '営業月';
      objGraphAxis.TickLabels.Font.Size := 12;

      //目盛線
      objGraphAxis := objGraphChart.Axes(xlValue, xlPrimary);
      objGraphAxis.HasTitle             := False;
      objGraphAxis.TickLabels.Font.Size := 12;
      objGraphAxis.HasMajorGridlines    := True;
      objGraphAxis.HasMinorGridlines    := True;
      objGraphAxis.MaximumScale         := 100;
      objGraphAxis.MinimumScale         := 0;
      objGraphAxis.MajorUnit            := 50;
      objGraphAxis.MinorUnit            := 10;

      //凡例
      objGraphLegend := objGraphChart.Legend;
      objGraphLegend.Interior.Color := clWhite;
      objGraphLegend.Top            := 30;
      objGraphLegend.Left           := 300;
      objGraphLegend.Font.Size      := 15;
    end;
  except
    raise;
  end;

  LockWindowUpdate(0);
end;




円グラフの場合


上の二つは棒グラフでしたが,円グラフの場合です.表示する文書にはあらかじめ円グラフを作成して必要な設定をしておきます.以下のコードは [位置を固定した図形] の場合です.円グラフに表示するデータは上のサンプルで使用した,最初の列のデータを使用しています.


図9
操作前のグラフ
図10
操作後のグラフ

リスト3
円グラフの操作例
uses に Word2000, GRAPH_TLB が必要
//=============================================================================
//  Microsoft GraphのChart操作例
//  円グラフの例
//
//  テスト用の文書には,あらかじめ,[挿入][図][グラフ]で埋め込みグラフを挿入
//=============================================================================
procedure TplWordFormEx2.Button3Click(Sender: TObject);
var
  pIndex            : OleVariant;
  AShape            : Word2000.InlineShape;
  pVerb             : OleVariant;
  objGraphChart     : OleVariant;
  objGraphDataSheet : OleVariant;
  ADataCol          : OleVariant;
  objGraphRange     : OleVariant;
  objGraphSeries    : OleVariant;
  objGraphPoint     : OleVariant;
  objGraphDataLabel : OleVariant;
begin
  pIndex := 2;

  try
    AShape := wdfWordDoc.InlineShapes.Item(pIndex);

    //種類を調べてそれがMicrosoft Graphの場合のみ処理続行
    if Copy(UpperCase(AShape.OLEFormat.ProgID), 1, 7) = 'MSGRAPH' then begin
      LockWindowUpdate(wdfWordHandle);

      //OLEオブジェクトに接続(起動)
      pVerb := wdOLEVerbHide;
      AShape.OLEFormat.DoVerb(pVerb);

      //サイズ指定
      //位置は文書の文字列と一緒に移動空白行の挿入や空白文字数で決まる
      AShape.Height := 300;
      AShape.Width  := 420;

      //MSGraphのChartオブジェトを取得
      objGraphChart := AShape.OLEFormat.Object_;

      //グラフの種類(このテストでは円グラフ)
      //objGraphChart.ChartType := xlPie;
      //系列を列方向に定義
      objGraphChart.Application.PlotBy := xlColumns;
      //ここではデータ系列の1列目だけを対象
      ADataCol := 1;

      //凡例
      objGraphChart.HasLegend := False;

      //タイトル
      objGraphChart.HasTitle             := True;
      objGraphChart.ChartTitle.Font.Size := 16;
      objGraphChart.ChartTitle.Caption   := 'ワード操作フォームEx テストプログラム';

      //グラフ領域の設定
      objGraphChart.ChartArea.Border.Weight     := xlThin;
      objGraphChart.ChartArea.Border.LineStyle  := xlContinuous;
      objGraphChart.ChartArea.Border.ColorIndex := clBlack;

      //プロット領域の設定
      objGraphChart.PlotArea.Border.Color   := clWhite;
      objGraphChart.PlotArea.Interior.Color := clWhite;
      objGraphChart.PlotArea.Left           := 90;
      objGraphChart.PlotArea.Top            := 40;

      objGraphSeries := objGraphChart.SeriesCollection(ADataCol);

      //グラフの色(ここでは扇型の色)
      //円グラフはSeriesは1つだけ,各扇型はPointオブジェクト
      objGraphPoint  := objGraphSeries.Points(1);
      objGraphPoint.Interior.ColorIndex  := 35;

      objGraphPoint  := objGraphSeries.Points(2);
      objGraphPoint.Interior.Color := $00FFFF80;

      objGraphPoint  := objGraphSeries.Points(3);
      objGraphPoint.Interior.Color := $0093FFFF;

      //データの操作
      objGraphDataSheet := objGraphChart.Application.DataSheet;
      objGraphRange     := objGraphDataSheet.Cells;
      objGraphRange.Item[2, ADataCol + 1] := 100;
      objGraphRange.Item[3, ADataCol + 1] := 10;
      objGraphRange.Item[4, ADataCol + 1] := 30;

      //データラベル設定
      objGraphSeries.HasDataLabels := True;

      objGraphDataLabel := objGraphSeries.DataLabels(1);
      objGraphDataLabel.type      := xlDataLabelsShowLabelAndPercent;
      objGraphDataLabel.Font.Size := 20;
      objGraphDataLabel.Position  := xlLabelPositionInsideEnd;

      objGraphDataLabel := objGraphSeries.DataLabels(2);
      objGraphDataLabel.type      := xlDataLabelsShowLabelAndPercent;
      objGraphDataLabel.Font.Size := 20;
      objGraphDataLabel.Position  := xlLabelPositionInsideEnd;

      objGraphDataLabel := objGraphSeries.DataLabels(3);
      objGraphDataLabel.type      := xlDataLabelsShowLabelAndPercent;
      objGraphDataLabel.Font.Size := 20;
      objGraphDataLabel.Position  := xlLabelPositionInsideEnd;
    end;
  except
    raise;
  end;

  LockWindowUpdate(0);
end;




データのクリア


データを最初から入力し直すには,データをクリアします.そのためには,以下のように,行データまたは,列データをクリアします.


リスト4
データのクリア
    //行データを削除
    objGraphDataSheet.Rows.ClearContents;
    //列データを削除
    objGraphDataSheet.Columns.ClearContents;




docx 形式文書用のグラフ


docx 形式の文書でのグラフ作成は,doc 形式の場合と変わりました.
グラフの新規作成時,あるいはデータの編集の際は,エクセルのブックが表示されます.このブックのシートにデータをセットあるいは修正します.すると,グラフに直ちに反映されます.このブックは文書と共に保存されます.
プログラムでデータを追加したり,データを変更する場合は,基本的にこのブックが表示されていないと変更できません.


図11
docx 形式文書のグラフ




docx 形式文書のグラフ用のサンプル


docx 形式文書内のグラフ作成のサンプルです.doc 形式文書でのグラフ作成とは以下のように違いがあります.
  • DataSheet オブジェクトは使用できなくなった
  • OLEFormat オブジェクトも使用できなくなった
  • データの操作は Series オブジェクトの Values プロパティ
  • または Chart オブジェクトの SetSourceData メソッド
  • または ChartData オブジェクトの WorkBook.WorkSheets の Cells か Range を使用する
いずれにしても,エクセルのブックが起動していなければデータは操作できません.Values プロパティはブックのシートに直接セットしません.したがってブックが起動していなくてもデータは操作できますが,ブックが起動するまでは結果としてグラフには反映されません.ただし,これは筆者が確認した結果であって,もしかしたら方法があるのかも知れません.
各オブジェクトのプロパティ等も細かい部分で変更があるようです.例えば色は ColorIndex ではなく Color になっているようです.


[備考]
Word 2010.pas には,Chart オブジェクトのインターフェイスが実装されています.


図12
操作前のグラフ
図13
操作後のグラフ
  • 結果がグラフに反映されていない
図14
エクセルのブックを起動
  • 起動すると反映される

リスト5
docx 形式文書のグラフ用の操作サンプル
uses に Word2000, GRAPH_TLB が必要
//=============================================================================
//  Microsoft GraphのChart操作例
//  docx形式文書用
//  doc形式の文書内のグラフは扱えない
//
//  テスト用の文書には,あらかじめ,[挿入][グラフ]でグラフを作成
//=============================================================================
procedure TplWordFormEx2.Button1Click(Sender: TObject);
var
  objShape       : OleVariant;
  pIndex         : OleVariant;
  objChart       : OleVariant;
  objChartAxis   : OleVariant;
  objChartSeries : OleVariant;
  objChartLegend : OleVariant;
  AVarArray      : OleVariant;
  SeriesItemCnt  : Integer;
  i              : Integer;
begin
  //1番目のInlineShapeオブジェクトのインスタンスを取得
  pIndex   := 1;
  objShape := wdfWordDoc.InlineShapes.Item(pIndex);

  //コレクション(データ系列)の数
  SeriesItemCnt := 4;

  try
    //種類を調べてそれがMicrosoft Graphの場合のみ処理続行
    if objShape.HasChart then begin
      wdfWordApp.ScreenUpdating := False;

      objChart := objShape.Chart;

      //サイズ指定
      //位置は文書の文字列と一緒に移動空白行の挿入や空白文字数で決まる
      objShape.Height := 300;
      objShape.Width  := 450;

      //フォントの設定
      objChart.ChartArea.Font.Name := 'MS Pゴシック';

      //グラフの種類(ここでは集合縦棒)
      objChart.ChartType := xlColumnClustered;

      //タイトル
      objChart.HasTitle[0]          := True;
      objChart.ChartTitle.Font.Size := 16;
      objChart.ChartTitle.Caption   := 'ワード操作フォームEx テストプログラム';

      //グラフ領域の設定
      objChart.ChartArea.Interior.Color    := RGB(200, 240, 255);
      objChart.ChartArea.Border.Weight     := xlThin;
      objChart.ChartArea.Border.LineStyle  := xlContinuous;
      objChart.ChartArea.Border.ColorIndex := clBlack;

      //プロット領域の設定
      objChart.PlotArea.Border.Weight  := xlThin;
      objChart.PlotArea.Interior.Color := RGB(245, 245, 245);
      objChart.PlotArea.Width          := 380;


      //------- 1番目コレクションの設定 ---------------------------------------------

      objChartSeries := objChart.SeriesCollection(1);
      //グラフの色
      objChartSeries.Interior.Color := RGB(255, 150, 150);

      //データラベルの文字サイズ設定
      objChartSeries.HasDataLabels := True;
      for i := 1 to SeriesItemCnt do begin
        objChartSeries.DataLabels(i).Font.Size := 10;
      end;

      //データ
      AVarArray := VarArrayOf([30, 40, 50, 60]);
      objChartSeries.Values := AVarArray;


      //------- 2番目コレクションの設定 ---------------------------------------------

      objChartSeries := objChart.SeriesCollection(2);
      //グラフの色
      objChartSeries.Interior.Color := RGB(150, 150, 255);

      //データラベルの文字サイズ設定
      objChartSeries.HasDataLabels := True;
      for i := 1 to SeriesItemCnt do begin
        objChartSeries.DataLabels(i).Font.Size := 10;
      end;

      //データ
      AVarArray := VarArrayOf([80, 30, 60, 45]);
      objChartSeries.Values := AVarArray;


      //------- 3番目コレクションの設定 ---------------------------------------------

      objChartSeries := objChart.SeriesCollection(3);
      //グラフの色
      objChartSeries.Interior.Color := RGB(150, 255,  150);

      //データラベルの文字サイズ設定
      objChartSeries.HasDataLabels := True;
      for i := 1 to SeriesItemCnt do begin
        objChartSeries.DataLabels(i).Font.Size := 10;
      end;

      //データ
      AVarArray := VarArrayOf([70, 40, 25, 50]);
      objChartSeries.Values := AVarArray;
      //-----------------------------------------------------------------------


      //軸の設定
      objChartAxis := objChart.Axes(xlCategory, xlPrimary);
      objChartAxis.HasTitle             := True;
      objChartAxis.AxisTitle.Font.Size  := 12;
      objChartAxis.AxisTitle.Text       := '営業月';
      objChartAxis.TickLabels.Font.Size := 12;

      //目盛線
      objChartAxis := objChart.Axes(xlValue, xlPrimary);
      objChartAxis.HasTitle             := False;
      objChartAxis.TickLabels.Font.Size := 12;
      objChartAxis.HasMajorGridlines    := True;
      objChartAxis.HasMinorGridlines    := True;
      objChartAxis.MaximumScale         := 100;
      objChartAxis.MinimumScale         := 0;
      objChartAxis.MajorUnit            := 50;
      objChartAxis.MinorUnit            := 10;

      //凡例
      objChartLegend := objChart.Legend[0];
      objChartLegend.Interior.Color := clWhite;
      objChartLegend.Top            := 30;
      objChartLegend.Left           := 300;
      objChartLegend.Font.Size      := 15;
      objChartLegend.Border.Color   := clBlack;

      wdfWordApp.ScreenUpdating := True;
    end;
  except
    raise;
  end;
end;


データ用のエクセルのブックを起動する例です.
起動後して 2 秒後にエクセルのブックを最小化表示します.

リスト6
エクセルのブックを起動する例
//=============================================================================
//  データ編集用のエクセルのシートを表示
//=============================================================================
procedure TplWordFormEx2.Button2Click(Sender: TObject);
const
  xlMinimized = $FFFFEFD4;
var
  pIndex       : OleVariant;
  ObjShape     : OleVariant;
  objChartData : OleVariant;
begin
  pIndex   := 1;
  objShape := wdfWordDoc.InlineShapes.Item(pIndex);

  if objShape.HasChart then begin
    objChartData := objShape.Chart.ChartData;
    //データシートをアクティブにする
    objChartData.Activate;

    //データシートを最小化表示にする
    Sleep(2000);
    objChartData.Workbook.Application.WindowState := xlMinimized;
  end;
end;


テストの結果,次のように無理やり Workbook にアクセスすると,設定したデータ内容で表示が更新されるようです.ただし,この場合,ChartData オブジェクトの Activate メソッドを実行していないために例外が発生しまます.

リスト7
データ更新を強制的に反映されるコード
//=============================================================================
//  ChartSeriesオブジェクトのValuesプロパティで設定したデータの更新
//
//  以下のようにWorkBookにアクセスすると更新される
//  本来はChartDataをアクティブにしないとアクセスできないので例外が発生する
//=============================================================================
procedure TplWordFormEx2.Button3Click(Sender: TObject);
var
  pIndex         : OleVariant;
  ObjShape       : OleVariant;
  objChartSeries : OleVariant;
  AVarArray      : OleVariant;
  objChartData   : OleVariant;
begin
  wdfWordApp.ScreenUpdating := False;

  pIndex   := 1;
  objShape := wdfWordDoc.InlineShapes.Item(pIndex);
  try
   objChartSeries        := objShape.Chart.SeriesCollection(2);
    AVarArray             := VarArrayOf([20, 20, 25, 20]);
    objChartSeries.Values := AVarArray;

    objChartData := objShape.Chart.ChartData;
    objChartData.Workbook.Activate;
  except
  end;
  wdfWordApp.ScreenUpdating := True;
end;