[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『RANK関数について。』(コルム)
以下のURLで、
https://office-hack.com/excel/rank/
の、0を除く場合の、数式がなぜそうなるのかが分かりません。0と空白セルは、excelの仕様で同じなのでしょうか?ご教授いただけないでしょうか?すみません。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
>0と空白セルは、excelの仕様で同じなのでしょうか 場合により異なるので「違います」 他の質問を処理(何らかの形で終わらせる)しないので 説明はしません (はまちゃん) 2021/04/17(土) 11:36
ちょっと憶測でモノを言ってみましょうか。
オブジェクトブラウザで確認してみると、 RANK関数の第1引数はDouble、第2引数はRangeと定義されている様です。 Function Rank(Arg1 As Double, Arg2 As Range, [Arg3]) As Double
で、空白セルの値はEmpty値。
VBAのヘルプによれば、 >Empty値を含むバリアント型の変数は、 >数値データと共に使われるときは 0、 >文字列データと共に使われるときは長さ 0 の文字列 ("") として扱われます。 とあります。
Double型は数値データの一種ですから、 RANK関数にとって、空白セルの値は 0 として扱われるんですね。
一方、第2引数はRangeですからセル範囲への参照がそのまま渡されます。 第1引数の様に、空白セルの値が0に変換されてから渡る訳ではありません。
そこでまず、 お示しのリンク先「空白の場合」の挙動についてですが、
戻り値が[#N/A]ということは「無かったよ」という意味ですから、 「第2引数の範囲内に 0 という値はありませんでした」ということになります。 実際、セル範囲にあるのは 0 ではなく空白セルですから、 まあ当然と言えば当然と言えます。
この挙動を踏まえた上で、次に「0を除く場合」について。
データの中に 0 と空白セル両方あると、空白セルにも順位が付けられる。 さっきの「空白の場合」のときは[#N/A]だったのに。っヤツ。
恐らくRANK関数の内部処理としては、 1.第2引数のすべて値を大小比較して順位リストを作成 2.順位リストの中から、第1引数に一致する値の順位を返す という順番での処理が行われているものと考えられます。
この「大小比較」に於いて、 0 セルと空白セルが等価と判断されたかどうかは分かりませんが、 とりもなおさず、順位リストには 0 セルの順位が付けられた訳です。
第1引数については、前述の通り 0 セルも空白セルも 0 として渡されてますから、 0 セルも空白セルも、順位リストの中から 0 セルの順位を返しており、 順位リスト内の空白セルの順位は使われていないのでしょう。
なので戻り値も[#N/A]でなく 0 セルと同じ順位になっている。
という感じなんじゃないかと想像してます。 ホントのところはRANK関数作ったところに訊かないと分からないです。
(白茶) 2021/04/17(土) 13:42
ちょいwwww! 声出して笑ってしまったじゃないか
>つまり、どういう事でしょうか? さっき一番下に書いた通りですよ。
(白茶) 2021/04/17(土) 14:32
えー、そっちなの? (なんか徒労感が半端ないっすわ)
前項[空白の場合]で >順位を算出する値がないと、#N/Aエラーとなってしまいます。 >その場合はIFERROR関数で、「エラーを吐き出されたら空白にする」指定をしましょう。
という解説がありました。 そこからの流れを踏襲して >空白スペースの順位付けも解決されました。 と表現してあるのでしょう。
要するに 「空白にする」事を解決策と仮定した場合の話ってだけですよ。 実務では必ずしも「空白にする」事が解決策だとは限りません。
それくらいは文脈から読み取って自己解決しないとイケませんね。
(白茶) 2021/04/17(土) 15:43
の 2021/04/15(木) 19:53 で半平太さんからご説明がありました。
直近の話ですよ?
(白茶) 2021/04/17(土) 16:29
いや、これは 白茶さん のこれに基づいています。 ↓ >Empty値を含むバリアント型の変数は、 >数値データと共に使われるときは 0、 >文字列データと共に使われるときは長さ 0 の文字列 ("") として扱われます。
Emptyは、空白セルを意味します。
なので、空白セル="" でも真(True)と判定されますし、 空白セル=0 でも真(True)と判定されます。
つまり、B7は空白だけども、0でも真と判定されるので、順位が出てこないんです。
行 _B_ _C_ 3 0 4 3 7 5 5 6 6 7 3 7 ← =IF(B7=0,"",RANK(B7,B$3:B$12)) 8 10 1 9 1 8 10 9 2 11 6 4 12 6 4
この理屈はそう簡単なことじゃないんですよ。
今の回答者も昔は同じことで悩んだはずです。
(半平太) 2021/04/17(土) 16:51
(コルム) 2021/04/17(土) 16:59
>Empty値を含むバリアント型の変数は、 >数値データと共に使われるときは 0、 >文字列データと共に使われるときは長さ 0 の文字列 ("") として扱われます。 これについても詳しくご教授いただけないでしょうか?すみません。 (コルム) 2021/04/17(土) 17:07
>もしかして、セルには数式(IF関数)が入っているから空白にする事はできないから >0か空白文字列が入り表計算ソフトではそうなるが、
そっちの話は、セルに表示するときの問題です。何か1つにしなければならない。 それで「0」に決まったんです。決まったらもう「空白」でも「空白文字」でもありません。
>IF関数の論理式より、0の時は空白にせよ。だからそのセルは空白になり同時解決する。 こっちはまだ、セルに表示する以前の処理の問題です。
Empty値(つまり空白)は、 「0か」 と聞けばそうだと答え、 「空白か」と聞けばやはりそうだと答える状態にある、と言うことです。
だから、空白でも0でも、順位が出てこないんです。
> >Empty値を含むバリアント型の変数は、 > >数値データと共に使われるときは 0、 > >文字列データと共に使われるときは長さ 0 の文字列 ("") として扱われます。 >これについても詳しくご教授いただけないでしょうか?すみません。
詳しい説明は誰もできません。 マイクロソフトがそう決めただけです。
(半平太) 2021/04/17(土) 17:16
あららー。申し訳ないです。私が余計に混乱させちゃたみたいですね。
リンク先の当該項目を引用して図説してみます。 E列に追加でIF関数の第1引数だけ抜き取った式を入れてみますと、 B3(0値入力セル)もB7(空白セル)も「0に等しい」という結果が返ります。
なので・・・、まぁ既に半平太さんから適切な回答が付けられてますので図説だけにしましょう。
__|___A____|___B____|___C____|___D____|___E____ 1| | | | | 2| |数値 |順位 |0を除く |=(B3=0) 3| | 0| 9| | TRUE ← B3は0に等しい。""を返す。RANK関数使わない 4| | 3| 7| 7| FALSE 5| | 5| 6| 6| FALSE 6| | 7| 3| 3| FALSE 7| | | 9| | TRUE ← B7は0に等しい。""を返す。RANK関数使わない 8| | 10| 1| 1| FALSE 9| | 1| 8| 8| FALSE 10| | 9| 2| 2| FALSE 11| | 6| 4| 4| FALSE 12| | 6| 4| 4| FALSE
(白茶) 2021/04/17(土) 17:39
>だから、空白でも0でも、順位が出てこないんです。 RANK関数だけだと0も空白も同順位出てきましたけど? 私のパソコンおかしいかしら? (まり) 2021/04/17(土) 17:42
>私のパソコンおかしいかしら?
ちょっと、コルムさんで手一杯なんで、別トピックで新規に質問してください。
(半平太) 2021/04/17(土) 17:47
空白セル=0 でも真(True)と判定されます。 これは、覚えるしかないのでしょうか?ご教授いただけないでしょうか?すみません。 (コルム) 2021/04/17(土) 22:02
>覚えるしかないのでしょうか?
「決め」なので覚えるしかないです。 ーーーーーーーーーーーーーーーーー
Empty(空白セル)の実体値は、なんとその逆で「0でもなければ、""でもない値」なのです。
なので、空白セル + 1 とか 空白セル & "A" とかをどう処理すべきなのかは誰も分かりません。
マイクロソフト社は「エラーにする」と決めたかったんです(嘘ですけど、そう考えてみましょう)。
すると、エクセルを買った人が 「冗談じゃない、空白は何もないんだから+1なら1に決まっているだろう」と言いますよね。
あっそう、じゃ0に読み変えて処理しますね。 そうなると、「空白セル & "A"」 は「0A」になりまーす。
するとまた、エクセルを買った人が 「冗談じゃない、空白は何もないんだから、ただの「A」に決まっているだろう」と言いますよね。
ふーん、0にすればいいの、"" にすればいいの、どっちがいいんですかー?
するとユーザーは、そんなことは、マイクロソフトで悩んでくれ。 こっちは、今言ったような結果にしてくれなければ、エクセルは買わない、と言います。
仕方なく、トランプのジョーカーみたいに「0にもなれるし、""にもなれる」と言う仕様になったんです。
(半平太) 2021/04/17(土) 22:42
ヘルプで「Empty」値の説明を見ると「特殊な値」となっています。
>バリアント型 (Variant) 変数に格納できる「特殊な値」の 1 つ。 > >その変数が初期化されていないことを示し、・・ >この値は、数値としては 0 と評価され、文字列としては長さ 0 ("") の文字列と評価されます。
(半平太) 2021/04/17(土) 22:55
なので、空白セル="" でも真(True)と判定されますし、 空白セル=0 でも真(True)と判定されます。 つまり、B7は空白だけども、0でも真と判定されるので、順位が出てこないんです。 これは、もう決まりという解釈でよろしいのでしょうか?ご教授いただけないでしょうか?すみません。 (コルム) 2021/04/17(土) 23:01
くどいですね。
>=IF(B7=0,"",RANK(B7,B$3:B$12))
B7は空白セルなので、B7=0は真となるので、その時は""にしなさいと言う数式ですよ。
行 _B_ _C_ 3 0 4 3 7 5 5 6 6 7 3 7 ← =IF(B7=0,"",RANK(B7,B$3:B$12)) ~~~~↑~~~~~ 念の為に言いますが、こっちに入っている空白セルは0とみなされてないです。
※関数の仕様は、その関数の目的に応じて「空白セルを空白とみるか0とみるか」を決めています。
(半平太) 2021/04/17(土) 23:14
空白セルが0か""なのかは自分で色々調べてみればよいのでは? 例えばA1セルが空白の場合 =A1 =A1=0 =A1="" =COUNTIF(A1,0) =COUNTIF(A1,"") =MATCH(0,A1,0) =MATCH("",A1,0) の戻り値は何になるかなぁ? (はまちゃん) 2021/04/17(土) 23:44
>IF関数の論理式→真であるを逆に考えても良いという事ですね?
逆に考えるとは、具体的に何をどう考えるのか説明してください。
(半平太) 2021/04/18(日) 06:55
>B7=0は、論理式ですよね
はい、それでその式は真ですか、偽ですか?
いままでずーと論議していたと思うので、それを踏まえて答えてください。
(半平太) 2021/04/18(日) 09:30
真なら、""(空白文字列)を出力することになるので、ランク付け対象外ですよね。
=IF(B7=0,"",RANK(B7,B$3:B$12)) ~↑~ ↑ 真 第1引数
何を教示すればいいのですか? 何が分からないのですか? 何が逆なんですか?
(半平太) 2021/04/18(日) 11:38
(コルム) 2021/04/18(日) 11:52
>空白文字が真である事を考えている
それなら、その数式は使えないです。
これになります。 ↓ =IF(B7="","",RANK(B7,B$3:B$12))
この数式の場合、B7セルが「空白文字」か「空白(つまり未入力)」の場合に真になります。 もしB7セルに0が入っていたら、偽となります。
(半平太) 2021/04/18(日) 12:32
空白セル(=未入力セル)だけ真にさせる必要があるので
C7セル =IF(ISBLANK(B7),"",RANK(B7,B$3:B$12))
(半平太) 2021/04/18(日) 15:19
(コルム) 2021/04/19(月) 16:43
>数値であれば、空白セルは0とみなされて、 >空白文字列にしたいのなら、数値の0の入ったセルに“0“とする。
そう言われましても、何のことか分かりません。
だいたい、数値の0の入ったセルに"0"を入れるなんて方法は、 データ側を変えることであって、数式を工夫して対応することとは別の話です。
>合っていますでしょうか?
コルムさん自身はどう思っているんですか? 納得しているならそれでいいじゃないですか。
納得できないなら、どうして納得できないのか説明してください。
(その時は、こんな表を使って具体的に説明してください) ↓ 行 _A_ _B_ _C_ 3 0 4 4 3 3 5 5 2 6 7 1 7
(半平太) 2021/04/19(月) 17:38
>では、なぜ0を除く場合で、0も空白も順位が表示されないように同時解決するのでしょうか?
それは、既に説明していますけども。 空白セルはジョーカーだから、0になったり、空白文字になったりするんです。 IFの判定で0と比較すると、0の時は当然TRUEだし、空白の時も0になってTRUEになるんです。
>これは、数値の場合でしょうか?0を文字列にする時は、 >““を付ければ良いと思ったのですが。
「これは」とは何を指していますか?
で、先生の話は納得したんですか?
納得できてないなら、どうして納得できないのか説明してください。 (その時は、こんな表を使って具体的に説明してください) ↓ 行 _A_ _B_ _C_ 3 0 4 4 3 3 5 5 2 6 7 1 7
(半平太) 2021/04/19(月) 18:06
>“0“で、文字列になると聞いたのですが。
なりますが、それが何の話にどう関係するんですか?
こっちに聞くことに答えて貰えませんか? ↓ > 「これは」とは何を指していますか? > > で、先生の話は納得したんですか? > 納得できてないなら、どうして納得できないのか説明してください。 > (その時は、こんな表を使って具体的に説明してください) > ↓ > 行 _A_ _B_ _C_ > 3 0 4 > 4 3 3 > 5 5 2 > 6 7 1 > 7
(半平太) 2021/04/19(月) 19:25
>数値の0の事で、0と空白文字列を区別するために、“0“としたという事です
・・で、それが今回の話とどう関係するんですか?
こんな表を使って具体的に説明してください。 ↓ 行 _A_ _B_ _C_ 3 0 4 4 3 3 5 5 2 6 7 1 7
どこに0があって、その0を"0"にすると、どんな(良い)影響が出るハズだと思うのですか?
(半平太) 2021/04/19(月) 20:49
こう聞いた方がいいですかね?
下図の場合、RANK関数でどういう結果が出るのが希望ですか?
行 _A_ _B_ _C_ 1 2 3 0 4 3 5 6 7
具体的にC列に希望する数値を入れてみてください。
(半平太) 2021/04/19(月) 21:05
(コルム) 2021/04/19(月) 21:23
いやいや。その返しは傍から見ててもさすがにカチンと来ますからね。
少しは丁寧に説明できないものですかね。 (丁寧ってのは言葉使いの方じゃなくって、質問内容の方ですよ?)
なんか小馬鹿にされた風にでも受け取られたのかも知れませんが、 貴方が何を言いたいのか、読んでてもホントに理解できないんですって。
>以下のURLの0を除く場合 これは分かったけど、
>“0“となる場合は、 どこが?
>文字列となると どこが?
>どうなるのか どこが?
>数値の所です。 どこそれ?
って感じなんですよ。いちいち。こっちは。ね。 はい。も一回。よろしくお願いしますよ。
(白茶) 2021/04/19(月) 22:08
ちょっと今日はもう逃げますので、最後に表作ってみました。
_|___A____|___B____|____C_____|_____D______|_____E_____|_______F_______ 1|値 |A列の式 |=([A列]=0)|=([A列]="0")|=([A列]="")|=ISBLANK([A列]) 2| 0|=0 | TRUE | FALSE | FALSE | FALSE 3|0 |="0" | FALSE | TRUE | FALSE | FALSE 4| |="" | FALSE | FALSE | TRUE | FALSE 5| | (空白) | TRUE | FALSE | TRUE | TRUE 6|A |="A" | FALSE | FALSE | FALSE | FALSE
C2の結果: A2は[数値の「0」] と等しい ★アタリ D2の結果: A2は[文字列の「0」] と等しくない E2の結果: A2は[長さゼロの文字列] と等しくない F2の結果: A2は[セルの内容が空白] ではない
C3の結果: A3は[数値の「0」] と等しくない D3の結果: A3は[文字列の「0」] と等しい ★アタリ E3の結果: A3は[長さゼロの文字列] と等しくない F3の結果: A3は[セルの内容が空白] ではない
C4の結果: A4は[数値の「0」] と等しくない D4の結果: A4は[文字列の「0」] と等しくない E4の結果: A4は[長さゼロの文字列] と等しい ★アタリ F4の結果: A4は[セルの内容が空白] ではない
C5の結果: A5は[数値の「0」] と等しい(と論理式では評価される)が、[数値の「0」]が[セルの内容が空白]を意味する訳ではない D5の結果: A5は[文字列の「0」] と等しくない E5の結果: A5は[長さゼロの文字列] と等しい(と論理式では評価される)が、[長さゼロの文字列]が[セルの内容が空白]を意味する訳ではない F5の結果: A5は[セルの内容が空白] である ★アタリ
・[数値の「0」]が入ったセル ・[長さゼロの文字列]が入ったセル ・[セルの内容が空白]のセル
この3つを区別するには... みたいな感じなのかな? と想像中。
(白茶) 2021/04/19(月) 22:34
>再掲しておきます。
また、引用? 引用はやめてください。
私はコルムさんが下記の通りB列に4つのデータがあった場合、 自分の頭で考えて、ランク付けがどうなるべきなのか答えて貰いたいのです。 まさか、ランクがどう出るべきなのか分からない訳じゃないですよね?
さあ、下図でC3、C4、C5、C6のセルはどうなると納得するのか、 自分で考えて語ってください。
行 _A_ _B_ _C_ 1 2 3 0 4 3 5 6 7
(半平太) 2021/04/20(火) 09:38
>B列の0を“0“の文字列にしたいのです。
データの方を変えるんですか? なんか方向が違う様な気がするんですけども。
とりあえず、やってみると、 以前のこの式でこちらは希望通りになりましたけど、そっちはどうですか? ↓ C3セル =IF(ISBLANK(B3),"",RANK(B3,B$3:B$6))
希望通りじゃない場合、どんな結果になったのか教えてください。
(半平太) 2021/04/21(水) 19:24
ところで、何故C3セルをエラーにしたいんですか?
別の言い方だと、何故エラーになるべきと思うんですか?
そこが今回、一番肝心な所だと思うんですが、説明していただけませんか?
(半平太) 2021/04/21(水) 20:37
>要するに、“0“と0と空白セルを区別したいだけです。 白茶さんの2021/04/19(月) 22:34の回答で 説明されていますが何か問題が有りますか? (はまちゃん) 2021/04/22(木) 02:40
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.