この記事はMicrosoft Power BI Advent Calendar 2022に参加しています。
使用しているPower BIは2022/12/15時点の最新バージョンです。
ISFILTERED
ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。
どういう動きをするか見ていきましょう。
検証で利用するデータセット
Power BIの神Takeshi Kagataさんが作成したサンドボックスのデータを利用させていただきました。
ファクトが1つ、ディメンションが4つのスタースキーマです。


ISFILTEREDの検証
ISFILTEREDの動作を検証するために、ディメンションテーブルをISFILTEREDの引数にしてみましょう。
今回利用するPersonsテーブルは社員と所属のIDと、それぞれの表示名で構成されています。

メジャーは以下の通りです。
ISFILTERED所属 = ISFILTERED('Persons'[所属])
Personsテーブルから所属の列をISFILTEREDの引数とします。
このメジャーをレポートページに置いただけではFalseになります。

スライサーの場合
所属のスライサーをページに追加して大阪支社を選択してみます。
大阪支社が選択されるとメジャーはTrueになりました。
ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。
ここではISFILTEREDの引数にした所属フィールドが直接フィルターされたため、Trueになります。

次に同じPersonsテーブルから所属に変わり氏名をスライサーに設定し、加藤さんを選択してみます。

メジャーはFalseのままです。
ISFILTEREDは、指定されたテーブルまたは列が直接フィルター処理されている場合にTRUEを返します。
この場合、加藤さんの所属は東京支社ですが、氏名のスライサーで所属列が間接的にフィルターされているためメジャーはFalseとなります。

階層化したスライサーの場合
Personsテーブルから所属と氏名をスライサーに階層化して配置します。
所属が上位、氏名が下位です。

氏名から松沢さんを選択してみましょう。

メジャーはTrueになりました。
先ほどの加藤さんを選択した時とは異なる結果ですが、これは階層化したスライサーで下位の氏名を選択した結果、上位の所属も選択されているためです。

所属にフィルターを掛けたメジャーと同じテーブルビジュアルに置いた場合
[ISFILTERED所属]を以下のメジャーと同じテーブルビジュアルに配置してみる。
所属を大阪支社でフィルター = CALCULATE([数量合計],'Persons'[所属]="大阪支社")

Falseのままです。
ISFILTEREDは同じビジュアルに配置された他のメジャー内で使われているフィルター式には反応しません。
他のビジュアルから相互作用でフィルターされた場合
他のビジュアルで所属を含む行が選択された場合を見てみましょう。

[ISFILTERED所属]はTrueになりました。
所属を含むテーブルビジュアルで行が選択されているため、相互作用で直接所属列がフィルター処理されています。
同じテーブルビジュアルにISFILTEREDの引数で使った列を置いた場合
同じテーブルビジュアルの中にメジャーと所属列を配置します。

テーブル内は所属列でビジュアル内でフィルターが掛かっているためTrueになりますが、総計はテーブル内に配置された列のフィルターは関係無くなるためFalseとなります。
スライサーでフィルターを掛けた場合、総計はどうなるでしょう?

この場合、ビジュアルの相互作用で総計にも所属列がフィルター処理されるため、[ISFILTERED所属]はTrueになります。
応用編 : ISFILTEREDでスライサーを利用してビジュアル上で動的にカテゴリを振り分ける
ここでは以下の図で、右のスライサーで選択した項目のみを集計対象YESとして縦棒グラフで動的にカテゴライズしている方法を説明します。

スライサーで選んだ項目だけを計算する
まずスライサーで選んだ項目だけを計算するメジャーを作る必要があります。
計算式は以下の通りです。
集計対象YES = IF(ISFILTERED('Persons'[所属])||ISFILTERED(Persons[氏名]),[数量合計],BLANK())
メジャー集計対象YESの解説
ISFILTERED('Persons'[所属])とISFILTERED(Persons[氏名])をOR条件の論理演算子||で繋いでいます。
こうする事で、所属と氏名のどちらかをスライサーで選ぶとTrueを返すようになります。
後はTrueであれば[数量合計]を、FalseであればBLANK()を返せばスライサーで項目を選択した時のみ[数量合計]が表示されます。

スライサーで選んでいない項目だけを計算する
次は先ほど作成した[集計対象YES]のメジャーを利用して、スライサーで選んでいない項目だけを計算するメジャーを作ります。
計算式は以下の通りです。
集計対象NO = CALCULATE([数量合計],REMOVEFILTERS(Persons[所属]),REMOVEFILTERS(Persons[氏名]))-[集計対象YES]
メジャー集計対象NOの解説
まずREMOVEFILTERSで[数量合計]からPersons[所属]とPersons[氏名]のフィルターを外します。
こうする事でスライサーで選択された所属と氏名のフィルターを無視して[数量合計]が算出されます。
後は算出された値をメジャー[集計対象YES]でマイナスすれば、[集計対象YES]を除いた差分が算出されます。

まとめ
ISFILTEREDは引数で指定したテーブルや列が直接フィルター処理されている必要がある
間接的なフィルターでは動作しません。
行コンテキストの範囲を考えよう
テーブルビジュアルでもグリッド内と合計ではフィルターの掛かり方が違います。
やりたい事に対して想像力を膨らまそう
用意されていない機能でも工夫で何とか出来る場合もあります。
フィルターの状況に応じて動くDAX関数はISFILTEREDの他にもFILTERS、HASONEFILTER、HASONEVALUE、ISCROSSFILTERED、ISINSCOPE等があります。
一通り目を通して実際に触ってみると、実務で生かせる何かが見えてくるかもしれません。