- ベストアンサー
エクセルでセレクトの解除
Cells.Select で全てのセルをセレクトした後に、 W20 だけセレクトを解除するマクロ文を教えて頂けますか。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> 部分セレクト状態から一つ外す 部分セレクトとは選択範囲という理解でいいですね? 選択部分から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
その他の回答 (5)
- KenKen_SP
- ベストアンサー率62% (785/1258)
おお...ほとんど同一内容を投稿してしまった。 すみません、気が付かなかったです。
お礼
いえいえ、感謝しております。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。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 で示されたものになりますが、結合セルの可能性を考えるとコードは非常に複雑 になりますよ。 できれば代替案を考えたいところですが、本ご質問の目的は何ですか?
お礼
有難うございます。 解決しました。
- merlionXX
- ベストアンサー率48% (1930/4007)
> セルのサイズを変更しているシートですと、セレクトされない部分がかなり発生しています。 セルのサイズは無関係のはずですが・・・・。 ひょっとして結合してたり、W20のかわりに入れたセルが複数なのかな? > 最終的には、全セレクト状態から一つ外すというのではなく、部分セレクト状態から一つ外すところに到達したいと思っています。 最初からそういってください。 これまでの回答が無駄になります。
お礼
有難うございます。 >ひょっとして結合してたり、W20のかわりに入れたセルが複数なのかな? 結合はしていません。W20を変えて試していません。 >最初からそういってください。 >これまでの回答が無駄になります。 求めるものが途中で変わることもありますので。 また、前回の2つの回答を無駄だとは思っていません。考え方の一つとして参考になる部分は多々あります。
- merlionXX
- ベストアンサー率48% (1930/4007)
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
お礼
たびたび有難うございます。 セルのサイズがデフォルトのシートではうまく行きましたが、セルのサイズを変更しているシートですと、セレクトされない部分がかなり発生しています。 また、最終的には、全セレクト状態から一つ外すというのではなく、部分セレクト状態から一つ外すところに到達したいと思っています。
- merlionXX
- ベストアンサー率48% (1930/4007)
ご希望とは違うかと思いますが・・・。 Range("1:19,A20:V20,X20:IV20,21:65536").Select ではいかがでしょう?
お礼
有難うございます。 ただ、W20は一例です。 W20 の指定だけ変えることで、他のセルの場合も適応できるものを求めていました。
お礼
有難うございます。 解決しました。