[[20200606192625]] 『選択したセル範囲の色づけ』(たなしん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『選択したセル範囲の色づけ』(たなしん)

すみません。教えてください

セルの選択するとその選択された範囲に色が付き
ユーザーフォームに作ったボタンを押すと
その処理が適用されて色が元に戻る(白)
っというのはVBAで可能でょうか?

よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:unknown >


 可能です。マクロの記録をしてみたらどうでしょう。
(tou) 2020/06/06(土) 19:37

すみません、スマホからでやりたい質問を端折りすぎてしまって申し訳なかったです。

VBEと条件付き書式でセルを選択した瞬間にセルや行を色で協調することはできたのですが
シフトキーやコントロールキーで

A2、D6, I23など

ランダムにセルを選択していった時にそれらが全て色がついた状態のまま保持

というのは調べてもなかなか出てこなくて、なかなか難しいでしょうか。

(たなしん) 2020/06/07(日) 02:48


Worksheet_Changeを使用したらどうでしょうか。
コードについては回答しません。
(tou) 2020/06/07(日) 13:28

touさん
どうもです。ThesWorkBookには一応このコードは入れてあるけど
やはり1つめのアクティブセルしか色が変わりません。
もっと調べてみます。

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

Application.ScreenUpdating = True

End Sub

(たなしん) 2020/06/07(日) 14:02


永遠に塗りつぶしつづける?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveCell.Interior.Color = RGB(200, 200, 200)
End Sub
(Marvie) 2020/06/07(日) 16:20


(Marvie)さん

・自分の作った表の中で選択した行をカーソルでまとめて選択したり
 違う行を選んだりしたものを全て色付けしてピックアップしたい
・選択を解除すれば色も消える

という事をやろうとして色々調べました。

その表の範囲を選んで条件付き書式→数式を使用して書式設定をするセルを決定
=CELL("ROW")=ROW() をいれて自分の任意の塗りつぶしの色を設定

VBAを起動してThisWorkBookに

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Application.ScreenUpdating = True
End Sub

を入力しました。
ただこれだと最初に選択した行は色がついて表示されるけど
ドラッグしたりして複数行を選んでも最初の行しか色付けがされず。 というところであきらめました。

アクティブセル(行)というより選択セル(行)全てに色がつく
やめると元のデフォルト色に戻る

というのはちょっと自分には敷居が高すぎました。

(たなしん) 2020/06/07(日) 17:34


横からですが。

■1
提示されたコードだと「Application.ScreenUpdating = True」だけ実行しているので、実質なにもしてないのは理解してますか?

■2
多分言っているようなことはこのようなことではないでしょうか?

    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
        Cells.Interior.Color = xlNone
        Selection.Interior.Color = RGB(255, 0, 0)
    End Sub

■3
>ユーザーフォームに作ったボタンを押すとその処理が適用されて色が元に戻る(白)
そのようにしたければ、【別途】塗りつぶし色を無しにしてあげないとダメですよね?

(もこな2 ) 2020/06/07(日) 19:46


もこな2さん
ご返信ありがとうございます。セルの書式や関数はある程度やっていたのですが
マクロはまだ初心者でして申し訳ありません。

■1
提示されたコードだと「Application.ScreenUpdating = True」だけ実行しているので、実質なにもしてないのは理解してますか?

・セルの書式や関数はある程度やっていたのですがマクロはまだ初心者でして申し訳ありません。

■2
多分言っているようなことはこのようなことではないでしょうか?

    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
        Cells.Interior.Color = xlNone
        Selection.Interior.Color = RGB(255, 0, 0)
    End Sub

・これを適用してみたらかなり理想に近い挙動になりました。
これを選択セルの中の特定の列全てに制御することは可能でしょうか?

  A13セルを選択してもE〜M列の13行目が塗りつぶされる
 B4:E8を範囲選択しても  E〜M列の4行目〜8行目が塗りつぶされる

と、列を気にせずとも選んだ行の特定の列を色で全てピックアップできないかと思っておりました。
なので調べてたら上記の方法がヒットしたので実行してみた次第です。

■3
>ユーザーフォームに作ったボタンを押すとその処理が適用されて色が元に戻る(白)
そのようにしたければ、【別途】塗りつぶし色を無しにしてあげないとダメですよね?

・すみません、こちらについては都合上やめることにしました。申し訳ありません。

  【どのように自由に範囲選択しようが選択されたE〜M列の行が塗りつぶされる
  選択をやめると元に戻る】

という事をできないか調べてやったのが小生の知識の限界でした。

(たなしん) 2020/06/07(日) 20:27


すみません、選択したらその行の特定の列に色がつくけど
選択解除したら色は戻る

という挙動が自分の理想でした。
塗りつぶしっだとだめですね。
マクロを使わずにそういう機能が元々エクセルにないか調べてみます。
(たなしん) 2020/06/07(日) 20:41


 >マクロを使わずにそういう機能が元々エクセルにないか調べてみます。
 そういう機能はありません。

(馬鹿な人) 2020/06/07(日) 21:00


■4
>これを選択セルの中の特定の列全てに制御することは可能でしょうか?
可能ですが、おっしゃってることからして【行】の間違いでしょう。
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
        Stop  'ブレークポイントの代わり

        Sh.Range("E:M").Interior.Color = xlNone
        If Intersect(Sh.Range("E:M"), Target) Is Nothing Then
            Exit Sub
        Else
            Intersect(Selection.EntireRow, Sh.Range("E:M")).Interior.Color = RGB(255, 0, 0)
        End If
    End Sub

■5
>上記の方法がヒットしたので実行してみた
適当に書いてもダメですから、ちゃんと理解してから記述すべきです。
「ScreenUpdating」について、もう一度ちゃんと調べてみてください。
やりたいこととは全く関係ないと思いますよ。
http://officetanaka.net/excel/vba/speed/s1.htm

■6
コードの意味を理解するには、ステップ実行をして一行ずつ実行しながら観察するのが有効なアプローチだと思います。
よって「■4」のコードをステップ実行してみてください。
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

(もこな2 ) 2020/06/07(日) 21:23


もこな2さん

■4
・凄すぎです。・・・完全に完成です。

■5
■6
・わざわざ参考になる。URLありがとうございます。

  基礎も意味もわからずインターネットで検索して拾ってくるやり方じゃダメですね。

  基礎からしっかりと意味を理解して勉強していこうと思います。
 本当にありがとうございました。

(たなしん) 2020/06/07(日) 21:58


 回答ではなく、余談です。

 ああ、これは"アンドリューの方法"と一部で?呼ばれる、割と有名なやりかたですね。
https://www.relief.jp/docs/001406.html

 Application.ScreenUpdating = True
 にはそれなりの意味があると思います。
 それを再描画のトリガーにしている、仕掛けのキモでもあります。

 既にご案内のように、CELL("ROW")が選択領域の左上単一セルの行番号を返すという
 仕様のため、複数セルを選択した場合には対応できないわけです。

 「カーソル位置(行、列、交差する単一セルなど)を目立たせたい」という話題で、
 私が唯一推奨できる方法です。
 他の方法(セルの背景色を変更する)では、カーソルを動かしたときに、
 過去いたところの色を復元する必要があるわけですが、元々のセルが色を多用していた場合、
 その保存復元が高コストになってしまうからですね。

 今回のテーマは、そもそも"Excelの既定の複数セル選択表示が判別しにくい"という
 認識から出発しています。
 それはチャレンジとしてありうると思うのですが、
 それほどまずい状況なのかなとも思います。

 大多数の人はそれを前提として使っているわけで、特定目的(プレゼンテーションなど)で
 無い限り、普通のことは普通にしておくのがよいのではないか、という気持ちが正直します。

(γ) 2020/06/08(月) 02:44


>γさん
フォローありがとうございます。
なるほど、こんな方法があったんですね。

質問者さんの「条件付き書式〜」の部分を全く読んでませんでした・・・
お目汚し失礼しました。

(もこな2 ) 2020/06/08(月) 03:05


たまたま、私も入力中の行を目立たせる必要が生じたので↓を作ってみました。
参考に提供します。
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Cells.FormatConditions.Delete

        If Intersect(Selection, Range("D:BC")) Is Nothing Then Exit Sub
        With Intersect(Selection.EntireRow, Range("D:BC"))
            .FormatConditions.Add Type:=xlExpression, Formula1:="=TRUE"
            With .FormatConditions(1).Interior
                .Pattern = xlGray50
                .PatternColor = vbYellow
            End With
        End With
    End Sub

(もこな2 ) 2020/06/08(月) 12:24


γさん
・まさにやりたいことがそれで、見つけたサイトがそれで、自分の条件を満たせなかったことがそれ、でした。
 
 共用する他の使用者にどうしてもわかりやすく使って欲しいと思ったのがきっかけです。
 プレゼンなどなら見つけたサイトの方法で良かったのですが
 ドラッグしたりctrlキーで飛び飛びで選択した複数の色付けされた行は
 ユーザーフォームのボタン押したら全部に適用されますよ。
 となるべく使用者にわかりやすく見せたいなと思っていまして。。
 

もこな2さん
・昨日はありがとうございました。

 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
        Stop  'ブレークポイントの代わり
        Sh.Range("E:M").Interior.Color = xlNone
        If Intersect(Sh.Range("E:M"), Target) Is Nothing Then
            Exit Sub
        Else
            Intersect(Selection.EntireRow, Sh.Range("E:M")).Interior.Color = RGB(255, 0, 0)
        End If
 End Sub

この頂いたプロシージャに1行目から7行目は色付けの適用外になるように
という条件を追加しようと思って今度は頑張って調べています。

・本日はPCに触れる環境ではなくスマホから書き込んでいるので実行できないのですが
 もこな2さんが新たに自作したものと昨日頂いたものの違いは仕様が大きく違うものなのでしょうか?
 そちらの方が使い勝手が良ければそちらをパク…再度頂いて使用させて頂こうかと思っております。

(たなしん) 2020/06/08(月) 17:52


1行目から7行目は色付けの適用外になるように
やってみた事その1

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

        Stop  'ブレークポイントの代わり
      If Target.Row >= 8 Then          '追加
Sh.Range("E:M").Interior.Color = xlNone
        If Intersect(Sh.Range("E:M"), Target) Is Nothing Then
            Exit Sub
        Else
            Intersect(Selection.EntireRow, Sh.Range("E:M")).Interior.Color = RGB(255, 0, 0)
        End If
     End If               '追加
End Sub

課題・5行目〜11行目を一気に選んだりすると色が適用されてくれない。
  ・選択を1行目に戻すと一つ前に選択していた該当の行の色が残りっぱなし

やってみた事その2
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

        Stop  'ブレークポイントの代わり
      
Sh.Range("E:M").Interior.Color = xlNone
        If Intersect(Sh.Range("E8:M5000"), Target) Is Nothing Then   '追加。最終行は適当で…
            Exit Sub
        Else
            Intersect(Selection.EntireRow, Sh.Range("E:M")).Interior.Color = RGB(255, 0, 0)
        End If
  
End Sub

課題・5行目〜11行目など一気に選ぶと567行目も色付けされてしまうが自分の理想には近づいたかも
  

理想・例えば3行目〜14行目を一気に選んだとしても8行目からしか色付けされず、1行目などを選べば全部色が消える。

頑張ります。色々弄ってると挙動が違ってきますね。

(たなしん) 2020/06/08(月) 20:55


■7
繰り返しになりますが、コードの意味を理解するには、ステップ実行をして一行ずつ実行しながら観察するのが有効なアプローチだと思います。
>5行目〜11行目を一気に選んだりすると色が適用されてくれない。
>選択を1行目に戻すと一つ前に選択していた該当の行の色が残りっぱなし
ステップ実行してみれば容易に気づけることですが、「Target.Row」が選択範囲の1行目の行番号を返すから、
 5行目〜11行目を選択 → 5が返り → 5 >= 8 → 「偽」なので処理されない
 1行目を選択         → 1が返り → 1 >= 8 → 「偽」なので処理されない

となっているためですね

■8
>5行目〜11行目など一気に選ぶと567行目も色付けされてしまう
567行目のセルも選択していたんじゃないでしょうか?

こちらも繰り返しになりますが、理解せずに適当に書いてもダメです。
先に「Intersectメソッド」と「EntireRowプロパティ」について調べてみてください。

■9
>仕様が大きく違うものなのでしょうか?
見慣れない命令は、ご自身で調べたほうが理解できると思いますが、

 Rangeオブジェクト.Interior.Color ・・・・セルの塗りつぶし色を設定
 Rangeオブジェクト.FormatConditions ・・・セルの条件付き書式をあれやこれやする命令

なので、私にとっては大きく違いましたね。

(もこな2 ) 2020/06/09(火) 00:56


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.