ただいま、VC++からEXCELのグラフを作成しています。
環境は、以下のとおりです。
・VC++6.0
・Windows2000
・MFC使用
・ダイアログベースアプリ
・Office2000(Excel2000)
・クラス”Excel9.h”でのEXCEL操作(タイプライブラリによる方法ではない)
・埋め込み式グラフ作成
質問内容:
A列に項目値、B列に数値を書き込んだデータを埋め込みグラフにした場合は正常にグラフが作
成できるのですが、A列に項目値、B列は飛ばしてC列の数値をグラフにしたい場合は、どのよう
にすれば、良いのでしょうか?
VBAでは、UNIONメソッドを使用すると、飛び飛びのグラフ範囲を指定できるようですが、
VC++での実現方法がわかりません。
なお、グラフ作成時のメソッドは、SetSourceData()を使用しています。
初歩的な質問で申し訳ありませんが、よろしくお願いします。
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のコードがあれば、アドバイス程
度なら))
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) );