こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル:バグという名の仕様?

エクセル2003で

0.03
-0.75
0.3
-2.5
-7.5
-3.6
4.2
-5.6
3.5

というデータがあるときに
=COUNTIF(SIGN(A1:A9),1)

としたら数式を受け付けられませんでした

そこで、
=COUNTIF(INDEX(SIGN(A1:A9),),1)
としたら、数式は受け付けられるようになりましたが
#VALUE!
となりました
配列数式として確定しても症状は変わりません

仕方なく作業セル列をB1:B9に儲け
A1:A9に対しそれぞれsign関数を先に掛けておいて

=COUNTIF(INDEX(B1:B9,),1)
=COUNTIF(B1:B9,1)
としたところ共に今度はちゃんと数えてくれました

試しに
=COUNTIF(INDEX(B1:B9,),1)

INDEX(B1:B9,)の内側「B1:B9」を選択し
ファンクションキー「F9」で{1;-1;1;-1;-1;-1;1;-1;1}に変えてみたところ
値が「#VALUE!」に変わります

何が間違っているのでしょうか?
皆様のシステムでも再現する症状なのでしょうか?

お教えください。 (;´_`;)

投稿日時 - 2006-12-15 19:32:12

QNo.2603823

困ってます

質問者が選んだベストアンサー

こんばんは。Wendy02です。
Nouble さん、いつも読ませていただいております。配列の使い方もすべて分かっている方が、あえて、ご質問になられているのだと思って回答させていただきます。こちらも、半端な回答では済ますつもりではありません。

ご質問は、単に、解を求めるのではなく、配列の仕組みと関数の引数に対するものだと思います。それは、私も、昔、同様の疑問を感じて質問をしたことがあるからです。明確な回答は、その時もありませんでした。

少し、専門的な書き方で説明させていただきます。もし、お分かりになりにくかったら、ご指摘ください。

=COUNTIF(INDEX(SIGN(A1:A9),),1)

まず、COUNTIFの引数の種類ですが、

  COUNTIF(範囲,検索条件)

で、範囲というのは、VBAで言うと、Range オブジェクト型(セルの範囲)、
検索条件というのは、Variant 型(文字でも数字でも可能)です。

INDEX(SIGN(A1:A9),) ←INDEXを使った場合

これは、配列になります。つまり、引数の型が違うということで、COUNTIFがエラーを起こしています。では、配列って何という疑問も沸いてきてしまいますが、セルの範囲は、一つの固定空間なのですが、配列は、擬似的に作った入れ物ということになります。説明にはなっていないかもしれませんね。

なぜ、そう仕組みにばらつきがあるのかは、推測の範囲でしかありません。ただ、私が言えるのは、作っている側は、一枚岩ではなく、製作者や製作時期によって仕様が違うのではないか、と思います。大きく別けると、4時代があるようです。私が、VisiCalcという初期の表計算の仕様に興味を持つのは、すべては、そこから始まったからです。

もちろん、COUNTIFの引数に、配列を入れられるということは、MATCHのような1次元ではありませんから、1次元で検索するのとでは、負担の度合いが違います。しかし、SUM関数のように一見、自由に配列を取れるようではあっても、配列のデータ個数を、Excel2000以下では、標準メモリで、5,400個程度という制限を持たしていたし、MINVERS関数では、3,249個というというようなこともありますから、制限を持たして、COUNTIFの配列の引数を取れるようにしようと思えば出来たとは思います。(そのサンプルは、ユーザー定義関数で作ることが出来ます。)

  COUNT(値1,値2,...)

COUNT やCOUNTAというのは、引数は、「パラメータ配列」になっていますから、その引数を、Range型にしても、配列にしても、両方とも受けれます。

パラメータ配列というのは、不特定多数の引数が必要な場合は、「パラメータ配列(VBAでは、ParamArray)」 という宣言すると、値の配列を引数として渡すことができるようになっています。

やむをえないのですが、
方法はいくつかあるのですが、例えば、

=SUMPRODUCT((INDEX(SIGN(A1:A9),,)=1)*1)

このようにするしかありません。

他にも、COUNTBLANKが同様に、範囲を引数としています。
また、RANK関数、SMALL関数, LARGE関数は、RANK関数は、配列を引数として出来ませんが、SMALL関数, LARGE関数は、配列を引数として出来ます。しかし、それは、どこにも書かれていません。いえ、そもそも、SIGN関数が、配列数式を返すこと自体も分かりません。

配列数式に内部で切り替えることが出来る、仕組みになっているのだと思います。ここら辺が、ワークシート関数を含めて、配列数式の難しいところではないかと思います。私が、その時得た回答は、「やってみなければ分からない」でした。INDEX関数のように、明示的にセルの範囲と配列を引数として取れるとして公開していてくれればよいのですが。

その後、VBAをやってみて、多少は、仕組みというものが見えてきたけれど、まだまだ、先は遠いというところです。

投稿日時 - 2006-12-15 21:18:26

補足

恥を忍んで質問します

見栄を張ってVBAが解るといってしまった手前
少ししか解らないとは言い出せず
窮屈な思いをしていました (--;)

Rangeはセル範囲を扱う形で配列はまた別に指定方法があるのですね?

投稿日時 - 2006-12-15 23:57:33

お礼

こちらこそ何時も拝見して
う~ん 凄い!
と驚嘆しています (~ ~;)ヾ

覚束無い記憶ではありますが
以前試したときには
例の非公開裏仕様で使えたように覚えていたのですが

つい数日前のOfficeのパッチ以来なのでしょうか?
今日試してみたら使えなかったので
「この環境が何かに犯された性なのか? それともどの環境でも起こる一般的なことなのか?」
が、気になってスレッドを立てました

ご回答頂けたお陰で
現状の一般的な共通仕様だということが解りました
有り難う御座います <(_ _)>


それにしても本当に…
>明示的にセルの範囲と配列を引数として取れる…

仰るように
取り敢えず配列値の扱いに対する指針を各関数全てに対し示して欲しいですよね
で、出来れば解を配列値として返すか単一値で返すかのスイッチを付加して欲しいと感じます…
よね~?

投稿日時 - 2006-12-16 00:21:17

ANo.4

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(12)

ANo.12

piyottyさん、こんばんは。

>「セル範囲」も「リスト」も「配列」も別オブジェクトとして扱われるにもかかわらず、式をみただけではどのオブジェクトとして認識されているかわからない。(VBAなら、変数宣言で明示してあれば混乱しませんが)

「リスト」というのは、Excel 2003 や、名前は使われてはいませんが、オートフィルタなどのある一定の条件で仕切られ、一番上をフィールド項目とした、検索範囲のことだと思います。

「セルの範囲」と「配列」ですが、実際のところ、見た目には分かりません。しかし、私は、「セルの範囲」というものは、あくまでも、関数の中で、「範囲」という引数を受け入れ、それをひとまとめにして処理をするものに対して「セルの範囲」と言っています。具体的には、SUM関数で、「 : 」で区切ったものは、解を一つしか持ちませんから、「セルの範囲」だということです。また、私は、セル一つの中に、複数の値を持つものを、「配列」と呼んでいます。(正しいか、正しくないかは分かりませんが、そういう区別をしています。そして、VBAやマクロの考え方とは多少違いがあります。)

=SIGN(A1:A9) は、配列です。
しかし、
=COUNT(A1:A9) は、中の引数は、「セルの範囲」です。

>(VBAなら、変数宣言で明示してあれば混乱しませんが)

通常の関数(SUMPRODUCTなどは別)は、配列としてユーザーが設定した時だけ、それを配列に切り替えます。(前回Noubleさんが引き合いに出したスイッチであり、今の、Ctrl + Shift + Enterのことです。)

Noubleさんへ

私が書いたものは不十分だったかもしれません。
ただ、私が、勘違いしている可能性があるかもしれませんが、その時は、おゆるしください。

例を示しておきます。

>IF文とかSUMとかと同様の例の「行の踏襲(?)」と同じと思って良いのですよね?
『配列の共通部分参照』というのは、本来は、以下のように、参照部分の高さ、幅を合わせることです。A列が、縦に9行ですから、B列も縦に9行必要です。

=SUMPRODUCT((A1:A9=B1:B9)*1)

行の範囲は、他の参照範囲とは対応していなければなりません。(列であれば列の範囲に対して、参照範囲がすべて対応していることです)

しかし、これは、中で配列の確定が行われていますから、数式の置き場所は気にしなくてよいです。

そうでない場合は、B列のB1:B9に任意の数字を置いて、C1~C9に、
=A1:A9=B1:B9 とすると、共通部分参照が出来ていますから、配列数式として対応し、式を、1行目~9行目に置いている限りは、解が返されます。VBAとは違い、セル一つの中に、仮想空間にミニワークシートが出来ているような感じです。

>その関数そのものがB5にあった場合
>B5の値を参照し解を示す
>と言うことですか?

B5に数式があり、その中のデータのセルの範囲が、循環参照にならないで、1行目から9行目にある場合は、解やデータの個数が、9個ですから、その5番目ということになります。私は、以下のような場合について書きました。

  A   B
1  0.03
2 -0.75
3  0.3
4 -2.5  B5に以下を入れると、
5 -7.5  =A1:A9 ←お分かりにのように、「-7.5」が返ります。
6 -3.6  
7  4.2
8 -5.6
9  3.5

 =SIGN(A1:A9)  ←エラー(#VALUE!) 10行目以降 配列の共通部分参照が超えてしまっています。
 
これを配列確定(Ctrl + Shift+ Enter)すると、行の影響を受けなくなります。しかし、配列自体は、確定しなくても、使えることは使えるわけですね。これは、あくまでも私の考えです。

投稿日時 - 2006-12-19 23:27:16

お礼

Wendy02さん
お礼が遅れて済みません

フォローとご回答に感謝します

投稿日時 - 2007-01-11 11:12:05

ANo.11

こんばんは、piyottyです。
Wendy02さんの回答を拝見して、=SIGN(A1:A9)をどのセルに入力するかが重要であるということに漸く思いが至りました。
私の場合、判定データをA1セルからA9セルに記述し、常にA10セルに=SIGN(A1:A9)を入力していたため、引数が「範囲」として識別され、エラー値#VALUE!が戻されていたようです。
試しにB1セルに=SIGN(A1:A9)を入力してみると、引数を「実数」として認識しているらしく、確かに正しい結果が戻ります。
#企業実務でこういう式を作ると曖昧さが入るので怒られますが。

ただ、B1セルに=COUNTIF(SIGN(A1:A9),1) を入力しても、A10に=COUNTIF(SIGN(A1:A9),1)を入力しても、ネストしているSIGN(A1:A9)が、配列を戻しているため、エラーが発生し、式を確定させることができないようです。
これが、Wendy02さんが#10でお書きいただいた「COUNTIFの引数(範囲)は配列を取れない」という件だと思います。
(以上のことは、本日、Excelで実際にデータを入力し、式を入力後、Fxアイコンで「関数の引数」ダイアログボックスを表示させて、関数の実行結果を確認した結果を記述しております)
配列全体の正負を解釈しているのでは?という私の推測が間違っていたことをお詫び致します。

Wendy02さんの回答を拝見して、Excelは「セル範囲」も「リスト」も「配列」も同じ表現方法(対象の開始セルのアドレスと終了セルのアドレスを:で区切る)をとることが可能なので、混乱しやすいのでは?と思いました。
「セル範囲」も「リスト」も「配列」も別オブジェクトとして扱われるにもかかわらず、式をみただけではどのオブジェクトとして認識されているかわからない。(VBAなら、変数宣言で明示してあれば混乱しませんが)
Variant型の自由度の高さが裏目に出ているのではないかと思います。

投稿日時 - 2006-12-19 20:38:03

お礼

piyottyさん
まず謝罪させてください
旅先で確認したのですが
改めて検証すると
確かにエラー表示されていました
申し訳ありません。

このエラーが計算についてものでないために
私このエラーを無意識に読み替えてしまってました

陳謝

投稿日時 - 2007-01-11 11:07:50

ANo.10

こんにちは。Wendy02です。
すこし割り込ませていただきます。

私もNoubleさんと同じ疑問を持っていて、少しは、Noubleさんにお話が出来るレベルに達したというところだと思っています。

#9の補足に書いた内容ですが、

>>=SIGN(A1:A9)を実行しますと、エラー値#VALUE!が戻るのはご指摘のとおりです。
>
>いえいえこちらでは
>=SIGN(A1:A9)はエラーになりませんよ

この数式が、1~9行目まであれば、エラーは返されませんが、1~9行の中にない場合は、エラーが返されます。例えば、その式が、5行目にあれば、データ要素の5個目が出てきます。それを、『配列の共通部分参照』と言います。その数式、1~9行目に、それぞれ動かしてみると良いです。

私が最初にワークシートの配列数式を教わったとき、VBAの配列を引き合いにした人がいました。しかし、今の私が言えるのは、VBAとワークシートの配列とは、同じに考えないほうがよいと考えています。

厳密なVB側の名称を言うと、ワークシートの配列のことを、ジャグ配列(多段階配列)と言って、二次元配列の一種なのですが、VBA/VBでは、単独では、めったに使われることない特殊なものです。私は、VBAを主としていますが、ワークシートのそれは、独自に発展したものだと思っています。また、{ } をつけない配列のことを、パラメータ配列といいます。たぶん、ヘルプの中では、「数値配列」と言っているような気がしますが、ワークシートでは、配列という認識はないはずです。

>>各関数のHELPには引数の型式が明記してあるとのことですが
>>殆どの配列数式対応関数で
>>それと明記はないように思えますが
>>如何でしょうか

>(例えばCOUNT)の場合、引数の詳細を説明している文に「配列」の文言が表示されております。

#9 のpiyottyさんのご指摘のCOUNTはその通りですが、それはすべてではありません。例えば、配列数式でよく使われる、FIND などは、それに当たります。しかし、それ以上に、COUNT は引数が配列が取れて、COUNTIF, COUNTBLANKは、引数に配列が取れないとする、少なくとも技術的な理由は、どこにもないと思います。それは私が例で示したとおりです。

それで、私が今言えるのは、ワークシートの関数は、平面的に同じ仕様では作られていないということです。それは、何人か(MSとは限りません)の製作者のなんらかの意図によるもので、ユーザー側には、その意図するものは、何も見えてこないのです。

1970年の終わりに、ダン・ブルックリンが考えた関数を、その後、Lotus やIBMやMicrosoft が、それをどう加工していったか、というところにあるのではないか、と思っています。

話を元に戻すと、
 =COUNTIF(SIGN(A1:A9),1)

COUNTIF([範囲],1)は、範囲は、配列を引数として持ちません。ただ、[範囲]と書いてあるという理由からだと思いましたが、それは、私の間違いだと気づきました。不合理かもしれませんが、やはり、「やってみなければ分からない」のです。

投稿日時 - 2006-12-19 12:55:59

お礼

お越し頂く度に本当に勉強になり恐悦至極です

>それを、『配列の共通部分参照』と言います。
IF文とかSUMとかと同様の例の「行の踏襲(?)」と同じと思って良いのですよね?

例えば
A1:A9を範囲指定していても
その関数そのものがB5にあった場合
B5の値を参照し解を示す
と言うことですか?

投稿日時 - 2006-12-19 17:38:00

ANo.9

たびたび申し訳ございません、#1及び#6です。
私も一時はOffice系ソフトのサポートを生業としておりましたので、再現性の問題については、毎回必ず確認しております。OfficeのUpdateもできるかぎりかけておりますので、必ずしも古い状態ではないと思います。
(細かいバージョンを申し上げますと、Excel2003(11.8105.8107)SP2となっております)
以下の再現状況につきましては、実際にExcel上でデータを演算した結果を2006/12/18 23:00現在で確認しております。

ご提示頂いた例データの配列
0.03 (このデータをA1セルに入れます)
-0.75
0.3
-2.5
-7.5
-3.6
4.2
-5.6
3.5 (このデータをA9セルに入れます)
に対し、A10セルで
=SIGN(A1:A9)を実行しますと、エラー値#VALUE!が戻るのはご指摘のとおりです。
この数式を{=SIGN(A1:A9)}として配列にしますと、確かに 1 が戻りますが
SIGNは「数値の正負を調べる」というのが目的ですので、配列要素の正負ではなく、配列自体の正負を判定していると考えられます。
数式を=SIGN({0.03;-0.75;0.3;-2.5;-7.5;-3.6;4.2;-5.6;3.5})として、引数を配列に変換した結果も同様です。
質問者様の目的がこれで達せられているのであれば、問題がないのですが
質問文を拝見する限り、目的が達せられていないのだと判断いたしました。
このため、#6の回答を記述した次第です。
配列は「同じデータ型の要素の集合に名前をつけたもの」(Microsoft Excel/Visual Basic Programmer's Guide より)と定義されておりますので、配列は集合全体で一つのオブジェクトとして位置づけられ、正負が判定されるのだと思われます。

>各関数のHELPには引数の型式が明記してあるとのことですが
>殆どの配列数式対応関数で
>それと明記はないように思えますが
>如何でしょうか?
配列数式に対応している関数、と、引数に配列をとることができる関数、との解釈の違いによるか、と存じます。
引数に配列を取ることができなくても、{}で関数式をくくることで、配列数式とすることは可能です。
しかし、引数に配列を取ることができない関数の場合、上記SIGNのようにエラー値を戻すか見当違いの解が返されます。
引数に配列をとることができる関数のヘルプ(たとえば、INDEX,FREQUENCY,SUMPRODUCTなど)を見ますと、書式の欄で引数に「配列」または「データ配列」と明示されております。
また、書式に配列の文字がなくても、配列を引数として取りうる関数(例えばCOUNT)の場合、引数の詳細を説明している文に「配列」の文言が表示されております。

申し訳ございませんが、理系の出身でもなく、他の回答者様と展開されているような高度な話題についていけるほど勉強しているわけでもありませんので、本件に関しましての回答はこれにて終わらせて頂きたく存じます。

投稿日時 - 2006-12-19 00:02:59

お礼

度重なるお心砕き恐悦です

>=SIGN(A1:A9)を実行しますと、エラー値#VALUE!が戻るのはご指摘のとおりです。

いえいえこちらでは
=SIGN(A1:A9)はエラーになりませんよ

エラーになるのはSMALLの内に入れたときですよ

失言してたらお許しください <(_ _)>


>上記SIGNのようにエラー値を戻すか見当違いの解が返されます。

SIGN関数はその解の各要素を見る限り
こちらの環境では与えた因数の符号値を的確に返してますよ
そちらでは意味不明な値になるのですか?

投稿日時 - 2006-12-19 00:17:21

ANo.8

こんばんは。Wendy02です。

>配列数式のマトリクス中の任意の1行とか任意の1列を取り出す関数があるようです
>余談ではありますが此には正直驚愕させられました

それは、Excelでは、INDEX関数で、配列にして出力しています。

=INDEX([マトリクス],1,) ...1行目
=INDEX([マトリクス],,1) ...1列目

これを使えないと、Ver.4マクロ関数を使いこなせません。
お分かりになるかと思いますが、例えば、こんな風になります。

=INDEX(SMALL({3;1;5;2;8;4;6;9;7},ROW(1:9)),5,)
これを、縦横を切り替えます。
{=INDEX(TRANSPOSE(SMALL({3;1;5;2;8;4;6;9;7},ROW(1:9))),,5)}
配列確定が必要です。(TRANSPOSEの引数が、配列にされていないといけないからですね)

>どの関数も配列の答えを返す有益性は捨てきれないでしょうからね

それは、そうなることを期待するしかありませんね。私が、例で示したように、可能だということはお分かりになったと思います。隠しオプションで、試してみなければわからない、というのは、ちょっと効率が悪いです。同じ系列の関数で、ばらつきがあるのが、困りますね。

これは、たぶん、英米の計算の必要性と関係があるのかもしれません。

ただ、やっぱり配列数式は、上級者用だと思います。Noubleさんのように、新しいものに挑戦し考えていく人もいれば、先は明るいでしょうね。先を行く人は、理解されないことも多いかもしれませんが。

例えば、データ-テーブルは、まさに配列ですが、それを使う人も少ないですね。Excelの上級コースで出てきます。

>… 使えると想像するだけで歓喜に打ち震えます (~ ~;)ヾ
>是非エクセルにも欲しい機能ですね

いいですね。実は、私は、Lotus 1-2-3が使いこなせなかった部類の人です。たまたま、Excelは、覚える機会や時間があって、一応一通りは覚えられたから良かったけれど、私は、もう次は分からないかもしれないと思っています。

投稿日時 - 2006-12-18 23:28:07

お礼

おっと!

そうそう!!
そうでしたね
うっかりしてきました
INDEX関数の第2第3第4引数は省略すると
それぞれ該当するマトリックス範囲を配列として返すのでしたね

失念してました (~ ~;)ヾ

失礼しました <(_ _)>

先日来2次元マトリクスを1次元配列に切り分ける方法について悩んでいたのですが
今思うと馬鹿ですね ヾ(ーー;)オイオイ

投稿日時 - 2006-12-19 00:04:41

ANo.7

こんにちは。Wendy02です。

すみません、私は、だらだらと書いてしまって。
興味のある話なので、少し、また便乗させてください。

Noubleさんの場合、高度なワザを分かって使っていらっしゃるわけで、私などが、本当に、何かを言える立場ではないと思います。ただ、おっしゃっている内容には、同感させられることが多いのも事実です。

今の私は、今の私なりに、まだ、検証してお答えできるものが、まだあるのではないか、と思っています。

それで、私も、データベース関数の引数のCriteria に、配列が使えると便利だなって良く思います。一番感じるのは、VBAから使う時に、仮想空間の配列を擬似的に作って使えば、ワークシートに書き込む必要がありません。Criteriaの置き場所に困ることがあります。例えば、MATCH関数が、対照的ですね。この関数は、被検索範囲も、検索値も、どちらも配列でも、可能なのですね。おまけに、スピードも速いです。

データベース関数は、それが出来るようになって、初めて一般の検索の関数と同じような使い方が出来るようになるわけです。ただ、ユーザー定義関数では、私は、再現できないのです。一般関数は、見えてくるのですが、ぜんぜん見えてきません。たぶん、データベースの技術が使われているようです。

それから、COUNFIF を、ユーザー定義関数で、実験してみました。

なお、#VALUE!になるのは、やはり、引数の型が違うからでしょう。早い話、そういうように作ったのですね。仮に、=COUNTIF(INDEX(1,,),1) として、1 という数字を、Double 型(数値型)から、別の型(配列/Variant型)に替えて、引数として受け入れられるようにしても、型が違うので、エラーが起きてしまいます。

=FCOUNTIF(SIGN(A1:A9),1)

=FCOUNTIF(SIGN(A1:A9),-1)

配列の確定(Ctrl + Shift +Enter)=スイッチ をする場合とそうでない場合の違い。

特殊な使い方
=FCOUNTIF(A1:A9,"-*")

'標準モジュール(実務レベルとしては、もう少し複雑になります)
'---------------------------------------------------------

Public Function FCOUNTIF(Source As Variant, SearchWord As Variant)
'第一引数に型を選ばないCOUNTIF関数
'SerchWord は、比較演算子やワイルドカードが使えます
Dim ret As Variant
Dim v As Variant
Dim c As Variant
Dim cnt As Long
cnt = 0
Application.Volatile
ret = TypeName(Source)
Select Case ret
Case "Variant()"  '配列の引数
 For Each v In Source
  If v Like SearchWord Then
   cnt = cnt + 1
  End If
 Next
 Case "Range" '範囲の引数
 For Each c In Source.Cells
  If c.Text Like SearchWord Then
   cnt = cnt + 1
  End If
 Next
 Case "Double"  '配列確定していない前の配列のエラー回避
  If Source = SearchWord Then
   cnt = cnt + 1
  End If
End Select
FCOUNTIF = cnt
End Function

'----------------------------------------------

投稿日時 - 2006-12-17 13:19:28

補足

(お礼の続き)
しかし一方で
式を入力セルは1つ、1つのセル内に表示可能値は1つ
と言う原則は変える気がないようですので
「スイッチ」という選択肢を捨てる限り
配列から1つの要素を特定して抜き出す専用の関数を残す必要があると思います

でも、この選定はなかなか難しいのでしょうね
どの関数も配列の答えを返す有益性は捨てきれないでしょうからね

少し前はマイナーなLOOKUP関数にこの任を負わせようとしていたようで
例えば
=LOOKUP(1,{1},SMALL({配列数式},n)) (注》nは任意の数を表す)
とすると第1要素を抜き出すことが出来たのですが
今は叶わなくなってしまいました

視点を変えて
OpenOfficeのCALCでは
配列数式のマトリクス中の
任意の1行とか任意の1列を取り出す関数があるようです
余談ではありますが此には正直驚愕させられました

まだ複数配列の解へは未対応ながらも
今後もし複数の列や行を個別の配列として取り出せたなら…

2次元マトリクス配列を1次元の複数の配列をして切り分けられる事になり
この此処の配列に対し個別の数値演算をすることが可能となりそうですし

1次元配列においてもベクトルの違う方向を軸に切り分ければ
配列の分割が実現しますよね

… 使えると想像するだけで歓喜に打ち震えます (~ ~;)ヾ
是非エクセルにも欲しい機能ですね

横道にそれましたが
まあ1長1短でしょうけど
私は「スイッチ」付加の方が
単調化は増大しますけど
ユーザーフレンドーリー性が此を上回ると思えるので
やはり1票投じたいと思えます

投稿日時 - 2006-12-18 16:56:45

お礼

凡例の呈示ありがたいです

ところで
私は実は光マトリクス(?)コンピューターのような
平行(並列?)演算システム(アルゴリズムも)に非常に惹かれているところがあります

エクセルの配列数式も此に通ずるところを感じ魅せられています

MS自身もこの可能性には気付いており
この方向性を尊重したい
と考えているのだと思います。

例を挙げますと
=SMALL({3;1;5;2;8;4;6;9;7},ROW(1:9))
としますと
smallの仕様からはちょと頭を柔らかくしないと想像も付かないような
{1,2,3,4,5,6,7,8,9}
と言う回答が得られますよね
しかし此によって各要素に対する次段の処理を指定することが可能になります
此を何段にも重ねた場合

此処の要素に視点を置くと
個別の要素に対する並列した処理の流れ
詰まり疑似平行コンピューティングと言えそうですね

折しも複数コアが一般化の世を呈している今日
このアプローチが実ればマルチスレッド化が1セル内にも
更に適応できるようになるので
飛躍的な高速処理化が期待されそうです

更に付け加えれば
64ビットCPUは
実現するには多大な障害があると思えますが
理論的には2進32ビット以内の値を32ビット個
同時に処理できる能力を持つとも聞きます

配列式としては期待の持てる性能でしょうね

なので
MSとしては全関数を配列数式対応としたいのだと思います

投稿日時 - 2006-12-18 16:54:01

ANo.6

#1です。
追加でご質問頂いているようですので、回答を。
(こちらの環境は、Windows2000上のExcel2003です)

=SIGN(A1:A9) の引数を配列にしてやったときの戻り値は、配列自体の符号と考えられます。
(上記式では範囲をしているため、範囲内の値の符号は一意に決まらないので返却できない。故に#VALUEが戻される。
引数を配列として確定した場合、配列自体が一つの引数として認識されるため、符号判定が可能となり値が戻される、と考えられます)
このため、「SIGN関数が複数の引数を判定できないのでは?」という表現をさせて頂きました。

データベース関数のCriteriaに配列が使えないのは、
ワークシート上のリストをデータベースとして捉え、Accessのクエリの条件指定のイメージでCriteriaを利用しているからだと思われます。
(Where文の生成をGUIで行うイメージ)
条件範囲を広く指定することでCriteriaに複数の条件を指定すること自体は可能ですので、わざわざ配列にしなくてもよいのでは、と思います。

尚、関数が取りうる引数の型については、ヘルプで明確に
「数値」「範囲」「リスト」「データベース範囲」「データ配列」などと
区別されておりますので、いくつかの関数のヘルプを比較いただければわかりやすいかと存じます。

投稿日時 - 2006-12-16 16:25:05

補足

今回のスレッドの主な趣旨は
他の方への返答に書かせて頂きました通り
「環境間の相違の検証」ですので

こちらでやってノーエラーとなることが
実際にそちらの環境で検証してみてエラーが発生するということならば
凄く重要で趣旨に添ったことだと思いますが

如何でしょうか?
実際にエクセルのシート上でやられた結果として
仰るようになることを確認頂けたのでしょうか?

MSは当然ながらその権限で日々仕様変更を繰り返し配布していきます
詰まり極端な話ですが
機能のエクセルと今日も同一というのは肯定不能なのです

なので
数ヶ月前にそうなった
ではない
今どうなのか?
をこのスレッドではお伺いしたいのです

更に駄目だった場合にも出来た場合にも
どのような作業過程でそうなったのか
ということも「再現性」の観点からは重要となりますので
これをも添えてお知らせ頂きたいのです

望むべくもないことなのでしょうか?

投稿日時 - 2006-12-18 19:15:44

お礼

ご意見有り難く頂戴致します

各関数のHELPには引数の型式が明記してあるとのことですが
殆どの配列数式対応関数で
それと明記はないように思えますが
如何でしょうか?

所詮MSですから
そこら辺は寛容に臨機応変な受け取り方をしないと
泣かされるのでは?

投稿日時 - 2006-12-18 17:21:24

ANo.5

Noubleさん、こんにちは。
Wendy02です。

>取り敢えず配列値の扱いに対する指針を各関数全てに対し示して欲しいですよね

私は、ある種の関数の群の中で、それぞれの作者の著作権みたいなものがあるような気がしました。だから、社内でも、あまり他人のコードは触れないというのか、表示できないのかなって思います。改編などしても、特に公開していないようですね。関数に統一規格がありません。おまけに、引数の並びのいくつかは、英語という言語と深い関係があるようです。こういう情報は、あまり、日本には入ってこないのが現状です。

>で、出来れば解を配列値として返すか単一値で返すかのスイッチを付加して欲しいと感じます…
>よね~?

おっしゃるとおり、単一値で出力というのは、良く分かります。例えば、INDEX(配列,1,1)
なんていうように、私が、VBAのユーザー定義関数で作る時も、そう考えます。というか、解を配列値として出しても、本来は、処理に困ります。そのために、もう一つ関数(SMALL,INDEXなど)が必要になります。

私には、とても中途半端なもののような気がします。なぜ、そうした出力が存在するのか、もとより、配列の確定(Ctrl + Shift + Enter)ということ自体が、機能としては理解でしても、なぜ、そのような仕様にしているのか、という疑問が残ります。取って付けたような機能ですね。

関数の中に、スイッチという案は、VBAのユーザー定義関数を作る側からすると、明快な考え方だと私は思いますし、それは(VBAでも)可能だと思います。作れなかったのではなくて、作らなかった、ということでしょうね。

>Rangeはセル範囲を扱う形で配列はまた別に指定方法があるのですね?

VBAの配列は、「Dim A(10)」 と単に配列の変数の宣言をして、一つの変数に、11個の仕切りを別けるだけです。最初が、0から始まりますので、これは、11個になります。VBAでは、ごくごく簡単に扱います。しかし、ワークシートは、別にして考えたほうがよさそうです。

Range型というのは、お分かりになるように、

セルの書式、数式、パターン、文字の色、文字のよみがな、ロックの有無など、様々な情報が入れてあります。セルの一つずつの情報が入っています。

配列は、そうした情報は入らずに、単に文字か数字の値だけしか入りません。ワークシートでは、セル一つに対して、ある種の電子的な空間(縦横の平面)を持っているようですね。特に、VBAのような宣言(Dim)は必要ありません。その仮想空間を利用して計算するというような感じです。それが、ひじょうに、VBAの感覚と違うところです。

こういう説明では、納得いかないかもしれませんが、もしポイントを外していたら、お許しください。

ある時期に、一度、MS側で関数の総決算で、いらないものは捨てるとか、統一規格にするとかしたほうが良いように思います。私は、MS Excelは、この先もずっと続くとは思っていません。しかし、これらの関数の仕様は、また、誰かが引き継ぐものだと思っています。

投稿日時 - 2006-12-16 11:16:01

補足

あ! そっか元々ベーシックが基本ですから
配列宣言時の要素数は上限限界値を超えない場合特に指定不要

ということで
要素数を特定していない配列で配列式の要素を受け取ればいい
と言うことですね
勉強になりました

有り難う御座います。

投稿日時 - 2006-12-18 15:34:31

お礼

度々のお越し感激です

投稿日時 - 2006-12-18 16:51:55

ANo.3

COUNTIFもINDEXも最初の引数はセル座標でなければエラーしますのでバグではありません。

正の数値をカウントならSIGNを使わないでも
=COUNTIF(A1:A9,">=0")
で出来ます。
どうしてもSIGN関数が使いたいなら
=SUMPRODUCT((SIGN(A1:A9)=1)*1)
とすれば配列数式にしなくても計算されます。

投稿日時 - 2006-12-15 20:26:52

お礼

早速のご回答有り難う御座います

そうですか…

COUNTIFには配列を使える裏仕様がない
ということ

詰まり
「仕様」なのですね (--;)

了解です (~ ~;)ヾ

感謝です <(_ _)>

投稿日時 - 2006-12-15 23:29:26

ANo.2

#1さんの回答にありますように、SIGN関数には数値のみを与えることが出来ます。
=SIGN(A1:A9)とするのは文法的に誤りです。

別にSIGN関数を使わなくても、目的のものは
=COUNTIF(A1:A9,">0")
で求まると思いますが...

投稿日時 - 2006-12-15 20:21:37

お礼

お心砕きに感謝致します

投稿日時 - 2006-12-15 23:51:15

ANo.1

Excel使用歴は長いのですが、数学に弱いため、見当違いの回答をしているようでしたら申し訳ございません、と先にお詫びしておきます。

SIGN関数がとれる引数は、数値のみ(数値リストではない)だからではないでしょうか。
(#VALUEになるのは、戻り値が一意に決まらないからでは?)
このように、1つ1つのセルの判定結果を集計するなら、配列数式ではなくデータベース関数を利用するべき、とExcel側で想定しているのではないかと思います。

リスト内から条件を満たすデータの個数を数える、というのであれば
(1)対象のデータをリストとして体裁を整え
(2)Criteriaを用意してやり
(3)データベース関数DCOUNTで個数判定を行う
としてやれば、作業列を設けなくても集計できるのでは、と思います。

投稿日時 - 2006-12-15 20:10:02

お礼

お心使い感謝いたします

SIGN関数が複数の引数を判定できないのでは?

とのことですが
取り敢えず私の環境下では何の問題もないようですよ
そちらの環境では如何でしょうか?

適当に縦に9個ほどセルを選択し
一番上が白くなっているところで数式バーに
=SIGN(A1:A9)
と、入れ、「Shift」+「Control」+「Enter」
で確定してみたところ、数値が現れました

もう一点ですが
データベース関数はCriteriaを配列で指定できないようなので
私も是非使いたいとは、かねがね感じてはいるのですが
未だ活用できていません。

数式内でセル範囲に仮の名前付けができれば
使えるのかも知れませんね

取り敢えず今は私の力量では
データベース関数に魅力を感じているものの
配列数式内に散り込めていないのが現状です (~ ~;)ヾ

何はともあれご配慮に感謝致します <(_ _)>

投稿日時 - 2006-12-15 23:47:44

あなたにオススメの質問