[[20230314103426]] 『条件付き書式で色を設定( VBA可 )』(あみな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『条件付き書式で色を設定( VBA可 )』(あみな)

いつもお世話になります(o_ _)
複数の飛び飛びのセルから、 最小値を除外して最大値の標準化変量を算出し、
最大値の標準化変量が1.2倍以上なら、条件付き書式で色を設定したいです
宜しくお願い致します。
尚、VBAでも可でしたら、ご教授いただければ嬉しいです。

    |[A]
 [1]| 65
 [2]|   
 [3]| 45
 [4]|   
 [5]| 51
 [6]|   
 [7]| 72 ← 色を付ける
 [8]|   
 [9]| 59

【 補足 】

※範囲は固定で数値は5個です
※範囲の数値は、1以上が原則です
※下記の式はイメージです

・最小値を検出する
式1=IF(MIN(A1,A3,A5,A7,A9),MIN(A1,A3,A5,A7,A9),LARGE((A1,A3,A5,A7,A9),RANK(0,(A1,A3,A5,A7,A9))-1))

・平均から最小値を減算し平均値を算出する
式2=SUM(SUM(A1,A3,A5,A7,A9)-IF(MIN(A1,A3,A5,A7,A9),MIN(A1,A3,A5,A7,A9),LARGE((A1,A3,A5,A7,A9),RANK(0,(A1,A3,A5,A7,A9))-1)))/4

・最大値を検出する
式3=MAX(A1,A3,A5,A7,A9)

・最小値を除いた標準偏差を算出する
式4
=STDEV.P(LARGE((A1,A3,A5,A7,A9),1),LARGE((A1,A3,A5,A7,A9),2),LARGE((A1,A3,A5,A7,A9),3),LARGE((A1,A3,A5,A7,A9),4))
入力後、ShiftキーとCtrlキーを押しながらEnterキーで式を確定(確定後、式が{}で囲まれ配列数式に)

最大値の標準化変量を算出する
式5=STANDARDIZE(式3参照, 式2参照, 式4参照)

式1=45
式2=61.75
式3=72
式4=7.725769…
式5=1.326729…

< 使用 Excel:Excel2021、使用 OS:Windows11 >


=A1=MAX($A$1:$A$9)
下へコピー
でどうですか。
(ami) 2023/03/14(火) 11:34:18

(ami)さん...返信をありがとうございます。

それだと最大値ならの条件になりますので
最大値...なおかつ条件の、最小値を除外して最大値の標準化変量が1.2倍以上ならが必要になります

よろしくお願いします。

(あみな) 2023/03/14(火) 12:00:24


>[7]| 72 ← 色を付ける
てすよね。

(ami) 2023/03/14(火) 12:07:21


はい、=A1=MAX($A$1:$A$9)左記の式で確かに
条件付き書式の数式に入れれば、72の値に色を
設定できるのですが、例えば下記のように

    |[A]|[B]   |[C]					
 [1]| 65|変化⇒| 65					
 [2]|   |      |   					
 [3]| 45|      | 45					
 [4]|   |      |   					
 [5]| 51|      | 68					
 [6]|   |      |   					
 [7]| 72|      | 72					
 [8]|   |      |   					
 [9]| 59|      | 54					

A列の範囲の数値が変化して、右[C列]に変化したとしたら
最大値の標準化変量は下がって、1.08になるので
72の値に色が付いては困るのです。( ; ; )

(あみな) 2023/03/14(火) 12:38:45


 あまりよく分ってませんけど....
 ユーザー定義関数を使っていいなら、以下でどうでしょう?

 Function STANDARDIZEex(rng As Range, Optional zoom# = 1.2)
    Dim minV#, maxV#, aveV#, stdevV#, stde#
    minV = Application.Evaluate("MIN(FILTER(" & rng.Address(External:=True) & ",(ISNUMBER(" & rng.Address(External:=True) & ")*(" & rng.Address(External:=True) & "<>0))))")
    maxV = Application.Evaluate("MAX(FILTER(" & rng.Address(External:=True) & ",ISNUMBER(" & rng.Address(External:=True) & ")))")
    aveV = Application.Evaluate("LET(_c,COUNTIF(" & rng.Address(External:=True) & "," & minV & "),_c0,COUNTIF(" & rng.Address(External:=True) & ",0),(SUM(" & rng.Address(External:=True) & ")-" & minV & "*_c)/(COUNT(" & rng.Address(External:=True) & ")-_c+_c0))")
    stdevV = Application.Evaluate("LET(LIST,FILTER(" & rng.Address(External:=True) & ",(" & rng.Address(External:=True) & "<>0)*(" & rng.Address(External:=True) & "<>" & minV & ")*(ISNUMBER(" & rng.Address(External:=True) & "))),STDEV.P(LIST))")
    stde = (maxV - aveV) / stdevV
    If stde >= zoom Then
        STANDARDIZEex = maxV
    Else
        STANDARDIZEex = CVErr(xlErrNA)
    End If
 End Function

 条件式:=A1=STANDARDIZEex($A$1:$A$9)
(まる) 2023/03/14(火) 14:00:41

 条件付き書式に配列は使えなかったきがするから、平均と標準偏差は別のセルに出しておいて
 条件付き書式はSTANDARDIZEだけにしたらどうでしょう?
 B11=AVERAGEIF(A1:A9,">"&MIN(A1:A9))
 B12=STDEV.P(IF(A1:A9>MIN(A1:A9),A1:A9,""))’配列数式
 A1:A9を選択して、条件付き書式
 =STANDARDIZE(A1,$B$11,$B$12)>1.2

     |[A]     |[B]     
 [1] |      65|        
 [2] |        |        
 [3] |      45|        
 [4] |        |        
 [5] |      51|        
 [6] |        |        
 [7] |      72|        
 [8] |        |        
 [9] |      59|        
 [10]|        |        
 [11]|平均    |   61.75
 [12]|標準偏差|7.725769
(稲葉) 2023/03/14(火) 14:08:22

(まる)さん、(稲葉)さん、返信ありがとうございます。
どちらでも出来ました。(今から、数値をいろいろ入替えて確認します)
多分大丈夫かと思います。

(まる)さんへ
ユーザー定義関数を使えばですね…全く忘れていました。
ここで誰かが言ってた、伝家の宝刀 Evaluateでしたか
う〜ん、Evaluate が良く理解していないので勉強してきます。

(稲葉)さんへ
あっ〜なるほどです、別のセルを参照して条件付き書式を入れるのですね。
いっぺんにしようと検討してましたが、ややこしくてどうしたものかと
思っておりました。数式ではお手上げで...

ちなみに、自分でお粗末ながらVBAで今作成しましたが
ボタンをいちいち押さないといけないのが手間なので
いやだな〜と感じておりました。

 Sub 最大値の標準化変量に応じて色付け()							

    Dim ws As Worksheet							
    Dim r As Range, data As Range							
    Dim n(1 To 4) As Long							
    Dim v As String							
    Dim 式2 As Double, 式3 As Double, 式4 As Double, 式5 As Double							
    Set ws = Sheets(1)							
    Set data = ws.Range("A1,A3,A5,A7,A9")							

    '' 最大値を検出する							
    式3 = Application.Max(data)							

    '' 最小値を除いた標準偏差を算出							
    n(1) = Application.Large(data, 1)							
    n(2) = Application.Large(data, 2)							
    n(3) = Application.Large(data, 3)							
    n(4) = Application.Large(data, 4)							
    式4 = Application.StDevP(n(1), n(2), n(3), n(4))							
    '' Debug.Print 式4; '' 7.72576857018122							

    '' 最小値を除いた平均値を算出							
    式2 = Application.Sum(n(1), n(2), n(3), n(4)) / 4							
    '' Debug.Print 式2 '' 61.75							

    '' 最大値の標準化変量を算出							
    式5 = Application.Standardize(式3, 式2, 式4)							
    '' Debug.Print 式5 '' 1.326...							

    For Each r In data							
        If r.Value = Application.Large(data, 1) Then							
            If 式5 >= 1.2 Then							
                '' Debug.Print r.Address							
                v = r.Address							
                ws.Range(v).Font.Color = vbBlue							
                Exit For							
            End If							
        End If							
    Next r							

 End Sub							

どちらかの方法を活用させていただきます。

もしまた疑問が出たら、質問させていただきます。
本当にありがとうございました。

(あみな) 2023/03/14(火) 15:01:23


 >ボタンをいちいち押さないといけないのが手間なので
 Cangeイベントでいいんじゃないかしら?
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim Ave As Variant
        Dim Std As Variant
        Dim r As Range
        If Intersect(Target, Range("A1:A9")) Is Nothing Then Exit Sub
        Ave = [=AVERAGEIF(A1:A9,">"&MIN(A1:A9))]
        Std = [=STDEV.P(INDEX(IF(A1:A9>MIN(A1:A9),A1:A9,""),))]
        With Range("A1:A9")
            .Interior.Color = xlNone
            For Each r In .Cells
                If (r.Value - Ave) / Std > 1.2 Then
                    r.Interior.Color = rgbBlue
                End If
            Next r
        End With
    End Sub

(稲葉) 2023/03/14(火) 15:28:41


 誤:Std = [=STDEV.P(INDEX(IF(A1:A9>MIN(A1:A9),A1:A9,""),))]
 正:Std = [=STDEV.P(IF(A1:A9>MIN(A1:A9),A1:A9,""))]
 ごめんなさい、余計な関数入ってました
(稲葉) 2023/03/14(火) 15:34:01

 >最大値の標準化変量が1.2倍以上なら、条件付き書式で色を設定したいです
 これを見落としていました。
 式5の値を使用する
    |[A]|[B]|[C]|[D]     
 [1]| 65|   |式1|      45
 [2]|   |   |式2|   64.75
 [3]| 45|   |式3|      72
 [4]|   |   |式4|6.684871
 [5]| 68|   |式5|1.084539
 [6]|   |   |   |        
 [7]| 72|   |   |        
 [8]|   |   |   |        
 [9]| 54|   |   |      
 条件書式
 =AND($D$5>=1.2,A1=MAX($A$1:$A$9))
(ami) 2023/03/14(火) 16:22:41

(稲葉)さん、返信ありがとうございます。

イベントで良いですね。選択肢が多くて...どれに
しようか贅沢に悩んでます。(笑)

>誤:Std = [=STDEV.P(INDEX(IF(A1:A9>MIN(A1:A9),A1:A9,""),))]
>正:Std = [=STDEV.P(IF(A1:A9>MIN(A1:A9),A1:A9,""))]

因みに、どちらでもちゃんと動いてますね。
(あみな) 2023/03/14(火) 18:08:02


 名前の定義で配列数式使えないから、配列のように動く数式を検討していた時の名残です・・・
 すみません。

(稲葉) 2023/03/14(火) 18:11:29


(ami)さん、返信ありがとうございます。

条件書式の数式に入れました。
数式へ=AND($D$5>=1.2,A1=MAX($A$1:$A$9))

ちゃんと、色が付いております。
ありがとうございます。

因みに独り言を…
式4ですがわざわざ配列にしなくても返りましたw  (ノ∀`*)ペチ
(あみな) 2023/03/14(火) 18:19:37


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.