VB.netでEXCELの検索機能を使いたい


うどん  2006-12-15 20:14:44  No: 134605

はじめて質問させていただきます。

VB.netで、EXCELを開いた直後に、ある文字列を検索し
そのセルの値と位置を取得するやり方がわからず、悩んでおります。

Dim xlApplication As New Excel.Application
Dim xlBooks As Excel.Workbooks          
Dim xlBook As Object
Dim xlSheets As Object
Dim xlSheet As Object

xlBooks = xlApplication.Workbooks
xlBook = xlBooks.Open(XLS_Path)
xlSheets = xlBook.Worksheets
xlSheet = xlSheets.Item(1)
xlApplication.Visible = True

'このあとの処理で悩んでいます。

現状、
Dim W_WORD as String
W_WORD = "検索文字"
xlApplication.ActiveSheet.Cells.find(W_WORD).Activate()
というコードを記述することで、どうやらEXCELの検索は働いているようなのですが、
検索文字列が存在しない場合、.netエラーとなって返ってきます。
EXCELのマクロをそのまま記述して引数を省いただけなので、
このコード自体に確信が持てません。

ご存知の方がおられましたらご教授よろしくお願いします。


特攻隊長まるるう  2006-12-15 20:45:45  No: 134606

Find メソッドの使い方は[Excel VBA]のヘルプに載っています。
[VB.NET]からはその関数を利用するだけですので、[Excel VBA]
の説明に従ってください。

> 検索文字列が存在しない場合、.netエラーとなって返ってきます。
…それは違うでしょう。…ヘルプを読めば分かることですが、戻り値が
Nothing になるというのが Find 関数の仕様です。戻り値が空っぽなのに
Activate という命令を出しているからでは?
命令を実行する前に、空っぽかどうか判定してください。
(サンプルコードもヘルプに載ってます。)

質問と直接関係ありませんが、[VB.NET]でエクセルを扱う場合は、
COMの解放処理を正しく実行しないと、プロセスが残り不具合と
なります。
>xlApplication.ActiveSheet.Cells.find(W_WORD).Activate()
このようなコードは書かないでください。
http://support.microsoft.com/kb/317109/
http://www.bcap.co.jp/hanafusa/dotnet/Excel08.htm
http://jeanne.wankuma.com/tips/programing/releasecom.html

また、参照設定しているなら
>Dim xlBook As Object
>Dim xlSheets As Object
>Dim xlSheet As Object
何故 Object 型?Object を使う必要は無いのでは???


うどん  2006-12-15 21:08:14  No: 134607

> …それは違うでしょう。…ヘルプを読めば分かることですが、戻り値が
> Nothing になるというのが Find 関数の仕様です。戻り値が空っぽなのに
> Activate という命令を出しているからでは?
> 命令を実行する前に、空っぽかどうか判定してください。
> (サンプルコードもヘルプに載ってます。)
このあたりのコーディングの仕組みがいまいちよくわからなくて(Activateを付ける必要性もわからなかった)、おどおどしていたんです。
ヘルプで探してみたところ、詳細が見つかったので調べてみることにします。

Object型を使用しているのは、最終的に
参照設定は外さないといけないからです。
開発途中のためソースが不十分でした。大変申し訳ありません。

' 最終的な宣言はこうなります。
Dim xlApplication As New Object
Dim xlBooks As Object
Dim xlBook As Object
Dim xlSheets As Object
Dim xlSheet As Object
xlApplication = CreateObject("Excel.Application")
以下は同じ。

解放処理は色んなページにたくさん掲載されておりましたので、
だいぶ参考にさせていただいてます^^;


特攻隊長まるるう  2006-12-15 22:10:49  No: 134608

> Object型を使用しているのは、最終的に
> 参照設定は外さないといけないからです。
了解です。分かって使ってるなら問題ありません。
分からないままどっかのサイトのコードをコピペで
使ってる人があまりに多いもので。。。
一言書いておいて頂ければ余計なつっこみしなくて
有り難いです(^^;)

> ' 最終的な宣言はこうなります。
> Dim xlApplication As New Object
New は必要ありません。New は新しいインスタンス(メモリ上の実体)を
作成する命令ですが、
> xlApplication = CreateObject("Excel.Application")
がインスタンスを生成するからです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加