
ここの回答によく出てくる対象データをすべてピックアップする
(下記は横に並べていく例)
=IFERROR(INDEX($25:$25,1/LARGE(INDEX(($D26:$F26="")/COLUMN($D:$F),),COLUMN(A1))),"")という関数ですが、
途中の算式でCOLUMNで割った値を判定に使ったのちにCOLUMNに戻す処理があります。
何故COLUMNをそのまま使っていないのでしょうか?
ちなみに割るのを止めて
=IFERROR(INDEX($25:$25,LARGE(INDEX(($D26:$F26="")*COLUMN($D:$F),),COLUMN(A1))),"")にしたところ、必要な答えは出ましたが対象の無い空白欄には
「ワークシートの限界を超えてスピルはできません」エラーとなりました。
わざわざ割り算している理由は、此のエラーの回避なのかなと思いますが、
掛け算では何故限界を超えるエラーが出るのも不明ですので併せて、どなたか教えてください。
No.5ベストアンサー
- 回答日時:
No4です。
以下は、2019以前での話です。
>試す都度違う値がでたりしてよくわかりません。
INDEX関数の挙動に少しおかしなところがあって,
例えば
=INDEX($25:$25,0)
として適当なセルに入力して、水平方向にフィルコピーしてみるとわかると思います。
(エラーにはなりません)
これを、
=INDEX($D$25:$F$25,0)
として同様にしてみると、今度はある部分(D:F列)はエラーになりませんが、他の列ではエラーになります。
これらを観察すると、インデックス値「0」の場合の評価がどうなっているかわかると思います。
(インデックスが0なので、本来はエラーを返すのが正しいと思いますが・・・)
SMALL関数を利用して、除算を用いずに抽出しようとするなら、
SMALL(IF($D$26:$F$26="",COLUMN($D$26:$F$26),1E5),COLUMN(A1))
のような考え方の方がわかりやすいと思います。
IF関数の部分は、
「26行目が空白ならその列番号を、そうでなければ1E5(=列の最大値以上の数)を返す」
といった意味になりますが、残念ながらIF関数は配列計算に対応していないので、上の式はそのままではエラーになります。
これを計算させるには、配列数式として定義する必要があります。
一気にまとめてしまえば、
=IFERROR(INDEX($25:$25,SMALL(IF($D$26:$F$26="",COLUMN($D$26:$F$26),1E5),COLUMN(A1))),"")
の式を入力して、Ctrl+Shift+Enterを同時押しして確定させることで、配列数式として入力が可能です。
その上で、右方にフィルコピーすれば、最初にご提示の式と同様の結果が得られます。
(列数が1E5以下なので、1E5列を参照しようとするとエラーになることを利用しています)
とは言え、配列数式は必ずしも扱いやすいものでは無いので、これを避けるために考え出されたのが除算を2回行う方法と考えられます。
別法として、AGGREGATE関数を利用して、
=IFERROR(INDEX($25:$25,AGGREGATE(15,6,COLUMN($D$26:$F$26)/($D$26:$F$26=""),COLUMN(A1))),"")
とすることで、配列数式にしなくても同様の結果を得ることが可能です。
(こちらは、0除算がエラーになることを利用しています)
(AGGREGATE関数は、多分、2010以降だと思いますが・・)
解説ありがとうございます。
1)2007で、フィルコピー試すと、指定範囲に関わらず関数入力したセルの
カラムに連動した値が返ってくるという不思議な結果(これが試す都度
違った理由)でした。0を参照エラーにしてくれれば曲がりなりにも使えて、疑問も湧かなかったのに、です。
又365で試すと、指定行全部の値が返ってきたのでシートから溢れエラーになったのだと思いますので、2つの疑問は解決?しました。
2)SMALL関数も昨日試しました。条件が1かブランクだったので、「IF(($D26:$F26)=1,"",COLUMN($D:$F)」として365で試して上手くいったのですが、2007では一つ目の値しか持ってこられず、バージョンの限度だろうと終わってました。が、Ctrl+Shift+Enterを失念していました。
>配列数式は必ずしも扱いやすいものでは無いので、これを避けるために考え出されたのが除算を2回行う方法と考えられます。
そうですね。修正すると元に戻るし面倒です。
3)乗りかかった船で、無理やり配列を充てる方法も試しました。
=IFERROR(INDEX($1:$1,AGGREGATE(15,6,IF(($D$26:$F$26)=1,"",SEQUENCE(,3,4)),COLUMN(A:A))),"")
が、やっぱり除算型のほうがシンプルです。
No.6
- 回答日時:
既に問題は解決しているので、全くの余談ですが、INDEX関数のインデックスが0のとき、一次元配列であれば「INDEX関数は列全体または行全体の値の配列を返す」という仕様だっと記憶しています。
https://support.microsoft.com/ja-jp/office/index …
従って、シートの25行目A25~J25に「=column()」を記述してから、 fujillinさんの回答にある
=INDEX($25:$25,0)
をA1に記述して、水平方向にフィルコピーしてみると
1,2,3,4,5,6,7,8,9,10,0,0,0・・・
と表示されることになりますし、
=INDEX($D$25:$F$25,0)
をA2に記述して、水平方向にフィルコピーしてみると
D:F列は4,5,6となり、エラーになりませんが、
他の列ではエラーになります。
ここで、A1を
=AGGREGATE(15,6,INDEX($25:$25,0),COLUMN())
に書き換えて水平方向にフィルコピーしてみると
1,2,3,4,5,6,7,8,9,10,#NUM!,#NUM!,#NUM!・・・
となり、A2を
=AGGREGATE(15,6,INDEX($D$25:$F$25,0),COLUMN())
に書き換えて水平方向にフィルコピーしてみると
4,5,6,#NUM!,#NUM!,#NUM!,#NUM!・・・
となります。
つまり、
=AGGREGATE(15,6,$25:$25,COLUMN())
=AGGREGATE(15,6,$D$25:$F$25,COLUMN())
と同じ結果を返していることがわかります。
このように、AGGREGATE関数のような配列を扱える関数では、セル範囲を配列と解釈してくれますので、わざわざINDEX関数のインデックス0を使って配列を記述しても、ただ数式が長くなるたげであまり意味がないことになります。
=AGGREGATE(14,6,($25:$25<5)*COLUMN(A1:J1),2)・・・・・・①
=AGGREGATE(14,6,INDEX(($25:$25<5)*COLUMN(A1:J1),0),2)・・・・・②
①の数式は、EXCELで上記のシートに記述すると、3が返る数式ですが、互換ソフトといわれるKingSoftのWPSスプレッドシートでは、敢えて②のように記述しないと正しい結果が得られません。
これは、INDEX関数の仕様としては正しい使い方なのかも知れません。
EXCELでも②のように記述してもよいとは言え、前述の理由もあって、やる人は極めて少ないと思います。
補足ありがとうございます。
「0にすると列全体または行全体の値の配列を返す」仕様の意味が
ピンとこなかったのですが、下記のABを並べた結果
なんとなくわかりました。
A:INDEX($25:$25,0) 今回発生
B:INDEX(($25:$25<5)*COLUMN(A1:J1),0) 上記②
本来はBのように条件配列を造るための仕様であり、
最初からAの使い方をすることは無い。
というのも,最初からなら=($25:$25)で出来る。
今回掛け算式を試したら、計算値の値が0となり、
Aパターンになった結果、旧バージョンでは訳の分からない答えに
なったり時にはエラーになったりという現象があちこちで出てきた。
この解釈で合ってますか?
此れは経験がないと理解できないですね。
しかも365になるとA列を除きシートあふれでスピルエラーになる。
旧バージョンの式が使えなくなるので、止めるわけにもいかないですが、
せめて配列が使える新バージョンでは、「代入で0だったら#REFにする」などにして欲しいですね。
No.4
- 回答日時:
こんにちは
>「ワークシートの限界を超えてスピルはできません」エラーとなりました。
ご提示の関数は、もともとスピルに対応していないバージョンを想定した式と推測されます。
2019以前のバージョンで試してみればわかりますが、ご提示の後者の式でもエラーは発生しません。(エラー処理を行っているので)
ただし、抽出の順序が異なってしまいますし、正しい結果も得られません。
割り戻しているのは、この両者をまとめて回避するためと考えられます。
(詳細については、No2様の回答をご覧ください)
一方で、スピル機能を利用できる環境であるなら、式をフィルコピーする必要はありませんし、それに対応した便利な関数も用意されていますので、ご提示のような面倒な式を使う必要もありません。
ご提示の例で言えば、
=FILTER(D25:F25,D26:F26="","")
をひとつのセルに入力すれば済むはずです。
はい、FILTERは了解していますが、これは素朴な疑問という類です。
式を見ただけで、いきなり掛け算方式を実行した訳では無く
両方の中間結果も確認していますし、
予想通り正解はでました。
但しスピルエラーのおまけが出ました。
掛け算で出来るのなら、とっくにやってるよという声は、
予想してましたが、わざわざ割り戻してるのには
何か理由があるはずなので、もし理由がわかる方がいたら
という趣旨です。スピルエラーについても、同様です。
新旧で配列の動きの違いがあるのでしょうね。
2007があるので、そちらで掛け算方式の動作を確認すれば
少なくとも旧バージョンでは使えない理由がわかると思うので試します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- Excel(エクセル) この関数の誤りを教えて下さい。 3 2023/08/08 07:36
- Excel(エクセル) Excelでなぜこのような式をつかっているのでしょうか、行に1,2,3と連番を振るだけなのに 5 2023/04/08 20:00
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Oracle データベースのカラムの型がCHAR型の場合で 値にシングルコーテーションつけなくても動作する場合と数 3 2022/04/25 12:00
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Excel(エクセル) この関数の間違いを教えて下さい 2 2023/08/07 22:40
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
【Access】Excelインポート時に...
-
お助けください!VBAのファイル...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
VBAでfunctionを利用しようとし...
-
【VBAエラー】Nextに対するFor...
-
マクロの「SaveAs」でエラーが...
-
Nullの使い方が不正ですのエラ...
-
Filter関数を用いた結果、何も...
-
VBA エクセル で FIND でのエラ...
-
CDatabase::ExecuteSQL()について
-
エクセルVBAで今まで使えていた...
-
マクロで"#N/A"のエラー行を削...
-
ACCESSで値を代入できないとは?
-
VBAのリストボックスで、横スク...
-
ACCESS VBAのSplit()関数の使用...
-
フランスの生年月日(jj/mm/aaaa)
-
Scilabのstacksizeの増やし方が...
-
VBでSQL文のUPDATE構文を使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
【VB.NET】 パワポ操作を非表示で
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
おすすめ情報
2007で試したところ、本来計算エラーで空欄になるところに値が表示されました。
INDEXの値(カラム値)が0(対象無し)なので、もちろん誤りですが、
なぜその値が出てくるのかわからないし、
試す都度違う値がでたりしてよくわかりません。
此れがエラーになってくれればいいのですが。
365のスピルエラーもこれが原因だと思います。
但し、0データをエラーに出来たとしても降順(LARGE)表示は何か不自然。
昇順(SMALL)にすると0データが先に来てしまい、ますます困る。
結論:掛け算方式は使えない。
というわけで割り算型を考案した人は賢いという結論になりました。
以上 皆様お騒がせしました。