こころマクロ、組み合わせセットのステータスを並べ替えられるようにして以来、ダブルクリックでの並べ替えが楽しくて、ついつい並べ替えしているうちに次の思いが芽生えてきました。「カラースケールだと微妙な差がわからん・・・」。Excelは2007以降、条件付き書式が超絶強化され、2003以前は背景色4色までしか指定できなかったのが、フルカラーの指定が可能に。それどころかセルの中にグラフを表示するデータバーまで実装され、もう大抵の表現は条件付書式で行けてしまうのではと、当時歓喜したことを思い出します。しかも描画もめっぽう速いのです!そんなデータバーであれば、微妙なステータスの差も可視化できるのではなかろうと思い付いてしまったが最後、実装したくて仕方なくなってしまい、平日にもかかわらず早起きしてプログラミング、あぁーほんと楽しい!
ちょっとハマってしまったのが、現在設定している条件付き書式カラースケールの色取得。最小値と最大値にそれぞれ色指定をしていて、例えば「ちから」であれば赤系統、HPであれば緑系統、などステータスを想起できるように手動かつ入念に色指定しています。マクロでそれらを書き換えることになるので、ちゃんと戻せるように、というよりマクロで指定できるように、現在の色を取得しておきたいところ、なかなかうまくいかなかったのですが、結論から書くと、こんな感じでした
1 2 3 4 5 6 7 8 |
Sub 条件付き書式のカラースケール設定色を取得() For i = 13 To 22 '1が最小色、2が最大色 Debug.Print Cells(5, i).FormatConditions(1).ColorScaleCriteria(1).FormatColor.Color Debug.Print Cells(5, i).FormatConditions(1).ColorScaleCriteria(2).FormatColor.Color Debug.Print Cells(5, i).FormatConditions(1).Type Next i End Sub |
FormatConditionsプロパティが常に配列となるのがミソですね。ステータスのセルは条件付きを1種類しか指定していないのですが配列となっていてここで躓きました。結果、FormatConditions(1)と決め打ちでOK。複数の条件を設定している場合は、FormatConditions.count分、ループで回す必要がありますね。そして、肝心のセット部分はこのように、Rangeと色を引数にしてCallするサブプロシージャとして実装しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub データバー(a As Range, B) '対象セル、色 a.FormatConditions.Delete With a.FormatConditions.AddDatabar .BarColor.Color = B .BarFillType = xlDataBarFillSolid .PercentMin = 10 .PercentMax = 100 End With End Sub Sub カラースケール(a As Range, B) '対象セル、色 a.FormatConditions.Delete With a.FormatConditions.AddColorScale(ColorScaleType:=2) .ColorScaleCriteria(1).FormatColor.Color = 16777215 .ColorScaleCriteria(2).FormatColor.Color = B End With End Sub |
データバーは、横棒グラフの開始位置、終了位置を指定することができ、.PercentMin = 10 は、セルの左10%幅からグラフを開始という指定、値が最小の場合セル幅の10%がグラフとして描画されることとなります。同様にして、PercentMax = 100 で、最大値の場合セル幅いっぱいにグラフが描画されます。
切替は動的に行いたく、例によってステータス欄の上部をダブルクリックすると切り替わるようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim kokoro As String Dim Myrtn Dim Kekka As Variant Dim i, j As Long With Target kokoro = Cells(.Row, .Column).Value If kokoro <> "" Then If (.Row >= 5 And .Row <= 105) And ((.Column >= 2 And .Column <= 9) Or .Column = 29) Then Call 詳細表示(kokoro, Target) ElseIf (.Row = 3 And .Column >= 10 And .Column <= 12) Or (.Row = 4 And .Column >= 13 And .Column <= 26) Then 'ソート 'セルを反転 .Font.Color = 19044 .Interior.Color = 65535 'セルの値を格納 Kekka = Range("B5:AA104") '明示的な配列にコピー(ソート用) Dim Kekka2(1 To 100, 1 To 26) For i = 1 To 100 For j = 1 To 26 Kekka2(i, j) = Kekka(i, j) Next j Next i 'クイックソート Call ArraySort(Kekka2, 1, 100, .Column - 1) '降順に書き戻し For i = 1 To 100 For j = 1 To 26 Kekka(i, j) = Kekka2(101 - i, j) Next j Next i 'セル反転を戻す Range("B5:AA104") = Kekka .Font.Color = 65535 .Interior.Color = 19044 ElseIf .Row = 3 And .Column >= 13 And .Column <= 22 Then 'ソート 'セルを反転 .Font.Color = 19044 .Interior.Color = 65535 Call 条件付書式表示変更 'セル反転を戻す .Font.Color = 65535 .Interior.Color = 19044 End If Cancel = True End If End With End Sub |
このダブルクリックのインターフェイス、私、大好きなのです。次が「結果」シートモジュールのイベントプロシージャです。
1.こころの詳細画面表示
2.ステータス昇順にこころセットデータを並べ替え
3.表示の切り替え(カラースケール<>データバー)
の3種類の処理を、ダブルクリックしたセルであるTargetの行番号、列番号で判断し、分岐させているわけです。
さあ、こんな感じで実装した、カラースケールとデータバーの表示、わかりやすくなったでしょうか。
綺麗と言えば綺麗なのですが、カラースケールのほうがわかりやすい気がしてきた・・・・
コメント
お疲れ様です
ややや!見やすいです!寧ろスコアもグラフの方が、ソート後に見やすいケースもありそうですね。
グラフはやはりminをゼロではなく今回の様に実数引用が見やすいです
自分なんかは、最小値ゼログラフにしてしまっていましたが、10%表記は見てみて、見易かったです。
あとは、ネイティブアプリと違いエクセルならではで、好きな箇所のセル幅を自分で好きなだけ大きくすれば、より直感的に見れます。
副産物で、例えばバトマスで、ほぼ絶対関係の無い魔力が、最強セットの時にグラフが短いと、『あぁ、コスパとしても無駄なく最強だ!』が実感できますw
ソース拝見しましたが・・・見たこと無いコマンド多々www
例えば、更に各要素トップテンや偏差値いくつ以上に入るところは更にフォントカラーを赤く・・・ いや、何でもありませんwww