VC++にてEXCELのグラフ作成の仕方 – プログラミング – Home

VC++にてEXCELのグラフ作成の仕...
 
通知
すべてクリア

VC++にてEXCELのグラフ作成の仕方


Borrel
 Borrel
(@Borrel)
ゲスト
結合: 18年前
投稿: 29
Topic starter  

ただいま、VC++からEXCELのグラフを作成しています。

環境は、以下のとおりです。

・VC++6.0
・Windows2000
・MFC使用
・ダイアログベースアプリ
・Office2000(Excel2000)
・クラス”Excel9.h”でのEXCEL操作(タイプライブラリによる方法ではない)
・埋め込み式グラフ作成

質問内容:

 A列に項目値、B列に数値を書き込んだデータを埋め込みグラフにした場合は正常にグラフが作
成できるのですが、A列に項目値、B列は飛ばしてC列の数値をグラフにしたい場合は、どのよう
にすれば、良いのでしょうか?
 VBAでは、UNIONメソッドを使用すると、飛び飛びのグラフ範囲を指定できるようですが、
VC++での実現方法がわかりません。
なお、グラフ作成時のメソッドは、SetSourceData()を使用しています。

初歩的な質問で申し訳ありませんが、よろしくお願いします。


引用解決済
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

Unionは_Applicationクラスのメソッドです。
ただ引数が多いのと、最初の2つだけLPDISPATCH型であることを気をつけないといけま
せん。

指定する数が決まっているのであれば、引数の数を変更したUnionメソッドを
手動で追加するといいでしょう。

参考
http://www.ujasiri.com/prglib/vc/excel/xlsoverload_exp.html

4つの場合

◎ EXCEL 2003の場合
excel.h

_Applicationクラスのメソッドに追加

LPDISPATCH Union(LPDISPATCH Arg1, LPDISPATCH Arg2,
const VARIANT& Arg3, const VARIANT& Arg4);

excel.cpp

※ InvokeHelper の第一引数のDISPIDはバージョンによって異なる可能性があります。
2000であれば、その値を確認して適切なIDを入れてください。
(COleDispatch::m_lpDispatch::GetIDsOfNamesで取得するのがベストだが)

LPDISPATCH _Application::Union(LPDISPATCH Arg1, LPDISPATCH Arg2,
const VARIANT& Arg3, const VARIANT& Arg4)
{
LPDISPATCH result;
static BYTE parms[] = VTS_DISPATCH VTS_DISPATCH VTS_VARIANT VTS_VARIANT;
InvokeHelper(0x30b, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms,
Arg1, Arg2, &Arg3, &Arg4);
return result;
}

使うほう

LPDISPATCH pDisp;

pDisp = xlSheet.GetRange(A1);
Range xlRange1(pDisp);
pDisp = xlSheet.GetRange(B1);
Range xlRange2(pDisp);
pDisp = xlSheet.GetRange(C1);
Range xlRange3(pDisp);
pDisp = xlSheet.GetRange(D1);
Range xlRange4(pDisp);

COleVariant vtRange3, vtRange4;
vtRange3.pdispVal = xlRange3.m_lpDispatch; vtRange3.vt = VT_DISPATCH;
vtRange4.pdispVal = xlRange4.m_lpDispatch; vtRange4.vt = VT_DISPATCH;

pDisp = xlApp.Union(xlRange1.m_lpDispatch, xlRange2.m_lpDispatch,
vtRange3, vtRange4);
Range xlRange(pDisp);

vtRange3.Detach();
vtRange4.Detach();

ちなみに、私はグラフを作成したことはVCでもVBAでもありません。
(そこらへんの方法を聞かれてもわからないので。(VBAのコードがあれば、アドバイス程
度なら))


返信引用
Borrel
 Borrel
(@Borrel)
ゲスト
結合: 18年前
投稿: 29
Topic starter  

Blueさん、ありがとうございます。

おかげさまで、無事解決いたしました。

今回Union関数は、そのまま_Applicationクラスの関数を使用しました。
(ムダに行数使用しましたが・・・)

参考までに、以下にプログラムを記入します。
----- A列 及び C列、100行のデータを埋込みグラフ化 -----

COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

_Application excel;

LPDISPATCH lpDispatch;

     _Worksheet wsheet;

Charts charts;
_Chart chart;
ChartObjects cobjects;

long left,top,width,height;
left=100;
top=30;
width=400;
height=250;

//チャートオブジェクト作成
cobjects.AttachDispatch(wsheet.ChartObjects(covOptional));

//チャートオブジェクトのサイズ決定
ChartObject cobject=cobjects.Add(left,top,width,height);

//チャートにアタッチ
chart.AttachDispatch(cobject.GetChart());

//グラフのデータ範囲指定
lpDispatch = wsheet.GetRange(COleVariant(A1),COleVariant(A100));
Range range1(lpDispatch);
lpDispatch = wsheet.GetRange(COleVariant(C1),COleVariant(C100));
Range range2(lpDispatch);

lpDispatch = excel.Union( 
                    range1.m_lpDispatch,
range2.m_lpDispatch,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional
);

     //グラフ種類選択・出力
COleVariant vari;
vari.vt=VT_DISPATCH;
vari.pdispVal=lpDispatch;

chart.SetChartType(75);
chart.SetSourceData(vari.pdispVal,COleVariant((short)2) );


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました