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

解決済みの質問

エクセル VBA シートの選択 

windows XP でエクセル2000を使っています。


Sub aaa()

Sheets("Sheet1").Select
Dim a As String
a = Cells(2, 4)
Sheets(a).Select
Range("A1").Select
End Sub

というマクロだと セルに入っている値のシート名を探してくれます。

ですが

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub
Worksheets("Sheet1").Range("C2").Value = Target.Value

Dim b As String
b = Range("C2).value (←ここをcellsにしてもダメ)
Sheets(b).Select
Range("A1").Select

End Sub


これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。
何処が間違えているのでしょうか。

全くの素人ですが、仕事で必要に迫られています。
わかりやすく回答・解説くれると助かります。

投稿日時 - 2010-12-19 21:47:55

QNo.6395110

すぐに回答ほしいです

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

No2 merlionXXです。

そのコードはどのシートモジュールに書きましたか?
こう書いたらどうなりますか?

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Intersect(Target, Range("B11:B683")) Is Nothing Then Exit Sub
Worksheets("Sheet1").Range("C2").Value = Target.Value
Dim b As String
b = Worksheets("Sheet1").Range("C2").Value
Sheets(b).Select
Sheets(b).Range("A1").Select
End Sub

投稿日時 - 2010-12-20 11:18:40

お礼

たびたびのご回答有難う御座います。

上記にて解決致しました。
助かりました!!

投稿日時 - 2010-12-20 13:44:35

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

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

回答(5)

ANo.5

>Sheets(b).Select
 ⇒エクセル2007でしか検証していませんので何とも云えませんが、Sheets(b)がactiveでないからだと思う。
  Sheets(b).Activateでお試しください。

投稿日時 - 2010-12-20 12:23:17

お礼

ご回答有難う御座います!!

解決致しました。後ほどこちらでも
試してみます。

投稿日時 - 2010-12-20 13:45:51

ANo.3

基本的なことですが、モジュールの親オブジェクトは何かということを理解していませんね。仮に、シートモジュールで動かすとすれば、

>Sheets(b).Select
>Range("A1").Select

シートモジュールでは、ここで親オブジェクトに相違が出てしまい、エラーが出ます。
どこのシートモジュールか分かりませんが、このようになります。
しかし、なぜ、クリック範囲が、"B11:B683" となっているのか、想像の範囲でしかありません。また、Sheetsとするのは、Cellのないシートもあるのですから、少し乱暴なコードですが、そのままにします。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim ShName As String
 If Intersect(Target, Range("B11:B683")) Is Nothing Then Exit Sub
 If Target.Count > 1 Then Exit Sub
 If Target.Value = "" Then Exit Sub
 ShName = Target.Value
 On Error Resume Next
 Application.Goto Sheets(ShName).Range("A1")
 If Err.Number = 0 Then
 'エラーがなければ、C2に書きこむ
  Worksheets("Sheet1").Range("C2").Value = Target.Value 
 End If
 On Error GoTo 0
End Sub

投稿日時 - 2010-12-19 23:01:55

補足

こちらの方法もやってみましたが解決しました!!
Private Sub Worksheet_SelectionChangeについて
理解がないという事ですね。
Application.Goto を使うのもポイントなんでしょうか。
勉強になります!!

投稿日時 - 2010-12-20 13:59:07

お礼

ご回答有難う御座います!!

<<基本的なことですが、モジュールの親オブジェクトは
<<何かということを理解していませんね。

はい。全く理解してません。
上記の命令分は、ほぼコピペで作ってます。

<<そのコードはB11からB683のセルにシート名があり、
<<そのシート名のセルをクリックしたらそのシート
<<名のシートを選択するという意味

この意味ではどのように記載するのが簡潔でしょうか。
(例えばAというシートのB11からB683のセルクリックで他のシートを選ぶ場合)
解りやすくお助け下さい。

投稿日時 - 2010-12-20 10:00:01

ANo.2

お書きになったコードでは
Sheets(b).Selectの前に、
b = Range("C2).value
の部分でエラーになると思います。
("C2”)が("C2).になってますので。

それはともかく
そのコードはB11からB683のセルにシート名があり、そのシート名のセルをクリックしたらそのシート名のシートを選択するという意味のですが、それが正しいですか?

そうだとしたらB11からB683のセルをクリックしたところ、そのセルに書かれた名前のシートが存在しなかったのではないでしょうか?

投稿日時 - 2010-12-19 22:52:23

お礼

ご回答有難う御座います!!

<<そのコードはB11からB683のセルにシート名があり、
<<そのシート名のセルをクリックしたらそのシート
<<名のシートを選択するという意味のですが、それが正しいですか?

その通りです!!
<名前のシートが存在しなかったのではないでしょうか?
私もそう思ったのですが、同様の文字列で最初に挙げた例だと選択して
IF以下の文章を入れると選択しません。
助けて下さい。

投稿日時 - 2010-12-20 09:44:04

ANo.1

If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub
Worksheets("Sheet1").Range("C2").Value = Target.Value
がなければ動きますよ。

Worksheets("Sheet1").Range("C2").Value = Target.Value
でC2の値がなしになっているのでは?

投稿日時 - 2010-12-19 22:14:23

お礼

ご回答有難う御座います!!

C2に値はあります。
最初に挙げたセルと同様のものを記載しても
エラーが出ます。

投稿日時 - 2010-12-20 09:39:37

あなたにオススメの質問