COMでExcelシートのHyperLinkを読み込む方法

[戻る]
初心者 2014/01/27(月) 23:23:11
VC+2008EE Windows-Vista ,-7の環境です。

いま上記環境で、VC++からCOMでExcelシートのデーターを読み込んで
VC++で処理するソフトを作ろうとしています。(Excelシートをデータベース
として利用。)
指定のExcelシートを開いて、データ(文字、数字)は読み込みできたのですが
セルに張り付けてあるHyperLinkの読み込み方(文字データーとしてでもOK)がわ
かりません。

VARIANT   varResult;
Invoke(pRange, L"Value", DISPATCH_PROPERTYGET, NULL, 0, &varResult);

の L"Value" をちがうメソッドかプロパティーにすればいいのでは???と思っている
のですが・・・・
どなたか、HyperLinkの読み込み方を知っている方、教えてください。

蒼の洞窟 2014/01/28(火) 09:23:35
RangeオブジェクトからHyperlinksオブジェクト(VT_DISPATCHを指定)を取得すればいける
んじゃないかな。

初心者 2014/01/28(火) 16:41:59
蒼の洞窟さん ありがとうございます。

VARIANT   var;
var.vt = VT_BSTR;  の代わりに var.vt =  VT_DISPATCH;  で
Rangeを実行したのですが、実行時にエラーで止まりました。
(読書きできないエリアで読書きしようとしました。・・・)といった内容の
エラーメッセ時でした。

ちなみに
Invoke(pWorksheet, L"Range", DISPATCH_PROPERTYGET, &var, 1, &varResult);関数は

HRESULT Invoke(IDispatch *pDispatch, LPOLESTR lpszName, WORD wFlags, VARIANT 
*pVarArray, int nArgs, VARIANT *pVarResult)
{
・・・
hr = pDispatch->GetIDsOfNames(IID_NULL, &lpszName, 1, LOCALE_USER_DEFAULT, 
&dispid);
・・・
hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, 
&dispParams, pVarResult, NULL, NULL);
・・・
}
です。

どこがおかしいのでしょうか、わかりません。インターネットでも#importのものはある
のですがCOMのが見つからなくて・・・

蒼の洞窟 2014/01/28(火) 17:35:01
たぶんこうだね。

var.vt = VT_DISPATCH;
VariantInit(&varResult);
Invoke(pRange, L"Hyperlinks", DISPATCH_PROPERTYGET, &var, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;

・・・

pHyperlinks->Release();


んで、Hyperlinksからアイテムをとるんだろうな。

VBAだと

Dim pHyperlinks As Hyperlinks
Dim pHyperlink As Hyperlink
    
Set pHyperlinks = Range("a1").Hyperlinks
    
If pHyperlinks.Count > 0 Then
    Set pHyperlink = pHyperlinks.Item(1)
    MsgBox "名前:" & pHyperlink.Name & vbCrLf & _
           "アドレス:" & pHyperlink.Address & vbCrLf & _
           "サブアドレス:" & pHyperlink.SubAddress
End If

てな感じだから、Countプロパティから数を取得して、

var.vt = VT_DISPATCH;
VariantInit(&varResult);
Invoke(pRange, L"Hyperlinks", DISPATCH_PROPERTYGET, &var, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;

var.vt = VT_I4;
VariantInit(&varResult);
Invoke(pHyperlinks, L"Count", DISPATCH_PROPERTYGET, &var, 0, &varResult);
int nCount = varResult.iVal;

if (nCount > 0)
{
    // Itemにどうやってアクセスするかわすれたンゴ
}

pHyperlinks->Release();

蒼の洞窟 2014/01/28(火) 17:44:36
あっと

>var.vt = VT_DISPATCH;
>var.vt = VT_I4;
っていらないわ。引数なしのGETプロパティなんで何指定しても使わないです。

VariantInit(&varResult);
Invoke(pRange, L"Hyperlinks", DISPATCH_PROPERTYGET, &var, 0, NULL);
IDispatch* pHyperlinks = varResult.pdispVal;

VariantInit(&varResult);
Invoke(pHyperlinks, L"Count", DISPATCH_PROPERTYGET, &var, 0, NULL);
int nCount = varResult.iVal;

蒼の洞窟 2014/01/28(火) 17:47:15
何度もすみませぬ。
NULLにするとこ間違えた。

VariantInit(&varResult);
Invoke(pRange, L"Hyperlinks", DISPATCH_PROPERTYGET, NULL, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;

VariantInit(&varResult);
Invoke(pHyperlinks, L"Count", DISPATCH_PROPERTYGET, NULL, 0, &varResult);
int nCount = varResult.iVal;

蒼の洞窟 2014/01/28(火) 17:59:34
たぶんこれで。
AddressとSubAddressは設定されてないとNULLになるようです。


VariantInit(&varResult);
Invoke(pRange, L"Hyperlinks", DISPATCH_PROPERTYGET, NULL, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;

VariantInit(&varResult);
Invoke(pHyperlinks, L"Count", DISPATCH_PROPERTYGET, NULL, 0, &varResult);
int nCount = varResult.lVal;

if (nCount > 0)
{
    var.vt = VT_I4;
    var.lVal = 1;
    VariantInit(&varResult);
    Invoke(pHyperlinks, L"Item", DISPATCH_PROPERTYGET, &var, 1, &varResult);
    IDispatch* pHyperlink = varResult.pdispVal;

    VariantInit(&varResult);
    Invoke(pHyperlink, L"Name", DISPATCH_PROPERTYGET, NULL, 0, &varResult);
    BSTR bstrName = SysAllocString(varResult.bstrVal);

    VariantInit(&varResult);
    Invoke(pHyperlink, L"Address", DISPATCH_PROPERTYGET, NULL, 0, &varResult);
    BSTR bstrAddress = SysAllocString(varResult.bstrVal);

    VariantInit(&varResult);
    Invoke(pHyperlink, L"SubAddress", DISPATCH_PROPERTYGET, NULL, 0, &varResult);
    BSTR bstrSubAddress = SysAllocString(varResult.bstrVal);

    SysFreeString(bstrName);
    SysFreeString(bstrAddress);
    SysFreeString(bstrSubAddress);

    pHyperlink->Release();
}
pHyperlinks->Release();

初心者 2014/01/28(火) 21:21:24
[[解決]]
蒼の洞窟さん、大変ありがとうございます。
うまくいきました。

ところで、どうして、そんなに詳しいでしょうか?(センスでしょうか)

まだまだ調べたいことがあるので、
COMのプロパティーやメソッドがわかるWebとか 本とか、
いいものがあれば紹介ください。

本当にありがとうございました。

蒼の洞窟 2014/01/29(水) 09:53:41
なんでわかるかって・・・たぶん今までの経験なんだろうな。


Excelに限れば、VBAのオブジェクトブラウザをつかうとどんなプロパティやメソッドが
あるのか確認できますよ。

EEにあるかわかりませんけど、VSに付属しているOleView.exeを使えば、
COMで使えるものとかもわかったりします。


今回の場合、セルのハイパーリンクを見たいってことだったんで、
VBAでRangeオブジェクトのメンバ見てたらHylerlinksってのがあったんでWeb検索とかして
VBAで確認するコードを書いて、C++のソースに変換といったところですね。

初心者 2014/01/29(水) 10:56:10
[[解決]]
蒼の洞窟 さん ありがとうございます。

OleView.exe、ViewTypeLib を見て勉強中です。見方が難しい・・・・

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