Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Excel 2021)
Excelでセルの塗りつぶしを判定する関数はないでしょうか?
投稿日時: 25/03/19 08:27:22
投稿者: suekunx

お世話になっております。
Excelの条件付き書式で塗りつぶしのあるセルに対して処理を行いたいのですが
セルの塗りつぶしがされているかどうかを判定する関数はないでしょうか?
よろしくお願い申し上げます。

回答
投稿日時: 25/03/19 09:30:52
投稿者: Suzu

Excel 4.0マクロ関数 GET.CELL関数 を使えば 背景色の色を取得する事ができます。
 
ただし、マクロ扱いとなりますから、xlsm 等で保存が必要です。
 
[Excel]セルの背景色や文字色を数値コード化する
https://qiita.com/mitama/items/d8be114ff3d984478517
 
Microsoft Excelで色付きセルをカウントする6つの方法
https://jp.indeed.com/career-advice/career-development/how-to-count-colored-cells-in-excel
 
 
背景色なら、     GET.CELL(63,〜〜)
背景のパターンなら、 GET.CELL(13,〜〜)
 
で良いでしょう。
 
 
引用記事では、数式の中で
=GET.CELL(63,〜〜) + NOW()*0
の様に、『+ Now() * 0』 を入れている部分があります。
 
これはセル塗り潰しがされたら、すぐに関数の結果に反映される様にする為と思われますが、
当方の環境では、 +Now()*0 を入れても 背景色変更 に すぐ 反応してくれませんでした。
 
ですので、入れなくとも良いかと。。
 
条件付き書式 に適用してもすぐには反応しませんので、
再計算を行う必要があります。
 
また、xlsm として保存する必要があります。
 
それなあ、VBAの方が良いと思ってしまいます。
 
標準モジュールに
 
Function ISPATTERND(c As Range) As Boolean
  ISPATTERND = c(1).Interior.Pattern <> xlPatternNone
End Function
 
とでもして
 
セルで
=ISPATTERND(B3)
の様にすればよいかと。
 
それなら、条件付き書式を使うのでなく、初めからVBAというのも選択肢でしょうかね。

投稿日時: 25/03/19 09:40:47
投稿者: suekunx

Suzu様
 
ご回答ありがとうございます。
確認してみます。
やはり、マクロを使用せずには難しいということでしょうか?

回答
投稿日時: 25/03/19 09:41:48
投稿者: んなっと

●VBAが使える環境なら...
 標準モジュールに
Function GetColor(r As Range)
  GetColor = r.Parent.Evaluate("CColor(" & r.Address & ")")
End Function
Private Function CColor(r As Range) As Boolean
  CColor = (r.DisplayFormat.Interior.ColorIndex <> xlNone)
End Function
→シートに戻って
=GetColor(A1)
 とか
=IF(GetColor(A1),"要検討","")
 のような数式
→マクロ有効ブック(*.xlsm)で保存
 
●よくある回答は、塗りつぶしの条件式をつかって
=IF(塗りつぶしの条件式,   )
 という数式を使えばいいというものです。
 複数の条件付き書式が設定されている場合は
=IF(OR(条件式1,条件式2,...),  )となり面倒ですが。

回答
投稿日時: 25/03/19 09:47:45
投稿者: sk

引用:
Excelの条件付き書式で塗りつぶしのあるセル

引用:
セルの塗りつぶしがされているかどうかを判定する関数はないでしょうか?

そのようなワークシート関数はありません。
Excel 4.0マクロ関数でも「条件付き書式によって適用された書式」に
関する情報を取得することは不可能です。
 
例えば「 VBA でユーザー定義関数を作る」という方法が考えられますが、
「評価対象となるセル自身に適用された書式」ならともかく
「条件付き書式によって適用された書式」に関しては以下の制限があるため、
「ワークシートのセルから呼び出すこと」を使用目的として
そのようなユーザー定義関数を作成することも出来ません。
 
Microsoft Learn: Range.DisplayFormat プロパティ (Excel)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.displayformat
 
「塗りつぶしのあるセルに対する処理」というのが
具体的にどのようなものなのかが不明ですが、
他の手段やアプローチを検討された方がよいでしょう。

回答
投稿日時: 25/03/19 10:07:43
投稿者: sk

んなっと さんの引用:
GetColor = r.Parent.Evaluate("CColor(" & r.Address & ")")

なるほど、この方法は目から鱗。

回答
投稿日時: 25/03/19 10:33:47
投稿者: んなっと

海外サイトのパクリです。

投稿日時: 25/03/19 11:19:42
投稿者: suekunx

GET.CELLを使用してみましたところ
名前の定義では、正常に動作するのですが
条件付き書式でルールの欄に入力すると
「その関数は正しくありません」となり使用することができません。
条件付き書式の中では、無理ということでしょうか?

回答
投稿日時: 25/03/19 11:59:28
投稿者: Suzu

条件付き書式 の 条件式 に 直接 GET.CELL を使った と言う意味であれば、
それは有効な 関数とみなされずに 「関数は正しくありません」となったのでしょう。
 
Excel 4.0マクロ関数 は 、本来、Excel 4.0 マクロ シートで使用します。
それを、普通のワークシート上でも使用できる様にするために、
名前の定義 を使って 定義して使える様にしています。

投稿日時: 25/03/19 12:03:20
投稿者: suekunx

Suzu様、皆様
 
ありがとうございます。
条件付き書式で、使用するのが目的だったので
今回は別の方法を考えたいと思います。
ご丁寧なご説明ありがとうございました。