はじめて質問させていただきます。
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のマクロをそのまま記述して引数を省いただけなので、
このコード自体に確信が持てません。
ご存知の方がおられましたらご教授よろしくお願いします。
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 を使う必要は無いのでは???
> …それは違うでしょう。…ヘルプを読めば分かることですが、戻り値が
> 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")
以下は同じ。
解放処理は色んなページにたくさん掲載されておりましたので、
だいぶ参考にさせていただいてます^^;
> Object型を使用しているのは、最終的に
> 参照設定は外さないといけないからです。
了解です。分かって使ってるなら問題ありません。
分からないままどっかのサイトのコードをコピペで
使ってる人があまりに多いもので。。。
一言書いておいて頂ければ余計なつっこみしなくて
有り難いです(^^;)
> ' 最終的な宣言はこうなります。
> Dim xlApplication As New Object
New は必要ありません。New は新しいインスタンス(メモリ上の実体)を
作成する命令ですが、
> xlApplication = CreateObject("Excel.Application")
がインスタンスを生成するからです。
ツイート | ![]() |