Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1396 / 13646 ツリー ←次へ | 前へ→

【74730】Set(Find) の使い方 3891 13/9/4(水) 10:24 質問[未読]
【74732】Re:Set(Find) の使い方 kanabun 13/9/4(水) 11:02 発言[未読]
【74734】Re:Set(Find) の使い方 3891 13/9/4(水) 16:23 発言[未読]
【74735】Re:Set(Find) の使い方 kanabun 13/9/4(水) 16:41 発言[未読]
【74736】Re:Set(Find) の使い方 3891 13/9/4(水) 17:04 お礼[未読]

【74730】Set(Find) の使い方
質問  3891  - 13/9/4(水) 10:24 -

引用なし
パスワード
   こんにちは

Findで、キーワードの有無を探そうとしています。

正確に言うと、無いことを探して
AとBが無いならXの処理、AとCが無いならYの処理
と言う具合に動かします。


これをsetを使って、戻り値のNothingで、判定させています。
参考書や、web情報によると

  Set Obj1 = Worksheets(ワークシート名).Cells.Find(キーワード)

と言う書き方が見つかるのですが、これを実行しようとすると、エラーになってしまいます。


仕方がないので、目的のシートをアクティブにした後

  Set Obj1 = ActiveSheet.Cells.Find(キーワード)

と、処理させているのですが、いちいち、シートを移動するのが嫌なので、
ワークシートを指定して実行させたいのですが、方法はあるでしょうか


環境
OS : Windows7 Professional 6.1.7601 SP1 Bild7601
Excel 2003(11.8347.8403)SP3
VB6.5:Version 1054 VBA:Retail 6.5.1054


よろしくお願いいたします

【74732】Re:Set(Find) の使い方
発言  kanabun  - 13/9/4(水) 11:02 -

引用なし
パスワード
   ▼3891 さん:

>  Set Obj1 = Worksheets(ワークシート名).Cells.Find(キーワード)
>
>と言う書き方が見つかるのですが、これを実行しようとすると、エラーになってしまいます。

エラーメッセージの内容は?

あと、Obj1 の宣言も入れて、ワークシート名 などを具体的に
したサンプルコードをみせてください。

【74734】Re:Set(Find) の使い方
発言  3891  - 13/9/4(水) 16:23 -

引用なし
パスワード
   ▼kanabun さん:
ありがとうございます。


エラーメッセージは

実行時エラー '9'
インデックスが有効範囲にありません。

です


Obj1の宣言は、サブルーチンの頭に入れています。

Private Sub ステージ()
Dim Obj1, Obj2 As Object


実際のコードは、

 Set Obj1 = Worksheets("Sheet1").Cells.Find("stage")

としています。


すみません、なにか、分かりましたら、アドバイスをお願いします。

【74735】Re:Set(Find) の使い方
発言  kanabun  - 13/9/4(水) 16:41 -

引用なし
パスワード
   ▼3891 さん:

>Obj1の宣言は、サブルーチンの頭に入れています。
>
>Private Sub ステージ()
>Dim Obj1, Obj2 As Object

あ、それだと、As Object は Obj2 にしか適用されてませんよ。
それと、Obj1 の利用法が Rangeオブジェクトとして、と限定されているなら、
何も総称オブジェクトであいまい宣言する必要はないです。

Dim Obj1 As Range, Obj2 As Range

ただ、Obj1の型が 総称オブジェクトなら

> Set Obj1 = Worksheets("Sheet1").Cells.Find("stage")

で、検索語"stage" が「Sheet1」に見つからなくても、
Obj1 には Nothing がセットされるだけなので、(総称オブジェクトで宣言
していることでエラーが起きることは無いので)当座は問題ありません。

>エラーメッセージは
>
>実行時エラー '9'
>インデックスが有効範囲にありません。
>
>です

インデックスエラーが起きているのでしたら、通常は コレクションのメンバ
に指定されたインデックスがいない、ことを疑います。
今回は

> Set Obj1 = Worksheets("Sheet1").Cells.Find("stage")

でインデックス・エラー ですから、ワークシートコレクションのメンバに
"Sheet1" という名前のメンバがいない、ということです。
この点は大丈夫ですか?
たとえば、

Sub Chk1()
  MsgBox Worksheets(1).Name
  MsgBox Worksheets("Sheet1").Name
End Sub

こんなプロシージャ実行したら、どうなりますか?

【74736】Re:Set(Find) の使い方
お礼  3891  - 13/9/4(水) 17:04 -

引用なし
パスワード
   ▼kanabun さん:

早いです。大変ありがとうございます。

>でインデックス・エラー ですから、ワークシートコレクションのメンバに
>"Sheet1" という名前のメンバがいない、ということです。
>この点は大丈夫ですか?

大変、お恥ずかしい
クライアントが、シート名を変更していました。
動かすことに夢中になっていて、そんな事にも気づかないとは・・・


まったく、アホな質問をしてしまいました。
申し訳ありません。

宣言文の件も、10年以上、これで良いと思ってました
凹むばかりです・・・

教えて頂いて、ありがとうございました

1396 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free