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;
データを最初から入力し直すには,データをクリアします.そのためには,以下のように,行データまたは,列データをクリアします. |
//行データを削除
objGraphDataSheet.Rows.ClearContents;
//列データを削除
objGraphDataSheet.Columns.ClearContents;
docx 形式の文書でのグラフ作成は,doc 形式の場合と変わりました.
グラフの新規作成時,あるいはデータの編集の際は,エクセルのブックが表示されます.このブックのシートにデータをセットあるいは修正します.すると,グラフに直ちに反映されます.このブックは文書と共に保存されます.
プログラムでデータを追加したり,データを変更する場合は,基本的にこのブックが表示されていないと変更できません. |
|
図11
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 秒後にエクセルのブックを最小化表示します. |
//=============================================================================
// データ編集用のエクセルのシートを表示
//=============================================================================
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 メソッドを実行していないために例外が発生しまます. |
//=============================================================================
// 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;
|