「率」を帯グラフ状に表現する。

今回は、ちょっと考えれば気がつく範囲の簡単なアイディアのひとつです。
「率(%)」を隣のセルに帯び状の「バー」で表記してみます。   A3セルの値は0〜100の間の整数」だとします。
そして、B3セルに、A3セルの値に対する帯グラフ状の表記をするのですが、 ここでは、「■」の文字を横に必要個数並べる方法で実現することにします。「記号文字並べでは見栄えが劣る」という方には中段以降に塗りつぶしによる方法も紹介しています。
皆さんは、どのように実現しようと思いますか?
なお、Excel2010以降のバージョンの方法として最後にオチがあります。
「率(%)」のセルは、整数(0〜100)としてみましょう。
率を帯び状のバーで表現
(画像をクリックすると、このページのサンプルがダウンロードできます)
表現方法の初歩的な「案」としては、このようなことなのです。 要は、視覚的に「率(%)」を表現したいということなので、このような「■」の文字を横に必要個数並べる方法でも必要な要件は満たしているわけです。
まずは、これを関数(計算式)で表示する方法を考えてみて下さい。

VBAなら多分岐の判断記述ができるので、要件をそのまま直感的に記述するならこんな感じのコードを書けば良いのです。

'*******************************************************************************
'  「率」を帯び状のグラフで表現
'*******************************************************************************
Sub 率を帯び状のグラフで表現()
    Dim GYO As Long

    GYO = 2
    Do While Cells(GYO, 1).Value <> ""
        ' A列の値によって帯状の「■」の個数を変化させる
        Select Case Cells(GYO, 1).Value
            Case Is < 10:  Cells(GYO, 2).Value = ""                 ' 10%未満
            Case Is < 20:  Cells(GYO, 2).Value = "■"               ' 20%未満
            Case Is < 30:  Cells(GYO, 2).Value = "■■"             ' 30%未満
            Case Is < 40:  Cells(GYO, 2).Value = "■■■"           ' 40%未満
            Case Is < 50:  Cells(GYO, 2).Value = "■■■■"         ' 50%未満
            Case Is < 60:  Cells(GYO, 2).Value = "■■■■■"       ' 60%未満
            Case Is < 70:  Cells(GYO, 2).Value = "■■■■■■"     ' 70%未満
            Case Is < 80:  Cells(GYO, 2).Value = "■■■■■■■"   ' 80%未満
            Case Is < 90:  Cells(GYO, 2).Value = "■■■■■■■■"' 90%未満
            Case Is < 100: Cells(GYO, 2).Value = "■■■■■■■■■"' 100%未満
            Case Else:     Cells(GYO, 2).Value = "■■■■■■■■■■"' 100%以上
        End Select
        ' 次行に進む
        GYO = GYO + 1
    Loop
End Sub
ですが、これを今回は、VBAは使わずに関数(計算式)で対応できないかを考えるわけです。

しかし、関数(計算式)でこれを行なうとなると、

 =IF(RC1<10,"",IF(RC1<20,"■",IF(RC1<30,"■■",IF(RC1<40,"■■■",
     IF(RC1<50,"■■■■",IF(RC1<60,"■■■■■",IF(RC1<70,"■■■■■■",
     IF(RC1<80,"■■■■■■■",IF(RC1<90,"■■■■■■■■",
     IF(RC1<100,"■■■■■■■■■","■■■■■■■■■■"))))))))))
となってしまいます。この式は関数ネストが7レベルを超えてしまうのでエラーになって実現できません。ではどうしましょうか?

LEFT関数で、「■」の表示個数を変える方法で対応
上記のような、多分岐の判断という発想ではなく、文字列操作で切り出す方法ではどうでしょう。 つまり、「率」から「■」の個数を算出してしまうのです。柔軟に考えられれば、すぐに気がつくことなので、あえてページを割いて説明することでもないかも知れません。

 =LEFT("■■■■■■■■■■",TRUNC(RC1/10))
というような式で済んでしまいます。
VBAの場合でも、Left関数やString関数で同様のことができるので、ダウンロードできるワークブックには参考コードを入れてあります。

結果は、
率を帯び状のバーで表現
このように、最初のイメージ通りになります。この例では10%に対して「■」は1個なので10で割った上で、TRUNC関数を併用して端数は切り捨てています。

不足分を「□」で表示して必ず10個を表示させてみます。
たとえば、70%の時に「■■■■■■■」と表示するのではなく「■■■■■■■□□□」と表示させた方が、スケールに頼らずに全体の割合いが視覚的に理解しやすい(30%足りないと判る)ですから、 上のLEFT関数のものから、さらに応用してみましょう。
率を帯び状のバーで表現
こんな感じになります。

この場合の式は、

 =MID("■■■■■■■■■■□□□□□□□□□□",11-TRUNC(RC1/10),10)
このようになります。LEFT関数で表示個数を算出するのではなく、MID関数で「■」10個と「□」10個を並べた文字列から10個を表示させる開始位置を制御する方法です。

「記号文字並べでは見栄えが...」というなら。

セルの「塗りつぶし」による方法をご紹介しましょう。
率を帯び状のバーで表現
こちらの方の方法も、左端の「率(%)」の数字を変更すると、帯状の「バー」の長さが連動して変化する方法です。 記号文字を並べる方法と違い、帯は連続しているので「それらしい」表現になります。

率を帯び状のバーで表現
どうやっているかは、すでに想像されている通り「条件付き書式」を利用してセルを塗りつぶす方法で実現しています。
「条件付き書式」の設定は、このように「帯グラフ」を表示させる範囲全体を選択した状態から1回だけの登録で済ませることができます。
この場合の式は、

 =(COLUMN(RC)-1)*10<=RC1
このようになります。ここでは10%ピッチの10段階ですが、「10%以上なら」「20%以上なら」などと列ごとに別々に「条件付き書式」を設定するのではなく、「列番号」からその列のウェイト(%)を算出してから入力値(%)に対して比較させています。 このサンプルでは第2列(B列)から「帯グラフ」表示が始まるため、列番号(COLUMN関数)から1を差し引いてから10%ピッチの「10」を乗じて入力値(A列)と比較しているわけです。R1C1参照形式」で列方向も数字で表示させた方が判りやすい例でもあります。

「帯グラフ」の行方向の境界に「隙間」を付けてみます。
率を帯び状のバーで表現
基本的には上記で要件は満たしていると思うのですが、このグラフ表示を「横棒グラフ」のように各棒の要素の間にいくらかの「隙間」があった方がさらに「それらしく」見えるのかも知れません。

率を帯び状のバーで表現
「条件付き書式」の設定は、実際に「帯グラフ」を表示させる範囲だけにするため、前回のサンプルのようにグラフ区画全体を一度で選択するわけにはいきませんが、Shiftキー、Ctrlキーを併用しながらセル範囲を選択することで、 設定そのものは前回同様に1回だけの登録で済ませることができます。
この場合の式は、

 =(COLUMN(RC)-1)*10<=R[-1]C1
このようになります。グラフ表示の「隙間」のため、1段を3行で構成しており、左端の「率(%)」は3行分を結合セルとしています。このため「条件付き書式」の行から見た場合は、「率(%)」の値が1行上に収容されることに留意して下さい。

率を帯び状のバーで表現
セルの「枠線」を消して表示されると、このように表示されます。いかがでしょうか。

Excel2010からは上記のような「苦労」は不要になりました。
率を帯び状のバーで表現
(この画像をクリックすると、このページのサンプルがダウンロードができます。)
計算式も要りません。条件付き書式で「データバー」を選択するだけで実現できます。