- ベストアンサー
Excel VBAで数式が定義されているセルのみを選択する方法
- Excel VBAを使用して、任意に範囲選択したセルのうち数式が定義されているセルのみを選択するマクロについて解説します。
- 特定の範囲を選択し、VBAコードを実行すると、数式が定義されているセルが選択されますが、数式が1つだけの場合はシート全体が選択されてしまうという問題があります。
- 回避する方法として、セルの種類に応じて処理を分岐させることで、数式が1つだけの場合でも正しくセルを選択することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。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
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
なるほど、結合セルの場合1つのセルであり、複数のセルを含むということですね。 こんな感じでどうでしょう If Selection.Count > 1 And IsNull(Selection.MergeCells) Then Selection.SpecialCells(xlCellTypeFormulas).Select End If
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
つまり、セルが1つの場合、セル範囲を指定してるのではないとされるということでしょう。 Selection.Count > 1 場合に実行するようなことにしたらどうでしょうか
お礼
すみません。お礼の欄を使わせて頂き詳細な具体例をお伝えいたします。 仮の条件として "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の考え方についてもご指導願えませんでしょうか?宜しくお願い致します。
補足
早速のご指導有難う御座います。 今、ご指導の内容を試して見たんですが、ひとつのみ選択した場合は、ご指導の通り、Selection.Count > 1 で単一のセルであることが検出できました。しかし、結合セルの場合は、Selection.Count=結合したセル数となり、コレクションとして帰ってきてしまいチェックに引っかかりません。そのときは、Areasとあわせてチェックする方法しかないのでしょうか? 重ね重ねご指導のほど宜しくお願い致します。 また、もともとRange(範囲)なのに単一のセルもしくは単一の結合セルでは、意図したものにならないのでしょうか?VBAの仕様なのでしょうか?(そんな大げさなものではなく、単に使い方が間違っているだけのような気もしますが・・?)宜しくお願い致します。
補足
>Intersect を使います。ガ~ぁんって感じになりました。Intersectについては、No.1819003で、imogasi様に教えて貰っていたのに!! 全く、応用が利かない自分を痛感しています。っていうか?素質なんでしょうね?感じるっていうか?鼻が利くって言うか?一つのメソッドを覚えたらそれを使うことばかり考えてしまい、ほんのちょっとした応用ができないような気がしています。もっと、柔らかくモノを考えることを考えてみます。 本当に本当にいつもいつも有難う御座います。 今後とも宜しくお願い致します。