人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセル2007(Excel2007)で、
「アクティブセルの間だけ」その行に色を付ける方法を教えて下さい。
付ける色は何色でも構いません。


それも条件がありまして、
セルに何かしら色(塗りつぶしの色)が付いている場合は、
そのセルのみにおいて、その色を表示したいです。

また後から色をつけた場合も、後からつけたその色を優先して表示する仕様にしたいと思っています。


VBAが必要でしたら、
そのマクロコードを教えていただきたいです。



●添付した画像は例として、
B5がアクティブセルになっていますので5行目に色(灰色)をつけています。
ですが、D5セルは黄色で塗りつぶされているため、この黄色を優先して表示しています。
(※分かりやすいように5行目の幅を広くしています。)





※何か分かりにくいところがありましたら、
どうかこのページでコメントをお願いします。


1412872134
●拡大する

●質問者: ヘンリ
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● a-kuma3
●1000ポイント ベストアンサー

まず、セルに元々ついている背景色のことを考えないとしたら、こんな感じになります。

Dim previous_row As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Not previous_row Is Nothing Then
 previous_row.Interior.Pattern = xlNone
 End If
 Target.EntireRow.Interior.Color = 16764108
 Set previous_row = Target.EntireRow
End Sub

以上のコードを、色を変えたいシートのマクロに貼り付けます。

後は、選択された行の背景色を変える前の色を保存、行の色を変えた後に復元。
別のセルが選択されたときに、行の色を元に戻し、個別のセルの色を復元。
という感じかな、と思いましたが、こんなところが気になりました。

で、セルに色を付ける方法を変えることで、対応したらどうでしょうか、という提案です。
「条件付き書式」は、セルの書式設定の書式に優先されます。
色を保存しておきたいセルには、セルの書式ではなく、条件付き書式で、以下のような設定をします。
f:id:a-kuma3:20141010213323p:image
数式には「=TRUE」、つまり、常に成立する、を指定して、書式で背景色を指定します。

すると、先に挙げたコードで、複数のセルを選択した場合、こんなような感じになります。
f:id:a-kuma3:20141010213324j:image



追記です。

ただ私が色を付けたいセルというのは、G列、Q列、R列、S列、T列、U列でして、それも数千行とあります。

背景色を保存する対象が A?Z 列の範囲限定(このくらいなら、遅くない)として、こんな感じではどうでしょう。

Dim previous_row As Range
Const BACKGROUND_COLOR = 16764108
Const MAX_COLUMN = 26

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim backup_color() As Long
 If Not previous_row Is Nothing Then
 ReDim backup_color(1 To previous_row.Rows.Count, 1 To MAX_COLUMN)
 For r = 1 To previous_row.Rows.Count
 For c = 1 To MAX_COLUMN
 If previous_row.Cells(r, c).Interior.Color <> BACKGROUND_COLOR Then
 backup_color(r, c) = previous_row.Cells(r, c).Interior.Color
 Else
 backup_color(r, c) = -1
 End If
 Next
 Next
 previous_row.Interior.Pattern = xlNone
 For r = 1 To previous_row.Rows.Count
 For c = 1 To MAX_COLUMN
 If backup_color(r, c) > 0 Then
 previous_row.Cells(r, c).Interior.Color = backup_color(r, c)
 End If
 Next
 Next
 End If

  ' これを入れておかないと、全選択とかすると、固まります
 If Target.Rows.Count > 50 Then
 Set previous_row = Nothing
 Exit Sub
 End If

 ReDim backup_color(1 To Target.Rows.Count, 1 To MAX_COLUMN)
 For r = 1 To Target.Rows.Count
 For c = 1 To MAX_COLUMN
 If Target.EntireRow.Cells(r, c).Interior.Pattern <> xlNone Then
 backup_color(r, c) = Target.EntireRow.Cells(r, c).Interior.Color
 Else
 backup_color(r, c) = -1
 End If
 Next
 Next
 Target.EntireRow.Interior.Color = BACKGROUND_COLOR
 Set previous_row = Target.EntireRow
 For r = 1 To Target.Rows.Count
 For c = 1 To MAX_COLUMN
 If backup_color(r, c) > 0 Then
 Target.EntireRow.Cells(r, c).Interior.Color = backup_color(r, c)
 End If
 Next
 Next
