パソコンじいちゃん

最近は個人的な日記になっています。
初心に帰り、パソコン操作の役に立つ内容になるよう頑張ります。

RANK.AVG 関数 RANK.EQ関数 は必要か!? ( Excel 2010以降 )

2016年01月17日 | Excel
Excel講座で関数を学習するとき、RANK関数にいつも疑問を感じています。
「RANK関数」「RANK.AVG 関数」「RANK.EQ 関数」について考えてみました。

先に私の結論を言います。「RANK関数だけで十分です」



Excel 2010以降、RANK関数に「RANK.EQ関数」と「RANK.AVG関数」が追加されています。
RANK.EQ関数はRANK関数と全く同じものです。
全く同じ役割の関数が、異なる名前で2個あるなんて、Microsoftは何を考えているのだろう???

RANK.AVG関数は同順位が複数あった場合、平均値を順位とします。
例えば、 
2位が2件ある場合、2位と3位の平均値 (2+3)/2=2.5  つまり2.5位 2.5位となります。

RANK.EQ関数(RANK関数)では 1位 2位 2位 4位 となるが、
RANK.AVG関数 では 1位 2.5位 2.5位 4位 となる。

この世の中に整数以外の順位が存在することが理解できません!


実際にRANK.AVG関数を使用した例をネット検索してみたが、見当たらなかった。
使うことのない関数だからなのでしょうか?
私なりに使用例を作成してみたが、こんなことしか思いつかなかった。
通常、果たしてこんな分析が必要だろうか? 必要ないと思います。

RANK.AVG関数は、一般にほとんど使用する必要のない関数だと思います。
RANK関数だけで十分です。
どうしても平均値の関数を残したいなら、 RANK と RANK.AVG だけにすべきです。

いずれにしても、RANK関数 RANK.EQ関数  RANK.AVG関数 の3種類は不要です。
せめて、RANK関数 と RANK.AVG関数 にして下さい。

と言っても、Microsoft が私の戯言を聞き入れるはずもありません。
私としては、以前のRANK関数だけを使用して、ささやかな抵抗をするだけです。


ちなみに、「統計」分類にはRANK関数は含まれていません。
「すべて表示」の中には3種類が含まれています。

最後になりましたが、RANK.EQ  は 「ランク.イコール
           RANK.AVG  は 「ランク.アベレージ
と読むそうです。

ひさしぶり Excel VBA

2015年11月21日 | Excel



Excelのデーターベースで、フィルター機能によりデーターの抽出が簡単に出来ます。
複数項目の条件を検索することで、絞り込んだデーターも抽出できます。


パソコンのボランティア仲間から次のような質問がきました。
項目で絞り込んで抽出するのではなく、2項目の内のどちらかの条件を満足していれば抽出したい。
そんなときはどうするのか?

2項目の内のどちらかがOKなデーターを抽出するフィルター設定はどうする?どこにある?
エクセルには無いと思う。(Accessならできるのかどうか、私はAccessを知らない)
マクロでは条件による分岐処理が出来ない。
Excel VBA ならば、できるはず。(VBAを少し扱えるので挑戦してみよう)

VBA作成から3~4か月遠ざかっているので、かなり手間取ってしまった。

やっとできたのが次のVBAです。私にできるのはこれくらいでした。

フィールド名(列見出し)を次のようにしました。
B3セルは「番号」 C3セルは「患者名」 E3セルは「病名」 F3セルは「担当者名」


H2セルには 指定条件の「病名」を入力しておきます。
I2セルには 指定条件の「担当者名」を入力しておきます。

ボタンを作成して、「病名担当者フィルター」と「全体表示する」を実行してみました。
希望通りの抽出ができました。 
表全体の再表示もOKです。

普通の人ならば数分で出来るVBAを、いろいろ調べながら何時間もかけて作りました。
時々は作成しておかないと、簡単なことでも忘れてしまいます。
良い勉強をさせてもらいました。

以下は私の作ったVBAです。 
 ( Else: Exit Sub が必要かどうか分からなかったが、問題なかったのでそのままにしました)


Sub 病名担当者フィルター()
Range("C4").Select
Do While ActiveCell.Value <> "" 'C列のセルが空白になるまで繰り返す
If ActiveCell.Value = "" Then Exit Sub 'セルが空白になったら処理を終了する
If ActiveCell.Value <> "" Then 'セルが空白でないときは、次の通り処理を行う
If ActiveCell.Offset(0, 2).Value = Range("H2").Value Or _
ActiveCell.Offset(0, 3).Value = Range("I2").Value Then
' 2列右のセルがH2セルと同じかあるいは(Or)
' 3列右のセルがI2セルと同じ場合は
ActiveCell.Offset(1, 0).Select
ElseIf ActiveCell.Offset(0, 2).Value <> Range("H2").Value And _
ActiveCell.Offset(0, 3).Value <> Range("I2").Value Then
' 2列右のセルがH2セルと異なり かつ(And)
' 3列右のセルがI2セルと異なる場合は
ActiveCell.EntireRow.Hidden = True '行非表示
ActiveCell.Offset(1, 0).Activate 'セルを1行下に移動
Else: Exit Sub
End If
End If
Loop '繰り返す
End Sub




Sub 全体表示する()
'表全体を再表示する
Cells.Select
Selection.EntireRow.Hidden = False
Selection.EntireColumn.Hidden = False
Cells(4, 3).Select 'range("C4").select と同じ
End Sub