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

解決済みの質問

SelectionとSelectについて?(エクセルVBA)

任意に範囲選択したセルのうち数式が定義されているセルのみを選択するマクロについて教えてください。
次のようにコードを書いて
Sub TEST()
' MsgBox Selection.Address
Selection.SpecialCells(xlCellTypeFormulas).Select
End Sub
任意の複数のセルに数式を定義します。(配置はばらばらでも構いません)
あるセル範囲を選択して上のコードを実行すると、次のような動作になります。
数式を定義したセル(以降、数式セル)を1つ以上と、数式の定義に関わらず別の1つ以上を含むセル範囲を選択した場合は、希望通りに数式セルが選択されます。
しかし、数式セルを一つだけ選択してコードを実行すると、シート全体で数式セルが選択されてしまいます。
ヘルプをみると、Selectionには、セルを選択しているときは、Range オブジェクトが返されます。とあり、SpecialCellsには、オブジェクトを返すメソッドです。指定された条件を満たしているすべてのセル (Range オブジェクト) を返します。とあります。
素人的には、Selection プロパティで返されるオブジェクトの種類は、何を選択するかによって異なります。の部分で、返されるオブジェクトが一つのセルを選択した場合は、オブジェクトがシートになってしまっているからだと推測します。しかし、複数のセルを結合したセルに数式を定義した場合で、一つの数式結合セルを選択して、MsgBox Selection.Addressと表示させると、Selectionは、複数のセルからなるセル範囲を返している様なメッセージが表示されるのに、次の行では、同じくシート全体が選択されてしまいます。
回避する方法ってないのでしょうか?教えて頂けないでしょうか?宜しくお願い致します。
また、説明が悪くてすみません。

投稿日時 - 2005-12-09 23:03:52

QNo.1829599

暇なときに回答ください

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

こんにちは。KenKen_SP です。

Intersect を使います。こんな感じ。

Sub Sample()

  Dim rngAREA As Range

  'Selection がセル以外なら終了
  If TypeName(Selection) <> "Range" Then Exit Sub

  'Selection と 数式のあるセルの交差範囲をオブジェクト変数にセット
  Set rngAREA = Intersect(Selection, Cells.SpecialCells(xlCellTypeFormulas))

  '交差範囲がなければオブジェクト変数は Nothing
  If Not rngAREA Is Nothing Then
    'Nothing でなければ選択
    rngAREA.Select
  End If

  '後始末
  Set rngAREA = Nothing

End Sub

投稿日時 - 2005-12-10 13:33:54

補足

>Intersect を使います。ガ~ぁんって感じになりました。Intersectについては、No.1819003で、imogasi様に教えて貰っていたのに!!
全く、応用が利かない自分を痛感しています。っていうか?素質なんでしょうね?感じるっていうか?鼻が利くって言うか?一つのメソッドを覚えたらそれを使うことばかり考えてしまい、ほんのちょっとした応用ができないような気がしています。もっと、柔らかくモノを考えることを考えてみます。
本当に本当にいつもいつも有難う御座います。
今後とも宜しくお願い致します。

投稿日時 - 2005-12-15 15:33:15

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

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

回答(3)

ANo.2

なるほど、結合セルの場合1つのセルであり、複数のセルを含むということですね。
こんな感じでどうでしょう
If Selection.Count > 1 And IsNull(Selection.MergeCells) Then
Selection.SpecialCells(xlCellTypeFormulas).Select
End If

投稿日時 - 2005-12-10 11:34:08

ANo.1

つまり、セルが1つの場合、セル範囲を指定してるのではないとされるということでしょう。
Selection.Count > 1
場合に実行するようなことにしたらどうでしょうか

投稿日時 - 2005-12-10 03:55:38

補足

早速のご指導有難う御座います。
今、ご指導の内容を試して見たんですが、ひとつのみ選択した場合は、ご指導の通り、Selection.Count > 1
で単一のセルであることが検出できました。しかし、結合セルの場合は、Selection.Count=結合したセル数となり、コレクションとして帰ってきてしまいチェックに引っかかりません。そのときは、Areasとあわせてチェックする方法しかないのでしょうか?
重ね重ねご指導のほど宜しくお願い致します。
また、もともとRange(範囲)なのに単一のセルもしくは単一の結合セルでは、意図したものにならないのでしょうか?VBAの仕様なのでしょうか?(そんな大げさなものではなく、単に使い方が間違っているだけのような気もしますが・・?)宜しくお願い致します。

投稿日時 - 2005-12-10 07:43:25

お礼

すみません。お礼の欄を使わせて頂き詳細な具体例をお伝えいたします。
仮の条件として
"A1","F1"に文字列"X"を代入します。
"B1:B3"のセルを結合して、数式"=1+1"を代入します。
"D1,G1"に数式"=1+1"を代入します。
そこで、"A1:H2"を選択してコードを実行すると、
"B1:B3,D1,G1"が選択されます。
"C1:D1"を選択して実行すると、"D1"が選択されます。
"C1:C3"を選択して実行すると、該当セルがありませんとエラーになります。(これは正しい結果と思いますのでエラートラップで対応したいと思います)
次に、"D1"を選択して実行すると、"B1:B3,D1,G1"が選択されます。これは、ご思考頂いた、Selection.Count > 1で回避することは出来ます。"B1"("B1:B3")を選択して実行するとSelection.Count=3となりご指導頂いた内容では回避でできずB1:B3,D1,G1"が選択されます。
単一のセル(セル範囲)を選択して実行した場合にそのまま返す方法と同時に、Selectionの考え方についてもご指導願えませんでしょうか?宜しくお願い致します。

投稿日時 - 2005-12-10 08:14:05

あなたにオススメの質問