End Sub

やっつけ感が満載のコードですが、後で色を付けても大丈夫なのは確認しました。
後、選択したセルの行数が 50 を超えた場合には、処理を打ち切っています。
これをやらないと、シートのセルを全選択、とかすると、固まってしまうはずなので。

連続してセルを選択しても大丈夫なようには作ったのですが、複数のセルを飛び飛びに選択したときの動作はちょっと怪しいんです (´・ω・`)




追記です。

一度【塗りつぶしなし】を選んでしまうと、
「塗りつぶしなしを色と見なして」しまい、塗りつぶし状態のセルが最優先されてしまうようです。

対応してみました。

Dim previous_row As Range
Const BACKGROUND_COLOR = 16764108
Const MAX_COLUMN = 26

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim backup_color() As Long
 If Not previous_row Is Nothing Then
 ReDim backup_color(1 To previous_row.Rows.Count, 1 To MAX_COLUMN)
 For r = 1 To previous_row.Rows.Count
 For c = 1 To MAX_COLUMN
 If previous_row.Cells(r, c).Interior.Color <> BACKGROUND_COLOR And _
 previous_row.Cells(r, c).Interior.Pattern <> xlNone Then
 backup_color(r, c) = previous_row.Cells(r, c).Interior.Color
 Else
 backup_color(r, c) = -1
 End If
 Next
 Next
 previous_row.Interior.Pattern = xlNone
 For r = 1 To previous_row.Rows.Count
 For c = 1 To MAX_COLUMN
 If backup_color(r, c) > 0 Then
 previous_row.Cells(r, c).Interior.Color = backup_color(r, c)
 End If
 Next
 Next
 End If

  ' これを入れておかないと、全選択とかすると、固まります
 If Target.Rows.Count > 50 Then
 Set previous_row = Nothing
 Exit Sub
 End If

 ReDim backup_color(1 To Target.Rows.Count, 1 To MAX_COLUMN)
 For r = 1 To Target.Rows.Count
 For c = 1 To MAX_COLUMN
 If Target.EntireRow.Cells(r, c).Interior.Pattern <> xlNone Then
 backup_color(r, c) = Target.EntireRow.Cells(r, c).Interior.Color
 Else
 backup_color(r, c) = -1
 End If
 Next
 Next
 Target.EntireRow.Interior.Color = BACKGROUND_COLOR
 Set previous_row = Target.EntireRow
 For r = 1 To Target.Rows.Count
 For c = 1 To MAX_COLUMN
 If backup_color(r, c) > 0 Then
 Target.EntireRow.Cells(r, c).Interior.Color = backup_color(r, c)
 End If
 Next
 Next
End Sub






またまた、追記です。回答が見づらくって、ごめんなさい。

選択したセル全てを一括で塗りつぶしたいと考えているのですが、
もし解決法が分かりましたら教えていただきたいです。

ループの回し方を変えてみました。
前のコードに比べると、ちょっともっさりした感じがしますが、何となく動きます。

Dim previous_row As Range
Const BACKGROUND_COLOR = 16764108
Const MAX_COLUMN = 26

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim backup_color() As Long
 If Not previous_row Is Nothing Then
 ReDim backup_color(1 To previous_row.Count, 1 To MAX_COLUMN)
 i = 1
 For Each r In previous_row
 For c = 1 To MAX_COLUMN
 If r.EntireRow.Cells(1, c).Interior.Color <> BACKGROUND_COLOR And _
 r.EntireRow.Cells(1, c).Interior.Pattern <> xlNone Then
 backup_color(i, c) = r.EntireRow.Cells(1, c).Interior.Color
 Else
 backup_color(i, c) = -1
 End If
 Next
 i = i + 1
 If i > 50 Then  ' 恐がってます (´・ω・`)
 Debug.print "exit (1)"
 Exit Sub
 End If
 Next
 For Each r In previous_row
 r.EntireRow.Interior.Pattern = xlNone
 next
 i = 1
 For Each r In previous_row
 For c = 1 To MAX_COLUMN
 If backup_color(i, c) > 0 Then
 r.EntireRow.Cells(1, c).Interior.Color = backup_color(i, c)
 End If
 Next
 i = i + 1
 If i > 50 Then  ' 恐がってます (´・ω・`)
 Debug.print "exit (2)"
 Exit Sub
 End If
 Next
 End If
 
  ' これを入れておかないと、全選択とかすると、固まります
 If Target.Count > 50 Then
 Set previous_row = Nothing
 Exit Sub
 End If
 
 ReDim backup_color(1 To Target.Count, 1 To MAX_COLUMN)
 i = 1
 For Each r In Target
 For c = 1 To MAX_COLUMN
  'Debug.Print Target.EntireRow.Cells(r, c).Interior.Color
 
 If r.EntireRow.Cells(1, c).Interior.Pattern <> xlNone Then
 backup_color(i, c) = r.EntireRow.Cells(1, c).Interior.Color
 Else
 backup_color(i, c) = -1
 End If
 Next
 i = i + 1
 If i > 50 Then  ' 恐がってます (´・ω・`)
 Debug.print "exit (3)"
 Exit Sub
 End If
 Next
 Target.EntireRow.Interior.Color = BACKGROUND_COLOR
 Set previous_row = Target
 i = 1
 For Each r In Target
 For c = 1 To MAX_COLUMN
 If backup_color(i, c) > 0 Then
 r.EntireRow.Cells(1, c).Interior.Color = backup_color(i, c)
 End If
 Next
 i = i + 1
 If i > 50 Then  ' 恐がってます (´・ω・`)
 Debug.print "exit (4)"
 Exit Sub
 End If
 Next
