アプリ版:「スタンプのみでお礼する」機能のリリースについて

A列に1~100の数値が入力されている時、50.5が中央になります
これを対数で10が中央になるように色分することは出来ますか?
例えば、B列にA列の値の対数値を入力して、B列の値でA列に色付けするでも構いません
何か良い方法は有りますか?

A 回答 (3件)

対数の中央値=((最大値÷最小値)の平方根)×最小値


では、どうでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
この方法だと中央値だけが対数で色付け出来るだけになりますよね。
任意の数値を入力しても対数で色付けしてくれるように出来ないでしょうか?

お礼日時:2022/11/25 14:45

こんばんは



1~100と範囲は固定で良いのでしょうか?

◇ 案(1)
No1様と発想が被っているかも知れませんが・・・
添付図では、
・A列に1~10~100までの値を入力してあります。
・C列は =IF(A1="","",LOG(A1)) をフィルコピーしてLOG値を表示
してあります。

1)A列は条件付き書式で、10を中央値として、黄~緑~青でカラースケールを設定したものです。
2)C列はC列の値に対して、条件付き書式で同様に1を中央値として設定したものです。

ご質問は、「2)の色付けをA列に施したい」という意味と思いますが、1)で代用するという案ではダメでしょうか?
カラースケールなので、正確な色までは求めてはいないだろうという推測に基づく案です。
A列は実際には、1~10、10~100間がそれぞれリニアに(対数ではなく)色が変化しています。
C列は対数値に基づいたカラースケールになっていますが、A列の色で代用できないかというものです。
こちらでも良ければ、普通にカラースケールを設定しておくだけで済みます。


「この微妙な色の違いをキチン出したい」というのがご質問の趣旨であるなら・・

◇ 案(2)
>B列にA列の値の対数値を入力して、B列の値で
>A列に色付けするでも構いません
とのことですが、カラースケールの条件付き書式は自身のセルの値以外を参照することはできないようですので、そのままではうまくいきません。
これを実現する方法の例として、E列にマクロでC列の色をコピーしています。
(添付図では、E列にコピーしていますが、A列にコピーすればご質問の内容になるかと)

こちらの案の場合は、対数を計算しておく列(添付図ではC列)が必要であり、そちらにカラースケールを設定しておく必要があります。
この列が邪魔な場合は、どこか離れた列にしておいたり、列を非表示にしておくことで、見えないようにしておくことは可能です。

マクロ自体は、添付図の場合だと
Sub test()
For Each c In Range("C1:C19")
c.Offset(, 2).Interior.Color = c.DisplayFormat.Interior.Color
Next c
End Sub
と、簡単なものですむのでさほどハードルは高くは無いものと思います。

ご質問のA列の値が、「入力値」であるのなら、A列のChangeイベントを利用することで、いちいちマクロを実行しなくても、あたかも条件付き書式が設定されているかのように、自動で反映できるようになります。


◇ 案(3)
案(2)ではマクロを使っていますので、どうせ使用するならB列の値や色の計算もマクロでやってしまうという案です。

色の変化をどのようにするのかによりますが、連続的な変化を計算する場合HSLの方が扱いやすいのではないかと想像します。
一方で、VBAではHSLをサポートしておらず、RGB計算になりますので、HSLベースで色を調整したい場合には色変換の部分も自前で実装する必要が出てしまいます。
RGBベースで計算できる内容なら、このような手間は不要なので、さほど面倒ではありませんが、HSLベースでとなるとこの辺りが面倒になる可能性があります。

いずれにしろ、こちらの場合は、
 「A列の値が変化したら、対応する色を計算して、そのセルに色を付ける」
という内容のマクロを作成して、イベント等に設定しておけば実現可能になると思います。
「Excel カラースケール 対数で色分し」の回答画像2
    • good
    • 1

No2です。



まったく反応が無いようなので、勝手に・・・

案(3)の方法の例です。
想定として、
・A列に対応
・値が1~100の数値のみに対応(それ以外は無視)
・カラースケールとして、薄いピンク~赤とし、
 1を(255,240,240)、100を(255,0,0)とする。
・セル値の対数に応じて、上記の色を変化させる。

当該シートのシートモジュールに以下を記述しておくことで実現可能と思います。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, col As Long, v
If Intersect(Columns(1), Target) Is Nothing Then Exit Sub
For Each c In Intersect(Columns(1), Target)
col = xlNone
v = c.Value
If IsNumeric(v) Then
If 1 <= v And v <= 100 Then
col = (2 - Log(v) / Log(10)) * 120
col = RGB(255, col, col)
End If
End If
c.Interior.Color = col
Next c
End Sub
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!