こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBA selectionの書き方をヘルプ!

ここで教えてもらったVBAを書き直して以下のように作りました。

Sub TEST()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
d = 5
For i = 1 To d
Set x = sh2.Range("E7:F11").Find(What:=sh1.Cells(i, "C"), After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not x Is Nothing Then sh1.Cells(i, "D") = x.Offset(0, 1)
Next i
End Sub

ところが「RangeクラスのFindプロパティが取得できません」とエラーになってしまいます。Range("E7:F11")をCellsにすればエラーにはならないのですが、検索範囲を指定したいのです。

sh2.Select
Range("E7:F11").Select を入れ、Range("E7:F11")をSelectionにすれば動くのもわかりました。でもSelectせずにやりたいのです。

わがまま言いますが、お教えくださいませ。
お願いします。

投稿日時 - 2004-12-06 10:22:07

QNo.1114728

困ってます

質問者が選んだベストアンサー

#1です。
#7を訂正します。

「#2さんが、触れられているように、Sheet2のE7~F11の間を選択していれば、正常に終了するはずです。」を
「#2さんが、触れられているように、アクティブなワークシートのE7~F11の間を選択していれば、正常に終了するはずです。」に訂正します。

また「この場合、Rangeで指定したSheet2のE7~F11以外にActivecellがあるとAfter指定が解釈できなくなりますので、エラーになったものでしょう。」を
「この場合、Rangeで指定したE7~F11以外にActivecellがあるとAfter指定が解釈できなくなりますので、エラーになったものでしょう。」に訂正します。

今回の場合、E7~F11が選択されているのは、Sheet2である必要はありませんでした。

あと#5さんの仰るようなActivecellが失敗するのは、グラフシートなどワークシートが以外がアクティブだった時になります。

投稿日時 - 2004-12-06 19:28:13

お礼

はい、納得しました。
なんどもありがとうございました。

投稿日時 - 2004-12-07 17:52:52

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.9

あーそうですねぇ。
どこのシートでも良いから、そのRange範囲内のセルがアクティブだったらそれで通りますねぇ。
After引数が他のシート上のActiveCellでもとりあえずAddressだけその範囲内のが返ってくればそれで通るみたいです。

Afterを指定するならRange("E7")とでもしておくのが良いかと思います。
これはE7から検索を開始するという意味です。
指定しなくてもE7(Range範囲内の一番左上)からになります。

投稿日時 - 2004-12-06 20:04:23

お礼

なんどもありがとうございました。

投稿日時 - 2004-12-07 17:53:08

ANo.7

#1です。
>でもなぜなんでしょうか?
#2さんが、触れられているように、Sheet2のE7~F11の間を選択していれば、正常に終了するはずです。
afterパラメータは、特定のセル以降のセルを検索の対象範囲にするという指定ですが、この場合、Rangeで指定したSheet2のE7~F11以外にActivecellがあるとAfter指定が解釈できなくなりますので、エラーになったものでしょう。

今回の場合、#5(と#6)さんの回答は誤解されていると思います。

投稿日時 - 2004-12-06 19:05:59

ANo.6

修正です。

「ヘルプにもありますがアクティブなシートでないシートのActiveCell プロパティは失敗します。」です。

ちなみに対応については
Afterは別に指定する必要もそうそうないので削っておけば問題ないかと思います。
どうしても指定したいならActiveCell以外の方式で指定しましょう。

投稿日時 - 2004-12-06 15:57:52

お礼

なんどもありがとうございました。

投稿日時 - 2004-12-07 17:52:03

ANo.5

ヘルプにもありますがアクティブなシートでのActiveCell プロパティは失敗します。
これはエクセルの仕様です。

分かり易い例で示すと

Dim WS1 As Worksheet
Dim WS2 As Worksheet

Set WS1 = Worksheets(1)
Set WS2 = Worksheets(2)

WS2.Activate
'WS1.Activate
'↑ここのコメントを外すとエラーになります。

WS2.Range(ActiveCell.Address).Activate

※ActiveとSelectは微妙に意味合いが違いますが、ここでの使われ方はほぼ同じ意味です。

投稿日時 - 2004-12-06 15:51:57

お礼

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

投稿日時 - 2004-12-07 17:51:39

ANo.4

#3です。
他の人と同じように
After:=Activecellを削除して
やってみたらsh3.selectも要りませんでした。

投稿日時 - 2004-12-06 11:24:35

お礼

なんどもありがとうございます。

投稿日時 - 2004-12-06 11:27:44

ANo.3

Range("E7:F11").selectはいらないけど
sh2.Selectは、要ると思う。

投稿日時 - 2004-12-06 11:11:55

お礼

やってみましたがダメでした。
After:=ActiveCellを取ったらOKとなりました。

投稿日時 - 2004-12-06 11:27:08

ANo.2

bec

Findメソッドの、After:=Activecellが不要かなと思います。
sheet2のE7~F11を選択してれば問題なく動きますが、
そうでない場合は、検索範囲外になってしまいます。
こちらの環境(Excel2002)では問題なく動きました。

何かしらの条件で、このメソッドが必要だったら無視してください。

投稿日時 - 2004-12-06 11:06:21

お礼

ありがとうございます。
After:=ActiveCellを取ったらエラーになりませんでした。
でもなぜなんでしょうか?

投稿日時 - 2004-12-06 11:23:59

ANo.1

私の環境では(Excel2003)「型が一致しません」というエラーになるので、自信はありません。

Set xのところのAfter:=ActiveCellを取ってみたらどうでしょう?
Set x = sh2.Range("E7:F11").Find(What:=sh1.Cells(i, "C"), LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

投稿日時 - 2004-12-06 10:58:21

お礼

ありがとうございます。
After:=ActiveCellを取ったらエラーになりませんでした。
でもなぜなんでしょうか?

投稿日時 - 2004-12-06 11:23:21

あなたにオススメの質問