VC++ からExcelのFind/FindNextメソッドを使うには?

[戻る]
よこ 2002/11/25(月) 19:28:58
現在、VC++からOLEを使ってExcelシートを読み込むプログラムを作っています。

ExcelのFind/FindNextメソッドを使って、決められたキーワードの入ったセル
を検索したい(Excelの「編集」−「検索」と同じ)のですが、1つだけ引数の
指定がわかりません。

Find/FindNextともにAfterという引数で、検索開始セルを指定するらしいと
いうとこまでは判っているのですが、どのように指定すれば良いか判らず、
以下のようなエラーメッセージが表示されます。

「RangeクラスのFindNextメソッドが失敗しました。」

ちなみに、NULL値を指定すると正常に検索されます。
但し、毎回 A1 セルから検索されるので同じ結果となってしまうため、
Findの時は良くても、FindNextの時に困ってます。

【環境】Windows2000, VC++6.0, MFC, Excel2000

ご存知のかた、よろしくお願いします。

RAPT 2002/11/25(月) 22:36:30
こんばんは、RAPTです。

> ExcelのFind/FindNextメソッド
ってのが、知らないので、分かりませんが、

Findってのは、何か値を返すのでしょうか。
返す場合、その戻り値(ハンドル?)をFindNextに渡してやるのだと推測します。
そして、そのFindNextの戻り値を、次のFindNextに渡すのではないでしょうか。

# 外してたらすみません。

Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0

sugar 2002/11/26(火) 09:12:30
RAPTさんのご推察通り、Findは、検索に該当するセル(Rangeオブジェクト)を返します。
FindNextは、その次から検索すればよいので、
Afterにそれを指定すればできるはずです。

※ただ、私はVCでこの処理をしたことがありませぬ。
 あくまでExcel VBAではそうやるとできる、というレベルでの話です。

よこ 2002/11/26(火) 10:27:27
レスありがとうございます。
RAPTさん、sugarさんのご指摘の通り、ExcelVBA ではそうですね。
私もExcelVBAの本を参考にしながら考えていたので試して見たのですが、
一癖ありそうなんです。

Find/FindNextともに戻り値はLPDISPATCH型でRangeにAttachDispatchして
あげることでRangeオブジェクトとしてアクセスできています。
そこまではExcelVBAと大差ないのですが、VCの場合、AfterにはVARIANT型で
指定しなくてはいけないようで、その時点でFind/FindNextの戻り値をそのまま
指定することが出来ずにいます。

これまで、Find/FindNextから返されたRangeのAdressを取得して A1 とか
 R1C1 といった文字列を指定したり、強引にFindの戻り値を一旦void*に
キャストしてからVARIANT型にキャストしてみたり(ちょっと無理があると
おもいつつ・・・)と試行錯誤してみたのですが、まったく先が見えません。

引き続き、よろしくお願いします。

dairygoods 2002/11/26(火) 11:15:20
VARIANTには、IDispath*を持たせることが出来ますよ。
VARIANT構造体の解説を見てください。

よこ 2002/11/26(火) 14:24:08
[[解決]]
dairygoodsさん、ありがとうございます!

VARIANT型の引数に値を入れる時、COleVariantクラスを使っていたので、
見落としていました。
COleVariantクラスのコンストラクタでは、IDispatch*を引数に指定できる
ものが用意されていなかった(ヘルプに載っていなかった)ため、てっきり
駄目なものかを思い込んでいました。
きちんと、VARIANT構造体まで確認しておくべきでした。

VARIANT構造体にFind/FindNextの戻り値(LPDISPATCH)を入れてから
FindNextの引数に渡してあげたら、きちんと検索してくれました。

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

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