初めて質問させていただきます。
c++でExcelを操作したいのですが、Excelのバージョンに依存しないように
タイプライブラリは使わず
http://support.microsoft.com/?scid=kb;ja;216686&spid=2512&sid=97
のAutoWrap関数を使用して実装しています。
困っているのはinvokeに渡すプロパティなどのインターフェイスがわからないことです。
現在わからないことは4つです。
シート数の取得(GetName?)
シート名の取得(Count?)
アクティブシートの変更(Select?)
指定したシートNoのシートポインタの取得(Item?)
ネットで検索しても情報がなく困っています。
タイプライブラリを使うものは沢山あるのですが・・。
御助言よろしくお願いします。
私の場合、MFCでタイプライブラリを使ってExcel用のラッパークラス(COleDispatchDriver)を作ってから、
自動生成されたソースコードをみます。
(COleDispatchDriver::InvokeHelperのところ)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35784&forum=7&start=8
を参考にしてみてください。
また、OLEViewerをつかっても確認できるでしょう。
回答ありがとうございます
>>私の場合、MFCでタイプライブラリを使ってExcel用のラッパークラス>>(COleDispatchDriver)を作ってから、
>>自動生成されたソースコードをみます。
>>(COleDispatchDriver::InvokeHelperのところ)
初心者でスイマセン、これの意味がよくわからないです・・・。
COleDispatchDriver::InvokeHelperの定義を参照はできましたが
ここからどうやればインターフェイスを取得できるんですか?
>>また、OLEViewerをつかっても確認できるでしょう。
OLEViewerも見てみましたが見ている場所が悪いのかスマートポインタを使うときのインターフェイスらしきものは見つかったのですが
invokeに渡す物を見つけることができませんでした。
VC++2005,Excel2003の場合
シート名
> CString get_Name()
> {
> CString result;
> InvokeHelper(0x6e, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
> return result;
> }
CString strName; // MFCの場合
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBook, L"Name", 0);
strName = CString(result.bstrVal);
}
シート数
> long get_Count()
> {
> long result;
> InvokeHelper(0x76, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
> return result;
> }
long nCount;
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheets, L"Count", 0); // pXlBookよりpXlSheetsを取得
nCount = result.lVal;
}
アクティブシートの変更→必要性を感じない。。。
任意のシートを取得
> LPDISPATCH get_Item(long Index)
> {
> LPDISPATCH result;
> static BYTE parms[] = VTS_I4 ;
> InvokeHelper(0xaa, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, parms, Index);
> return result;
> }
IDispatch *pXlSheet;
{
VARIANT result;
VariantInit(&result);
VARIANT Index;
Index.vt = VT_I4;
Index.lVal = 任意のインデックス
AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheets, L"Item", 1, Index); // pXlBookよりpXlSheetsを取得
pXlSheet = result.pdispVal;
}
わざわざソースまで書いていただきありがとうございます。
無事解決することができました。
>>私の場合、MFCでタイプライブラリを使ってExcel用のラッパークラス>>(COleDispatchDriver)を作ってから、
>>自動生成されたソースコードをみます。
>>(COleDispatchDriver::InvokeHelperのところ)
これの意味もわかりCOleDispatchDriver::InvokeHelperも見つけることができました。
勉強になりました、ありがとうございます。