• ベストアンサー

エクセルでセレクトの解除

Cells.Select で全てのセルをセレクトした後に、 W20 だけセレクトを解除するマクロ文を教えて頂けますか。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

> 部分セレクト状態から一つ外す 部分セレクトとは選択範囲という理解でいいですね? 選択部分からW20だけを除外します。(ただしあまり広範囲にSelectしていると時間がかかります。) Sub test03() Dim rngC As Range Dim rngRet As Range For Each rngC In Selection If rngC.Address <> "$W$20" Then If rngRet Is Nothing Then Set rngRet = rngC Else Set rngRet = Union(rngRet, rngC) End If End If Next rngC If Not rngRet Is Nothing Then rngRet.Select Set rngRet = Nothing End If End Sub

sear17
質問者

お礼

有難うございます。 解決しました。

その他の回答 (5)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

おお...ほとんど同一内容を投稿してしまった。 すみません、気が付かなかったです。

sear17
質問者

お礼

いえいえ、感謝しております。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

こんにちは。KenKen_SP です。 > 最終的には、全セレクト状態から一つ外すというのではなく、部分セレクト > 状態から一つ外すところに到達したいと思っています。 広いの選択領域では遅くて使い物になりませんが、狭い選択領域の中から一部 のセルを選択解除するなら、For Each で Range コレクションをループさせれ ばそれなりに動きます。 以下のサンプルでは、Selection の中に C1 セルが含まれていれば、C1 セルの 選択を解除します。 Sub SampleMacro()   Dim C     As Range   Dim strRelease As String   Dim rngRet   As Range      ' 選択を解除するセルのアドレス   strRelease = "C1" '複数指定するならカンマで区切る ex) C1,E1,G6      For Each C In Selection     If Intersect(C, ActiveSheet.Range(strRelease)) Is Nothing Then       If rngRet Is Nothing Then         Set rngRet = C       Else         Set rngRet = Union(rngRet, C)       End If     End If   Next C   rngRet.Select      Set rngRet = Nothing End Sub 全セル選択状態の中から...となるとロジックとしては、merlionXX さんが #2 で示されたものになりますが、結合セルの可能性を考えるとコードは非常に複雑 になりますよ。 できれば代替案を考えたいところですが、本ご質問の目的は何ですか?

sear17
質問者

お礼

有難うございます。 解決しました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

> セルのサイズを変更しているシートですと、セレクトされない部分がかなり発生しています。 セルのサイズは無関係のはずですが・・・・。 ひょっとして結合してたり、W20のかわりに入れたセルが複数なのかな? > 最終的には、全セレクト状態から一つ外すというのではなく、部分セレクト状態から一つ外すところに到達したいと思っています。 最初からそういってください。 これまでの回答が無駄になります。

sear17
質問者

お礼

有難うございます。 >ひょっとして結合してたり、W20のかわりに入れたセルが複数なのかな? 結合はしていません。W20を変えて試していません。 >最初からそういってください。 >これまでの回答が無駄になります。 求めるものが途中で変わることもありますので。 また、前回の2つの回答を無駄だとは思っていません。考え方の一つとして参考になる部分は多々あります。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

No1です。 これでどうでしょう? Set rngO = Range("W20")のところだけを変えればOKです。 Sub TEST02() Set rngO = Range("W20") Set rngA = Range(rngO.Offset(-1, 0), Cells(1)) Set rngB = Range(Range(rngO.Offset(0, -1), rngO.Offset(0, -1).End(xlToLeft)), Range(rngO.Offset(0, -1), rngO.Offset(0, -1).End(xlToLeft)).End(xlDown)) Set rngC = Range(Range(rngO.Offset(0, 1), rngO.Offset(0, 1).End(xlDown)), Range(rngO.Offset(0, 1), rngO.Offset(0, 1).End(xlDown)).End(xlToRight)) Set rngD = Range(rngO.Offset(1, 0), rngO.Offset(1, 0).End(xlDown)) Set rngE = Range(Range(rngO.Offset(-1, 1), rngO.Offset(-1, 1).End(xlUp)), Range(rngO.Offset(-1, 1), rngO.Offset(-1, 1).End(xlUp)).End(xlToRight)) Union(rngA, rngB, rngC, rngD, rngE).Select End Sub

sear17
質問者

お礼

たびたび有難うございます。 セルのサイズがデフォルトのシートではうまく行きましたが、セルのサイズを変更しているシートですと、セレクトされない部分がかなり発生しています。 また、最終的には、全セレクト状態から一つ外すというのではなく、部分セレクト状態から一つ外すところに到達したいと思っています。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

ご希望とは違うかと思いますが・・・。 Range("1:19,A20:V20,X20:IV20,21:65536").Select ではいかがでしょう?

sear17
質問者

お礼

有難うございます。 ただ、W20は一例です。 W20 の指定だけ変えることで、他のセルの場合も適応できるものを求めていました。

関連するQ&A