End Sub

「恐がってます (´・ω・`)」のコメントを入れたところは、無くても大丈夫だと思うのですが、編集中にマクロが固まると、かなり悲しい思いをするので、残しておいた方が良いと思います。
Debug.print じゃなくて、Msgbox の方が良かったかも。


ヘンリさんのコメント
a-kuma3 さんへ いつもお世話になっております。 画像(内の書き込み)を使ってご丁寧かつ分かりやすく教えていただき、ありがとうございます。 確かに、この教えていただきました方法だと 条件付き書式で設定した色を後から変更されないのですね。 いろんな場面で役に立ちそうです。 ありがとうございます。 ただ私が色を付けたいセルというのは、G列、Q列、R列、S列、T列、U列でして、それも数千行とあります。 すべての行に色をつける訳でもなく、先に挙げたすべての列に色をつける訳でもないという状況です。 いくつか一括で色を付けることもあります(10セル以上など)。 主に、 列ごとの上の方に、(見出しとして)やるべき作業が書いてありまして、作業を達成したら、 その列の一つのセルに日付を書いて黄色(だいたい使う色は黄色)で塗るというようなイメージを持っていただくとわかりやすいかもしれません。 色をつけるときはセルを選択して(複数選択することもあります)、色をつける(【塗りつぶしの色】ボタン)という手動でやるのですが、 やはり毎回条件付き書式で色を「=TRUE」数式で設定するしかないのでしょうか? もしできるのでしたら、ホームタブの【塗りつぶしの色】ボタンだけで色を付けられて、 「アクティブセルの行の色」より優先されるようなことができるととても効率的だと思うのですができますでしょうか。 また、元々色がついているセル(条件付き書式から色を「=TRUE」数式で設定したセルではなく、【塗りつぶしの色】ボタンで色をつけたセル)を、一度選択してしまうと色が塗りつぶしなしの状態になってしまうのですが、 これを「元々の色を維持し続ける」ということは難しいでしょうか。 (【条件付き書式で色を「=TRUE」数式で設定されているセル】と違い、後から自由に色は変更できる状態。) もしここまでの条件を満たす方法があるのならば、 どうか教えていただきたいです。 (↑上記の説明も、かなりわかりにくい部分があると思いますので、分からないところはぜひご指摘いただきたいです。)

a-kuma3さんのコメント
>> (↑上記の説明も、かなりわかりにくい部分があると思いますので、分からないところはぜひご指摘いただきたいです。) << いえ、言われていることは、とてもよく分かります。 回答に追記しました。

ヘンリさんのコメント
a-kuma3 さんへ 私の説明をご理解いただきまして、 いつもありがとうございます。 さっそく変更していただいたコードを実装させていただきました。 これはまさに自分がしたかったこと!という所まで実現していただいて感謝です。 いろいろ試していたら、 たった一つだけ気になることがあったのでどうか書かせてください。 一度【塗りつぶしなし】を選んでしまうと、 「塗りつぶしなしを色と見なして」しまい、塗りつぶし状態のセルが最優先されてしまうようです。 (アクティブセルの行用の色(COLOR = 16764108)が塗られないのです。) ですので、 アクティブセルの行に【塗りつぶしなし】のセルが含まれている場合は、 常に【アクティブセルの行用の色(COLOR = 16764108)】の方を優先するようにしていただけないでしょうか? 今回もわかりにくい部分がありましたら、どうかご指摘をおねがいいたします。

a-kuma3さんのコメント
>> 一度【塗りつぶしなし】を選んでしまうと、 「塗りつぶしなしを色と見なして」しまい、塗りつぶし状態のセルが最優先されてしまうようです。 << 対応してみました。回答に追記していますので、確認をしてみてください。

ヘンリさんのコメント
a-kuma3 さんへ 毎回希望通りの対応をしていただきまして、ありがとうございます。 今回も完璧に動作してくれました。 ありがたいです! 後は、 離れたセル(飛び飛びのセル)にも同時に色をつけたい(塗りつぶしをしたい)と思っているのですが、 これはやはり難しいでしょうか。 今ですと、同じ列において 離れたセルを選択して塗りつぶしをすると、上の方のセル(複数の連続したセルのひと塊)だけ色がつく状態です。 ここから 選択したセル全てを一括で塗りつぶしたいと考えているのですが、 もし解決法が分かりましたら教えていただきたいです。 無理難題でしたら、申し訳ございません。

a-kuma3さんのコメント
>> 選択したセル全てを一括で塗りつぶしたいと考えているのですが、 もし解決法が分かりましたら教えていただきたいです。 << 実は、やりかけてて、それっぽく動くのはできたんですが、行のコピペをするとフリーズしてしまう、という、致命的な欠陥が解決できなくて。 うーん、ってなってます (´・ω・`)

