[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『条件付き書式で色を設定( 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 >
それだと最大値ならの条件になりますので
最大値...なおかつ条件の、最小値を除外して最大値の標準化変量が1.2倍以上ならが必要になります
よろしくお願いします。
(あみな) 2023/03/14(火) 12:00:24
(ami) 2023/03/14(火) 12:07:21
|[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
条件書式の数式に入れました。
数式へ=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.