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

[戻る]
Borrel 2007/03/01(木) 08:49:25
ただいま、VC++からEXCELのグラフを作成しています。

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

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


質問内容:

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

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

Blue 2007/03/01(木) 09:15:09
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 2007/03/01(木) 12:54:59
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) );

古いスレッドには追加発言できません。