COMでExcelシートのHyperLinkを読み込む方法 – プログラミング – Home

COMでExcelシートのHyperL...
 
通知
すべてクリア

[解決済] COMでExcelシートのHyperLinkを読み込む方法


初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

VC+2008EE Windows-Vista ,-7の環境です。

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

VARIANT varResult;
Invoke(pRange, LValue, DISPATCH_PROPERTYGET, NULL, 0, &varResult);

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


引用未解決
トピックタグ
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 12年前
投稿: 28
 

RangeオブジェクトからHyperlinksオブジェクト(VT_DISPATCHを指定)を取得すればいける
んじゃないかな。


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

蒼の洞窟さん ありがとうございます。

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

ちなみに
Invoke(pWorksheet, LRange, 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のが見つからなくて・・・


返信引用
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 12年前
投稿: 28
 

たぶんこうだね。

var.vt = VT_DISPATCH;
VariantInit(&varResult);
Invoke(pRange, LHyperlinks, 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, LHyperlinks, DISPATCH_PROPERTYGET, &var, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;

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

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

pHyperlinks->Release();


返信引用
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 12年前
投稿: 28
 

あっと

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

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

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


返信引用
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 12年前
投稿: 28
 

何度もすみませぬ。
NULLにするとこ間違えた。

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

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


返信引用
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 12年前
投稿: 28
 

たぶんこれで。
AddressとSubAddressは設定されてないとNULLになるようです。

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

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

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

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

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

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

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

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


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

蒼の洞窟さん、大変ありがとうございます。
うまくいきました。

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

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

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


返信引用
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 12年前
投稿: 28
 

なんでわかるかって・・・たぶん今までの経験なんだろうな。

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

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

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


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

蒼の洞窟 さん ありがとうございます。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました