条件付き書式のどの条件が成立しているか | |
---|---|
[195838] 条件付き書式のどの条件が成立しているか- ■親トピック/記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/07(07:21)) □U R L/ お世話になります。 アルやりたいことが起きたので、昔windowsXPで使っていたexcel2003を立ち上げました。 全く何十年振りで、命令も思い出せないので、取り敢えずサンプルを作ってみたのですが、 タイトルの通り、どう書けばいいかで止まっています。 条件付き書式で条件を3個書いていますが、 現在、何番目の条件が成立しているのかを調べたいのです。 その結果でやることを分岐させたいのです。 また、条件付き書式を設定しているセルが1個なら、同じ条件を書けば解決ですが、 設定セルは複数あり、それぞれ全く条件が違います。 共通は条件が3個というだけです。 なので、「同じ条件を調べれば」というのは使えません。 いろいろ調べたつもりですが、分かりませんでした、 昔は結構やっていたので、ヒントでも貰えば調べられると思っています。 宜しくお願いします。 なお、exceは2003ですが、osはwindows10です。 ++++++++++++++++++++ OS ⇒OTHER Version⇒Excel 2003 ++++++++++++++++++++ |
[195839] Re[1]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 匿名 -(2023/08/07(10:00)) □U R L/ 「Excel VBA 条件付き書式の取得」 で調べてみて下さい。 |
[195840] Re[2]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/08/07(10:23)) □U R L/ 長年、回答案を見ていますが、条件付き書式を網羅的に解明できた人はいません。 (勘違いしている人はパラパラいます) そもそも、網羅的な解明が必要になることも稀なんで、トライする人が絶対的に少ない。 難度の高さと必要性の兼ね合いを考えると、コスパが悪すぎる作業ですからねぇ・・ そんな事情なので、難度を下げる為、 先ずどんな条件付き書式が設定されているのか全部書き出して見るのがいいと思います。 その現実的な範囲内で対策を考えればいいのであれば、少しは楽になります。 条件付き書式は、RangeオブジェクトのFormatConditionsプロパティに3つのITEMとして入っているので それぞれ、Type、Operator、Formula1、Formula2を書き出せば、何かピンとくるものがあると思います。 条件が真であるかどうかは、EVALUATE関数で調べられると思います。 |
[195841] Re[3]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 匿名 -(2023/08/07(12:13)) □U R L/ 先ほど、 「Excel VBA 条件付き書式の取得」 で調べてみて下さい。 と回答した物です。 上記で検索した結果見つかったサイトを見ながら、 以下のようなサンプルコードを作成しました。 私も、やったことなかったので、 上記で調べて「これならできる」と思ったのですが、 実際に動作確認をせずに回答してしまいました。 申し訳ありません。 なので、試しに作ってみました。 以下のサンプルコードは、 「指定の値を含むセルだけを書式設定」 「次の値に等しい」 の条件付き書式の物ですが、 条件付き書式の種類によってどうするかを コード追加していけば可能かと思います。 'A列の条件付き書式の何番目の条件に当たるかを表示する。 'サンプルの為、一致する条件がない場合は考慮していない。 'Excel2003の動作環境がないので、動作確認はWin10、Microsoft365 Sub Sample() Dim fcs As FormatConditions Dim fc As FormatCondition Dim lngRow As Long Dim cnt As Long For lngRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row Set fcs = Range("A" & lngRow).FormatConditions For Each fc In fcs cnt = cnt + 1 If CStr(Mid(fc.Formula1, 2)) = CStr(Range("A" & lngRow).Value) Then Debug.Print cnt & "番目の条件と一致しています" Exit For End If Next cnt = 0 Next lngRow End Sub 半平太様の仰る勘違いだとしたらすみません。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195842] Re[4]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/07(14:53)) □U R L/ 匿名さん、半平太さん、お世話になります。 早速の回答ありがとうございました。 半平太さん そうですか、難しそうですね。 説明頂いたformatcondition、難しいです。 というよりも、私のレベルでは理解不能に近いです。 匿名さん コードまで、ありがとうございました。 単純にコピーして動かしましたが、 何も出ずに終わってしまいました。 多分、私の条件付き書式が想定と違っていたのかと。 >「指定の値を含むセルだけを書式設定」 が分かっていません。 半平太さんが言われるように、 ホンの一つだけですが、実際の内容を以下に書き出します。 これで再度教えて頂ければ嬉しいです。 色々ある中の一つの例です。 以下のような設問があります。 「あなたの血糖値を教えてください。」 これに対し、回答者は回答をB3(ここに条件付き書式が在ります。)に入力します。 B3の条件付き書式です。 条件1 値が69以下 水色 条件2 値が70から109 色なし 条件3 値が110以上 赤色 このようなパタンが健康調査グループ毎に数個ずつ存在しています。 そしてここからですが、 この結果シートを見て、それぞれのグループ毎に条件1、条件2、条件3をカウント、 最終評価をする、というシステムです。 各セルの色をカウントできれば簡単なのですが、 条件付き書式で付けた色は単純に参照できないということで、 今回の質問に至っています。 今回の例、血糖値についてだけでいいので、 具体的なコードを教えて頂ければ、道が開けると思います。 長くなりましたが宜しくお願いします。 ++++++++++++++++++++ OS ⇒OTHER Version⇒Excel 2003 ++++++++++++++++++++ |
[195843] Re[5]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ MK -(2023/08/07(15:41)) □U R L/ 横から失礼します。 >Debug.Print cnt & "番目の条件と一致しています" >単純にコピーして動かしましたが、 >何も出ずに終わってしまいました。 ht tps://tonari-it.com/excel-vba-debug-print/ |
[195844] Re[6]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ ひみつのめも -(2023/08/07(16:03)) □U R L/ 昔のエクセルファンクラブの回答をメモしておいたものです '対象セルの表示カラー値(RGB値)を取得する。 'ここで言う表示カラーとは塗りつぶし色、または、条件付書式によって表示 されている色のこと。 'セルに条件付書式が設定されていなかった場合は、セルの塗りつぶし色を返 す。 ' '引数 ' aCell : 対象セル(必ず単一のセルを指定すること) ' '戻り値 ' 表示カラー値(RGB値) ' ' By Meighth h ttp://www.keep-on.com/excelyou/2000lng4/200005/00050350.txt ' Function GetColorRGB(ByVal aCell As Range) As Long Dim COL As Long, FC As FormatCondition, ConditionOK As Boolean Dim OldRefStyle As Long Dim f1, f2 COL = aCell.Interior.Color 'セル参照形式を R1C1 にする。 OldRefStyle = Application.ReferenceStyle Application.ReferenceStyle = xlR1C1 With aCell.Worksheet For Each FC In aCell.FormatConditions ConditionOK = False '条件付書式の Formula1 と Formula2 を取得 f1 = """": f2 = """""" On Error Resume Next f1 = Application.ConvertFormula(FC.Formula1, xlR1C1, xlR1C1, xlAbsolute, aCell) f2 = Application.ConvertFormula(FC.Formula2, xlR1C1, xlR1C1, xlAbsolute, aCell) On Error GoTo 0 If FC.Type = xlCellValue Then Select Case FC.Operator Case xlEqual If aCell.Value = .Evaluate(f1) Then ConditionOK = True Case xlNotEqual If aCell.Value <> .Evaluate(f1) Then ConditionOK = True Case xlGreater If aCell.Value > .Evaluate(f1) Then ConditionOK = True Case xlGreaterEqual If aCell.Value >= .Evaluate(f1) Then ConditionOK = True Case xlLess If aCell.Value < .Evaluate(f1) Then ConditionOK = True Case xlLessEqual If aCell.Value <= .Evaluate(f1) Then ConditionOK = True Case xlBetween If .Evaluate(f1) <= aCell.Value And aCell.Value <= .Evaluate(f2) Then ConditionOK = True Case xlNotBetween If aCell.Value < .Evaluate(f1) Or .Evaluate(f2) < aCell.Value Then ConditionOK = True End Select ElseIf FC.Type = xlExpression Then On Error Resume Next If .Evaluate(f1) Then If Err.Number = 0 Then ConditionOK = True End If End If On Error GoTo 0 End If If ConditionOK Then COL = FC.Interior.Color Exit For End If Next FC End With 'セル参照形式を元に戻す。 Application.ReferenceStyle = OldRefStyle GetColorRGB = COL End Function この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195845] Re[7]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/07(19:34)) □U R L/ MKさん、ひみつのめもさん、ありがとうございます。 MKさん、debug.printはあまり使いませんがちゃんと分かっています。 匿名さんのコード、 If CStr(Mid(fc.Formula1, 2)) = CStr(Range("A" & lngRow).Value) Then ここに手を入れたらチャンと機能しました。 匿名さん、ありがとうございました。 ひみつのめもさん、凄いです。 チャンと条件付き書式で着けた色が把握できました。 ただ、「数式が」だけで、「値が」の方はエラーになります。 細かく読めていないからで、しっかり読んでみます。 チャンと読めれば、最低限必要なコードも掛けるかなと思います。 もう少し勉強します。 この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[195846] Re[8]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/08/07(20:31)) □U R L/ ひみつのめもさんの参考コードを流用させて頂くと、 こんな感じでしょうか。 ↓ Sub showPriority() Dim target As Range Dim msg As String Set target = Range("B3") 'サンプルとしてB3セルをチェックに行った場合 If target.FormatConditions.Count = 0 Then MsgBox "条件付き書式の設定がありません" Exit Sub End If ret = getPriority(target) If ret = 0 Then msg = "該当なし" Else msg = ret & "番目が該当" End If MsgBox msg End Sub Private Function getPriority(ByVal aCell As Range) As Long Dim fc As FormatCondition, ConditionOK As Boolean Dim OldRefStyle As Long Dim f1, f2 'セル参照形式を R1C1 にする。 OldRefStyle = Application.ReferenceStyle Application.ReferenceStyle = xlR1C1 With aCell.Worksheet cnt = 0 '優先順位を初期化 ConditionOK = False For Each fc In aCell.FormatConditions cnt = cnt + 1 '条件付書式の Formula1 と Formula2 を取得 f1 = """": f2 = """""" On Error Resume Next f1 = Application.ConvertFormula(fc.Formula1, xlR1C1, xlR1C1, xlAbsolute, aCell) f2 = Application.ConvertFormula(fc.Formula2, xlR1C1, xlR1C1, xlAbsolute, aCell) On Error GoTo 0 If fc.Type = xlCellValue Then Select Case fc.Operator Case xlEqual If aCell.Value = .Evaluate(f1) Then ConditionOK = True Case xlNotEqual If aCell.Value <> .Evaluate(f1) Then ConditionOK = True Case xlGreater If aCell.Value > .Evaluate(f1) Then ConditionOK = True Case xlGreaterEqual If aCell.Value >= .Evaluate(f1) Then ConditionOK = True Case xlLess If aCell.Value < .Evaluate(f1) Then ConditionOK = True Case xlLessEqual If aCell.Value <= .Evaluate(f1) Then ConditionOK = True Case xlBetween If .Evaluate(f1) <= aCell.Value And aCell.Value <= .Evaluate(f2) Then ConditionOK = True Case xlNotBetween If aCell.Value < .Evaluate(f1) Or .Evaluate(f2) < aCell.Value Then ConditionOK = True End Select ElseIf fc.Type = xlExpression Then On Error Resume Next If .Evaluate(f1) Then If Err.Number = 0 Then ConditionOK = True End If End If On Error GoTo 0 End If If ConditionOK Then Exit For End If Next fc End With 'セル参照形式を元に戻す。 Application.ReferenceStyle = OldRefStyle getPriority = IIf(ConditionOK, cnt, 0) End Function |
[195847] Re[9]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ なぜ -(2023/08/08(07:22)) □U R L/ なぜ2003を使うのでしょうか 最近のバージョンのExcelで開けば最新の機能が使えます FormatCondition.InteriorとDisplayFormat.Interiorを比較すればどの条件が成立しているかわかりませんか? |
[195848] Re[10]: 条件付き書式のどの条件が成立しているか- ■ / 記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/08(11:27)) □U R L/ 半平太さん、ありがとうございました。 まだ完璧に読めていませんが、少なくとも目的は達成できます。 ひみつのめもさんへのお礼にも書きましたが、 「値が」の方でエラーが出ます。 多分excel2003に機能がないためと思います。 こちらの方はもう少し勉強が必要ですが、終了とさせていただきます。 関係された皆様、お世話になりました。 |
[195849] Re[11]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/08/08(16:22)) □U R L/ >多分excel2003に機能がないためと思います。 フーム、私はもっと古いXL2000でテストして問題なかったので、 その後、XL2003になった時にも仕様の変更があったんでしょうね。 これでやってみてください。 > f1 = Application.ConvertFormula(fc.Formula1, xlR1C1, xlR1C1, xlAbsolute, aCell) > f2 = Application.ConvertFormula(fc.Formula2, xlR1C1, xlR1C1, xlAbsolute, aCell) ↓変更 f1 = Application.ConvertFormula(fc.Formula1, xlA1, xlR1C1, xlAbsolute, aCell) f2 = Application.ConvertFormula(fc.Formula2, xlA1, xlR1C1, xlAbsolute, aCell) なお、XL2007以降は条件付き書式の仕様が大幅に変わったので、全く別の話になります。 |
[195850] Re[12]: 条件付き書式のどの条件が成立しているか- ■ / 記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/08(20:05)) □U R L/ 半平太さん、いろいろありがとうございます。 やってみたところ、 「値が」ではこれまでと変わらず、「サポートしていない」のエラー、 「数式が」では全てが「該当なし」になってしまいました。 ところで、 (全く分からない上での質問になりますが) ワザワザR1C1形式にして、最後に戻していますが、 これは単純なrange形式では書けないコードなのですか。 ついでの質問で恐縮ですが、宜しくお願いします。 |
[195851] Re[13]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ なぜ -(2023/08/09(01:02)) □U R L/ ■条件付書式。数式はR1C1形式で。(検証編) h ttps://blog.goo.ne.jp/end-u/e/e14ca4de34df979bbf6d8a80f09d0b9f |
[195852] Re[14]: 条件付き書式のどの条件が成立しているか- ■ / 記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/09(11:15)) □U R L/ なぜさん、ありがとうございます。 R1C1形式の件、分かりました。 今回のサポートなしのエラーは「値が」で発生しています。 この設定ではアドレスは使わないで別の理由と思っています。 やはり、半平太さんが言われるように、 excel2003だけに特殊な変更があったのかと思います。 |
[195853] Re[15]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ なぜ -(2023/08/09(11:22)) □U R L/ >エラーになります だけではわからん。 どこでどのようなエラー(エラーコードをメッセージ)が発生するのか ちなみに、GetColorRGBは2000年5月のログのものなので、Excel2000でも動く で、 >なぜ2003を使うのでしょうか >>最近のバージョンのExcelで開けば最新の機能が使えます >FormatCondition.InteriorとDisplayFormat.Interiorを比較すればどの条件が成立しているかわかりませんか? こちらに対する回答は? |
[195854] Re[16]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/08/09(12:37)) □U R L/ >「値が」ではこれまでと変わらず、「サポートしていない」のエラー、 >「数式が」では全てが「該当なし」になってしまいました。 あれ? 改悪になっちゃいましたか・・とほほ すると「XL2003になった時にも仕様の変更があった」とは言えないです。 変更は元に戻してください。 さて、条件の判定はEvaluate関数でやっているんですが、 その関数は強力ではありますが、全ての数式文字列を評価できる訳ではありません。 浦島太郎さんのレスから、大して変わったことはやっていないであろうと思ったのですが、 そうでもないのかも知れません。 トラブっているセルの一つを例に、どんな条件付き書式を設定しているのか開示いただけませんか? 以前提示いただいた、 このセルじゃないですよね? ↓ >B3の条件付き書式です。 >条件1 値が69以下 水色 >条件2 値が70から109 色なし >条件3 値が110以上 赤色 |
[195855] Re[17]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/09(14:06)) □U R L/ 半平太さん、お手間を掛けています。 今回のお返事で重大なことが分かりました。 >以前提示いただいた、 >このセルじゃないですよね? 確かにテストはこれではありません。 これは本当にやりたい時の内容でして、 実際にテストさせていただいた条件付き書式は以下の通りです。 <その1> 条件1 式が =C2=D2 書式=緑 条件2 式が =C2<D2 書式=色なし 条件3 式が =C2<D2 書式=赤 です。 そしてこれは期待した通りの結果が出ています。 <その2> 条件1 値が 次の値に等しい セルの値1 書式=緑 条件2 値が 次の値に等しい セルの値2 書式=紫 条件3 値が 次の値に等しい セルの値3 書式=赤 です。 そして、このケースで「オブジェクトはこの、、、サポートしていません」のエラーになります。 <その3> 今回のお返事で、初めてやってみました。 条件1 値が 次の値より小さい セルの値70 書式=青 条件2 値が 次の値の間 セルの値70-109 書式=色なし 条件3 値が 次の値より大きい セルの値109 書式=赤 そして、これは期待通りに機能しました。 (ご指示いただいた修正版のままで戻していない状態です。) 同じ「値が」ですが、どこが違うのでしょうかねえ。 宜しくお願いいたします。 |
[195856] Re[18]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/08/09(15:21)) □U R L/ フーム、修正前に戻してテストしましたが、こちらでは正常終了します。 >条件1 値が 次の値に等しい セルの値1 書式=緑 >条件2 値が 次の値に等しい セルの値2 書式=紫 >条件3 値が 次の値に等しい セルの値3 書式=赤 >です。 >そして、このケースで「オブジェクトはこの、、、サポートしていません」のエラーになります。 この条件付き書式が設定されているセルのアドレスはどこですか? 値は何になっていますか? セルの値1 はどこのセルですか? そこは数式ですか、手入力値ですか? 値は何になっていますか? セルの値2 はどこのセルですか? そこは数式ですか、手入力値ですか? 値は何になっていますか? セルの値3 はどこのセルですか? そこは数式ですか、手入力値ですか? 値は何になっていますか? |
[195857] Re[19]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/09(16:50)) □U R L/ 半平太さん、何回もありがとうございます。 どうも余計な事を書いてしまい、蛇足になってしまいました。 エラーになる<その2>ですが、 >条件1 値が 次の値に等しい セルの値1 書式=緑 のセルの値1は 「セルの値」が蛇足部分で、 セルの値は1というつもりでした。 セルの値 1 のつもりで書いたのですが、間のスペースが飛んでしまいました。 なので、他のセル参照とか、式が入っているとかではありませんで、 単純な数字が入っているだけです。 条件2、条件3も同様です。 申し訳ありませんでした。 ということで、 条件付き書式を設定しているセルはB3、 そのB3の値を入れ替えて色を確認しています。 B3の書式は「標準」も「数値」も変わりなくどちらもエラーになります。 条件付き書式は問題無く色が付きます。 なお、<その3>は修正前後とも正しく機能しています。 お手間を掛けますが宜しくお願いいたします。 |
[195858] Re[20]: 条件付き書式のどの条件が成立しているか- ■記事引用/メール受信=OFF■ □投稿者/ 半平太 -(2023/08/09(17:46)) □U R L/ 事象再現しました! ? evaluate("1") これが「オブジェクトはこのプロパティまたはメソッドをサポートしていません」エラーになる。 古いバージョンの信じられないようなお粗末バグです。 以下に変更してください。 >f1 = Application.ConvertFormula(fc.Formula1, xlR1C1, xlR1C1, xlAbsolute, aCell) >f2 = Application.ConvertFormula(fc.Formula2, xlR1C1, xlR1C1, xlAbsolute, aCell) ↓ f1 = Application.ConvertFormula(fc.Formula1, xlR1C1, xlR1C1, xlAbsolute, aCell) f2 = Application.ConvertFormula(fc.Formula2, xlR1C1, xlR1C1, xlAbsolute, aCell) f1 = IIf(Left(f1, 1) = "=", f1, "(" & f1 & ")") '古いバージョンのバグ対策 f2 = IIf(Left(f2, 1) = "=", f2, "(" & f2 & ")") '古いバージョンのバグ対策 |
[195859] Re[21]: 条件付き書式のどの条件が成立しているか- ■ / 記事引用/メール受信=OFF■ □投稿者/ 浦島太郎 -(2023/08/09(19:38)) □U R L/ 半平太さん、凄さが信じられません。 何で、MSのバグまで分かってしまうのか。 お蔭様で完璧に機能しました。 何だかんだお手間を取らせてしまいました。 半平太さんの分析、対応内容が全く見えていませんが、 私の作ったテストケースがたまたまバグに遭ってしまった、 ということなのでしょうか。 それが無ければ、もっと先で発覚、大惨事を招いた? (とまでは大袈裟ですが) お世話になりました。 これで本当にクローズできます。 もう少し勉強してみます。 ありがとうございました。 |
このトピックに書きこむ |
---|