0

みんなに、

私は検索してきましたが、ほとんど答えが見つかりません。このマクロを変換しようとしています:

Range("A1:B7").Select
    ActiveSheet.Shapes.AddChart.Select
    ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$B$7")
    ActiveChart.ChartType = xlPie

セル A1 から B7 までのデータから単純な 2D 円グラフを作成する Excel 2007 の場合。

Autowrap 関数を実装する C++ コードに変換する方法は次のとおりです。

-------その他のコード--------------

VARIANT darange;

IDispatch *pXlRange;
{  
VARIANT range;
range.vt = VT_BSTR;
range.bstrVal = ::SysAllocString(L"A1:B7");
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, range);
darange.vt = VT_DISPATCH;
darange.pdispVal = result.pdispVal;
pXlRange = result.pdispVal;
}

{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_METHOD, &result, pXlRange, L"Select", 0);
}

IDispatch *pXlChartObjects;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Shapes", 0);
pXlChartObjects = result.pdispVal;
}

IDispatch *pXlChartObject;
{
VARIANT result;
VariantInit(&result);
VARIANT left, top, width, height;
left.vt = VT_R8;
left.dblVal = 600.;
top.vt = VT_R8;
top.dblVal = 600.;
width.vt = VT_R8;
width.dblVal = 200.;
height.vt = VT_R8;
height.dblVal = 200.;

AutoWrap(DISPATCH_METHOD, &result, pXlChartObjects, L"AddChart", 1, left, top, width, height);
pXlChartObject = result.pdispVal;
}

{                              
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_METHOD, &result, pXlRange, L"Select", 0);
}


IDispatch *pXlChart;
{
VARIANT result;
VariantInit(&result);

AutoWrap(DISPATCH_PROPERTYGET, &result, pXlChartObject, L"Chart", 0);
pXlChart = result.pdispVal;
}


// NOT WORKING
{
VARIANT result;
VariantInit(&result);
VARIANT type;
type.vt = VT_BSTR;
type.bstrVal = ::SysAllocString(L"xlPie");
//type.vt = VT_I4;
//type.lVal = 75;
AutoWrap(DISPATCH_PROPERTYPUT, &result, pXlChart, L"Chartype", 1, type);
}
// NOT WORKING

{
VARIANT result;
VariantInit(&result);

AutoWrap(DISPATCH_METHOD, &result, pXlChart, L"SetSourceData", 1, darange);
}

/*

-------その他のコード----------

Excel を開き、棒グラフを生成しますが、実装には円グラフが必要です。残念ながら、このコードに「xlPie」を渡す方法がわかりません。

// NOT WORKING
{
VARIANT result;
VariantInit(&result);
VARIANT type;
type.vt = VT_BSTR;
type.bstrVal = ::SysAllocString(L"xlPie");
//type.vt = VT_I4;
//type.lVal = 75;
AutoWrap(DISPATCH_PROPERTYPUT, &result, pXlChart, L"Chartype", 1, type);
}
// NOT WORKING

誰にもアイデアがありますか?

4

1 に答える 1

1

xlPie文字列ではなく数値定数です。debug.print xlPieVBA のイミディエイト ウィンドウに入力して値を取得します。C++ で (私が思うに) long 型として定義します。それからそれを渡します。

BSTR に変換しないでください。

(また、::SysFreeString を使用して BSTR を解放することを忘れないでください。そうしないと、メモリ リークが発生します)。

于 2013-09-11T07:19:16.667 に答える