ヘンリさんのコメント
a-kuma3 さんへ その心遣いがありがたいです。 どうか無理はなさらずに、ご自身の生活のペースを再優先にしていただき、 もしその合間に達成できた暁には、 この解答欄かコメント欄にて教えていただきたいです。 いつもお付き合いいただきまして、ありがとうございます。

a-kuma3さんのコメント
できたかも <tt>:-)</tt> 回答に追記しました。 >> どうか無理はなさらずに、ご自身の生活のペースを再優先にしていただき、 << 大丈夫ですよん♪ お気遣い、どうもです。

ヘンリさんのコメント
a-kuma3 さんへ ありがとうございます。 毎回見やすくコード表示していただき、そのままコピーして使うことができるので とても助かっております。 もっさりした感じもまったくないです。 今まで通り動いていると思います。 同じ行のA列とC列など、同一の行なら離れたセルにも一括で色が付きますね。 ありがとうございます。 ただ 同じ列(一つの列)においてなのですが、 離れたセルに色をつけると、 (違うセルを選択した瞬間に)一番上のセル以外は色が塗りつぶしなしの状態に戻ってしまいます。 ここだけはやはり難しいところでしょうか。 もし可能なら、よろしくお願いいたします。

a-kuma3さんのコメント
>> 同じ列(一つの列)においてなのですが、 離れたセルに色をつけると、 (違うセルを選択した瞬間に)一番上のセル以外は色が塗りつぶしなしの状態に戻ってしまいます。 << あれえ、ぼくんとこでは、正しく動いてるっぽいんですけどね。 例えば、こんな感じですよね? +C5 のセルが選択されてる ―― 5行が背景色になってる。 +ctrl キーを押しながら、C9 をクリック ―― 9行も背景色になる +ctrl キーを押しながら、C11 をクリック ―― 11行も背景色になる +セルに背景色をつける ―― 選択済みの C5、C9、C11 の背景色が変わる +別のセル、例えば B2 をクリック ―― 2行が背景色になって、5、9、11行の背景色が解除される で、C5、C9、C11 の背景色は、つけた色が残ってる。 試しているのは、Excel2010 なんですけど、こんな辺りの動作が変わるとは、思えないんですけどねえ...

