• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelVBA 選択したセルの取得)

ExcelVBA選択したセルを取得する方法

このQ&Aのポイント
  • ExcelVBAを使用して、選択した範囲のセルを取得する方法について教えてください。
  • 選択したセルの数を正確に取得する方法や、重複したセルを除いた範囲を取得する方法について教えてください。
  • 処理したセルを記憶させる以外の方法で、選択したセルを効率的に取得する方法について教えてください。

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

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

VBAはたいして知りませんが… 「そんなバカな」と思って、試してみたらご質問の通りですね。 どうやら、Rangeは矩形の範囲を最低単位として(Areas)構成しているみたいで、同じセルを「ctl」+「左クリック」した場合、その回数だけAreaができていくのでダブってカウントされるようです。 うっかり For Each などで処理をすると、処理の内容によってはご質問のようなことになるみたい。 (どうせ、MSさんの『仕様』なんでしょうけれど… 普通はこんな動作期待しませんよね。) 解決法を2つ考えてみました。 1)自分で重複をチェックして範囲を作り直す (←ご質問文にすでにありますが)  一旦、For Eachでハッシュなどにセルを吐き出すことで、重複を除くことができる  ので、改めて、そのハッシュを元にループ処理を行なう方法。 <処理のイメージ>  Set d = CreateObject("Scripting.Dictionary")  For Each c In Selection   d(c.Address) = 1  Next c  counter = d.count  key = d.keys  For i = 0 To counter - 1   ' 目的の処理  Next i 2)対象範囲が限定できているのなら、その範囲内で舐めてゆく  操作の対象があらかじめわかっていればその範囲で、そうでなければUsedRange  などを利用して、その範囲内のセルについてループを廻す。(For EachでもOK)  セルが、セレクション内だったら処理、そうでなければスキップ という方法。 <処理のイメージ>  counter = 0  For Each c In ActiveSheet.UsedRange   If Not (Intersect(c, Selection) Is Nothing) Then     ' 目的の処理    coounter = counter + 1   End If  Next c 2)ではあらかじめセル数を知ることはできませんが、「1回ずつの処理」は可能ですし、ループ時にカウントすればセル数も求められます。 ただし、選択される可能性のある範囲に対して、大きすぎる範囲で走査するようだと効率が悪くなりかねません。 1)は一旦ハッシュに置き換えるので、ご質問文の『記憶させる方法』に該当しますが、多分、効率は良さそう。 2)は記憶はしないものの、範囲を広くしているために場合によっては効率が悪くなる可能性があるといったところでしょうか。

yukino-no-kuni
質問者

お礼

やはりそうなのですね、覚えておきます。 どうもありがとうございました!

関連するQ&A

専門家に質問してみよう