Excelでセルの背景色に基づいて値を簡単に合計する方法という記事では、Excelの組み込み機能を組み合わせて、塗りつぶしの色に基づいて値をカウントまたは合計する簡単な方法を紹介しています。この手法は特別な知識は必要ありませんが、限界があります。行内の個々のセルを評価することはできません。フィルタリングは列のみの機能です。さらに、Excelには塗りつぶしの色でセルを直接評価する機能はありません。この記事では、その方法を説明します。これは明確な解決策ではなく、ある程度の知識がなければ、おそらく自分で解決するのは難しいでしょう。覚えておいてほしいのは、レコードではなくセルをカウントしているということです。
参照: Office 365: 技術リーダーとビジネスリーダーのためのガイド (無料 PDF) (TechRepublic)
私はWindows 10 64ビット版でMicrosoft 365を使用していますが、以前のバージョンでも問題ありません。ご自身のデータを使用することも、デモ用の.xlsxファイルをダウンロードすることもできます。(メニュー版のフォーマットも添付していますが、動作が不安定になる可能性があります。)この解決策はブラウザ版には適していません。また、この手法は直接適用された塗りつぶしの色、またはスタイル経由で適用された塗りつぶしの色でのみ機能しますが、条件付き書式では機能しません。条件付き書式を実現するには、スティーブン・ホーキング博士レベルのヘイルメリーパスが必要です。
この記事は、Vic Micallef 氏から寄せられた質問に基づいています。
データと問題
データベースを扱う人なら、フィールド、つまり列で考えます。行はリレーショナルデータベースでテーブルを正規化したり、レポートを作成したりする際に重要ですが、分析は(ほとんどの場合)列で行います。シートは少し異なり、1行内の複数の列にわたる値を評価する必要がある場合があります。Excelはほとんどの場合、このような状況に問題なく対応します。残念ながら、(私の知る限り)行全体のセルの塗りつぶし色で簡単に評価できる組み込み関数や機能は存在しません。先に言っておきますが、データの再構築は必ずしも選択肢ではありません。
さて、図Aのようなシンプルなシートを見てみましょう。ここでは、ランダムにセルが水色で塗りつぶされています。今回の目的からすると、色が何を表すかは重要ではありませんが、条件付きではなく、直接色が適用されている点に注意してください。列内の数値を数えるには、フィルターとSUBTOTAL()関数を使用できます。各行の塗りつぶされたセルを数えるため、少し手間がかかります(とはいえ、それほど難しいことではありません)。
図A
このテーマで検索すると、GET.CELLを使ってフィルタリングと同じことを行うソリューションが見つかります。ただし、注意が必要です。これらのソリューションでは、行(またはレコード)内の個々のセルをカウントしません。例えば、デモシートの塗りつぶし色の青をカウントする場合、行3のカウントは1です。GET.CELLを使って行列を作成し、COUNTIF()を使って各行の特定の塗りつぶし色の番号を返します。
この次のステップは非常に重要ですので、必ず実行してください。.xlsx形式を使用している場合は、ワークブックをマクロ有効ファイルとして保存してください。
GET.CELLの実装方法
CET.CELLは古い関数で、制限事項があります。最も重要なのは、直接参照できないことです。つまり、=GET.CELL(38,C3)と入力してセルC3のカラーコードを取得することはできません。代わりに、名前付き範囲に関数を適用します。次に、私が使用している方法では、行内の隣接するセルのみをカウントできます。データセットと後で作成するマトリックスの間に列を挿入しても関数は機能しますが、1列分ずれてしまいます。さらに、列内の(個々の)塗りつぶされたセルをカウントすることもできません。これは非常に特殊な解決策です。
それでは、GET.CELLを使ってみましょう。以下の手順で、任意のセルの塗りつぶし色を返す名前付き範囲を作成します。
- [数式] タブをクリックし、[定義された名前] グループの [名前の定義] をクリックして、ドロップダウン リストから [名前の定義] を選択します。
- 表示されるダイアログで、ColorCode などの範囲の名前を入力します。
- [参照先] コントロールに、次の式を入力します: =GET.CELL(38,Count!C3)。ここで、Count はシート名、C3 はデータ セットのアンカー セルです (図 Bを参照)。
- [OK]をクリックします。
図B
この時点では、目に見える変化はまだありません。範囲ColorCodeを使用して、塗りつぶされたセルのコードを返します。
カラーコードの使い方
現時点では、データセット内のどのセルの色コードもわかりません。これを解決するために、データセットのすぐ隣に小さな行列を作成します。(データセットと行列の間に空白の列があると、この解決策は誤った結果を返します。)
マトリックスを作成するには、G3 に次の式を入力します。
=カラーコード
37という値を返します。これがC3の塗りつぶしの色コードです。この式をH3:J3にコピーします。図Cに示すように、ColorCodeはセルC3、D3、E3、F3の塗りつぶしの色を返します。これは、ColorCode範囲C3の作成時に使用した参照が相対参照であるため可能です。この参照を絶対参照($C$3)にすると、常に37が返されます。G3:J3を選択し、残りの4つの式をコピーして、図Dに示すマトリックスを完成させます。
図C
図D
行列は動的ではありません。以下の「制限事項」セクションを参照してください。どの行でも、青色で塗りつぶされたセルの数は依然としてわかりません。次にこれについて取り上げます。
カラーコードを数える方法
そのままでは、この行列はデータセット内の各セルの塗りつぶし色コードを返します。COUNTIF() 関数を使えば、各行の青いセルの数を簡単に数えることができます。これを行うには、 K3 に=COUNTIF(G3:J3,37)と入力し、K14 にコピーします。図 Eに示す K 列の値は、対応する行の青い塗りつぶしセルの数です。具体的には、37 は青い塗りつぶしセルを識別し、この関数は対応する行内のそれらのセルのみをカウントします。行 3 には塗りつぶし色が青いセルが 37 の 1 つだけです。行 2 には 2 つのセルがあり、以下同様に続きます。
図E
G3:J3のマトリックスは、おそらく非表示にするか、あるいは目立たないようにする必要があるでしょう。セルを非表示にすると忘れやすくなり、シートのメンテナンスが難しくなるため、通常は非表示にしないことをお勧めします。もしそうであれば、図Fに示すように幅を必要最低限に狭め、塗りつぶしの色を適用してください。
図F
バリエーション
GET.CELLを使うと、多くの情報を取得できます。ここで使用した値38は、セルの塗りつぶしの色を返します。例えば、値を合計するには、範囲を作成する際に38ではなく5を使用します。そして、COUNTIF()ではなくSUMIF()を使用します。GET.CELLを検索すると、リストが見つかります(私が見つけたリストは、Microsoftが現在メンテナンスしていないようです)。COUNTIF()関数でカウントする塗りつぶしコードを変更することもできます。
参照: Excel セルにドロップダウン リストを追加する方法 (TechRepublic)
制限事項
前述したように、いくつかの制限があります。正しく機能するには、マトリックスがデータセットに隣接している必要があります。列内の塗りつぶされたセルをカウントすることはできません。GET.CELLはサポートされなくなったため、いつでも動作しなくなる可能性があります。変更は動的ではありません。塗りつぶしの色を変更したり、ColorCodeを更新したりしても、マトリックスは自動的に更新されません 。どちらの場合も、ColorCodeを再入力する必要があり、面倒です。そのため、これが最も効率的な解決策であるとは確信していません。より良いアイデアをお持ちの方は、下のコメント欄でご意見をお聞かせください。
乞うご期待
このソリューションは非常に手間がかかるため、後続の記事でマクロを紹介します。