ヘンリさんのコメント
a-kuma3 さんへ 私の勘違いでした! せっかく考えてくださったのに申し訳ございません。 一個一個冷静に作業したら(とは言っても教えていただいたコードのコピペですが)、 理想通りに動いてくれました。 たぶんですが、 「ループの回し方を変えてみました。」のコードの一個前のバージョンを貼り付けてしまったのだと思います。 「試しているのは、Excel2010 なんですけど、こんな辺りの動作が変わるとは、思えないんですけどねえ...」 そうですよね。 Excel2013でも、同じことが言えると思います。 重ね重ね失礼いたしました。 そしてそれ以上にありがとうございます。

a-kuma3さんのコメント
どかどかコードを貼り付けてしまったので、分かりにくくなって、すみませんでした。 なんとか希望されてるものに、近いものになって、ホッとしました <tt>:-)</tt> どうでも良いことですが、VBA って、苦手で。 できれば、一生、触らずに済ませたいんですが、そうも行かないというか、便利な場面があることが分かってるだけに、たまにいじります。 今回は、ぼくも、良い勉強をさせていただきました。 加えて、過分なポイントをいただき、ありがとうございました。

ヘンリさんのコメント
a-kuma3 さんへ いえ、とても分かりやすいコードの書き方(背景が黒のスペースにコードがまとまって書かれているので)ですよ。 しかもまさに理想通りの動作をしてくれるコードで、とても嬉しいです! a-kuma3さんがVBA苦手って、すごく謙虚ですね。 能ある鷹は爪隠す、と言いますかなんか凄すぎて単純に尊敬してしまいます。 もし、また自分を見かけることがありましたら今後ともよろしくお願いいたします。

2 ● かずきち。
●0ポイント

なんかもっとこんな難しいことしなくても条件付きセルにして、値があったら色をつけるとかの設定がありますよ。
「条件付きセル」ですね。
osはwindowsってことでいいですか?


ヘンリさんのコメント
かずきち。 さんへ ご回答いただきまして、どうもありがとうございます。 はい、Windowsです。 条件付きセルというのは、【条件付き書式】のことでしょうか。 いろいろなご意見をお聞きしたいと思っていますので、 もしよろしければさらに具体的な説明をよろしくお願いいたします。

a-kuma3さんのコメント
回答履歴を見てみれば、どんな回答をする人なのか、分かりますよ <tt>:-(</tt>

ヘンリさんのコメント
なるほど、なんとなくわかった気がします。 なんかありがとうございます!!

かずきち。さんのコメント
ここがいい例だと思います。 http://www.becoolusers.com/excel/conditional-formatting-fx.html

ヘンリさんのコメント
かずきち。 さんへ 参考URLを教えていただきまして、ありがとうございます。 条件付き書式は使う場面も多いと思いますので、 知ってると何かと役に立ちそうですね。 私の場合ずっと使わないと、条件付き書式の書き方って意外と忘れてしまうので 今後のためにブックマークさせていただきました。 ありがとうございます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