• ベストアンサー

エクセル 関数が動かない

ある1000行から成るロウデータから、Large関数とCountifs関数の掛け合わせで最小値を得て、Match関数で、その値を持つレコードからIDを抽出しています。 しかし、自動計算が186行目までしか働かず困っています。(計算式自体は問題ありません) 設定の問題ではないかと推測しているのですが... どのように確認すれば良いか(対処すればよいか)わかる方がいらっしゃいましたらご教示いただけますと助かります。 ちなみにOptionの設定は下記の通りです。

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

  • ベストアンサー
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.9

確定的 では、ありませんが なんとなく、解りました。 データに、式が フィットして、いません。 先ず、 当方の、環境の 2011では エラーに、なったため INDEXの、引数を ,0)から、,,)に 変えました 此は、公式仕様では ,0,0)でも、良い と、なっていますし 構わないはず とは、思いますが 厳密には 動作が、違います ,,) を 使って、頂きたい 少なくとも ,0)では 動かない、EXCELが 出ます。 さて、本題ですが 式を、変え データを、作成した 初段では 全件、動作しました。 其の後、 式を 解析する、内に データの、粗密さが ある程度、荒くないと 意味が、無い事に 気付き 荒くした、途端 1件も、動きませんでした #num!ですが 要するに anマッチ、しています。 此を、ご参照ください https://1drv.ms/x/s!AjviygfJDgV_1QNBJwwpfRyp4Jj6 未確定、結論 と、しては 式の、設計が 不適切 と、いう事 です。 エラー処理、等 何らかの、考慮を 入れましょう

その他の回答 (11)

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.12

追記 其の後も、直向きに 考えて、いた の、ですが 己の、条件中 には sheet2!D2:D1000=sheet!1Dx (x|2≦x≦1000 xは任意の行番号) の、成立が 含まれて、います また 己を、満たす時、 己の、条件内に 甲が、含まれている ので 甲は、必ず 成立して、います 故に、 己を、満たす行の D列値=甲を、満たす行の D列最小値 ならば、 己を、満たす行の D列値=シート1 D列、同行値 なので 其れが、指し示す 値は、どんな時も シート1の D列同行の、値 です もう1つ 甲を、満たす行 最小値と、同値行中の C列値と、D列値が、 シート1、同行の C列と、D列に、 等しい、なら 其れは、 条件が、成立しており 結果は シート1の、同行D列値です。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.11

済みませんが 引っかかって、しょうが無い ので 質問させて、ください sheet2!$B:$B1000=B2…甲 と、 仮に、します 先ず COUNTIFで 甲の、合致件数を 得て…乙 其れを、元に LARGEで、甲成立行中の C列の、最小値を 取ってます よね? 仮に 丙と、します。 次に 丙に、合致する 件数を 得た、上で…丁 =LARGE(INDEX( (sheet2!B$2:B$1000=B2)*(sheet2!C$2:C$1000=C2) *sheet2!D$2:D$1000,,), COUNTIFS(sheet2!B$2:B$1000,B2,sheet2!C$2:C$1000, 丁) と されて、います。 COUNTIFS(sheet2!B$2:B$1000,B2,密データ!C$2:C$1000, 丙) は (sheet2!B$2:B$1000=B2)*(sheet2!C$2:C$1000=C2) の 成立件数を カウントできて、いません 故に、 最小値を、取っている 其のようには、なっていません よね? 此は、何を されて、いますか? もし 最小値を、取りたい なら 乙、または、C2、 に 統一、されるべき ですよね? 詰まり 成立行中、D列最小値を 得たい、場合 其れ、以降の 式は 意味が、無く 間違え または、 シート1のC2の、存在価値が 無い と、いう事に 成りますが、 其の、可能性を 排除して 考えた、場合 他の、意図を 聞く、必要が 出ます。 所で、 過去の、ご質問を 思い起こすと 甲成立中の、C列最小値行中の D列最小値行の、E列値が 欲しい と、いう事 かな? と、思えますが、 此は、言い換えれば 甲成立行中に、おいて C列も、D列も、 最小値の、行 此って、 データが、完全に どの列も、整列されている なら 甲成立行中、最上行 ですよね? なので OFFSET(sheeet2!$A$1,LARGE(INDEX((甲)*ROW($B$2:$B$1000,,),乙),3,1,1) ですよね? 抑も データが、ソートされて いたなら 何段も、LARGEを 使う、必要は ありませんよ? もう1つ シート2B列と、シート1B列 同行値が、一致し、 シート2C列と、シート1C列 同行値が、一致し、 シート2D列と、シート1D列 同行値が、一致する、…戊 行中の G列値と、 OFFSET(sheeet2!$A$1,LARGE(INDEX((甲)*ROW($B$2:$B$1000,,),乙),3,1,1) が、一致する行 其の、行位置は MATCHで、探させるより 成立行、行番号最小値を 取る方が 処理速度が、速くなる と、思います 内部で、行われる 検査回数が 格段に、違います あと、 私は、絶対に COUNTIFは、使いません 人が、見る 見た目通りに COUNTIFは セル値を、扱わないから です COUNTIFの、処理内容と 目視から、期待する 処理結果、との 間には 差異が、出るから です セル内の、値の 扱い方が 見た目と、違うのです SUMPRODUCTで、件数集計する事を 圧倒的に、強く 勧めます。 と、まあ 勝手に、話を 進めましたが 結局 何が、したいのか 甲成立最上行、D列値と 一致する 戊成立行の、D列値が 知りたい のですか? 其れは、単に データが、前列 完全整列されて、いる 前提なら 甲成立中の、D列最小値行の 中に 戊成立行が、あるか…己 見るだけ で、解りますよ? 因みに 手元データでは 全件、不成立 でした。 己なんて 草々、成立 しませんから ね

pillow71
質問者

お礼

Largeを使っていたのは、運用上データがソートされていないケースを想定していたからでした。しかし、動作の安定性を考慮してoffsetを使う案も検討して見ます。sumproductが実用的なのは知っていました。しかし、データ量が増すごとに動作が不安定となり、現在の仕様に至りました。 本当にいろいろアドバイスをいただきありがとうございました。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.10

>Work sheet 1: 出力用 >Work sheet 2: ロウデータ >計算式は下記の通りです。 ------------ここから------------ =MATCH(LARGE(INDEX((Sheet2!b$2:b$1000=b2)*(Sheet2!c$2:c$1000=c2)*Sheet2!d$2:d$1000,0),COUNTIFS(Sheet2!b$2:b$1000,b2,Sheet2!c$2:c$1000,LARGE(INDEX((Sheet2!b$2:b$1000=b2)*Sheet2!c$2:c$1000,0),COUNTIF(Sheet2!b$2:b$1000,b2)))),INDEX((Sheet2!b$2:b$1000=b2)*(Sheet2!c$2:c$1000=c2)*(Sheet2!d$2:d$1000=d2)*Sheet2!d$2:d$1000,0),0) ------------ここまで------------ 検索値=LARGE(INDEX((Sheet2!b$2:b$1000=b2)*(Sheet2!c$2:c$1000=c2)*Sheet2!d$2:d$1000,0),COUNTIFS(Sheet2!b$2:b$1000,b2,Sheet2!c$2:c$1000,LARGE(INDEX((Sheet2!b$2:b$1000=b2)*Sheet2!c$2:c$1000,0),COUNTIF(Sheet2!b$2:b$1000,b2)))) この数式ではSheet2のB列がSheet1のB2と同じで、且つ、Sheet2のC列がSheet1のC2と同じ行のSheet2のC列の値で最小値と言うことのようです。 検索範囲=INDEX((Sheet2!b$2:b$1000=b2)*(Sheet2!c$2:c$1000=c2)*(Sheet2!d$2:d$1000=d2)*Sheet2!d$2:d$1000,0) この数式はSheet2のB列がSheet1のB2と同じで、且つ、Sheet2のC列がSheet1のC2と同じであり、更に、Sheet2のD列がSheet1のD2同じの行が検索対象になっています。 従って、検索値が検索範囲に存在しない可能性があります。 MATCH関数の検索値と検索範囲は整合性を取らなければ目的の結果を得られません。 当方でExcel 2013による検証で提示の数式を使うとMATCH関数で検索値が存在しないときの#N/Aが出ます。 今一度、目的と結果の整合性を確認された方が良いでしょう。 提示の数式の範囲を減らしました。 =MATCH(LARGE(INDEX((Sheet2!B$2:B$20=B2)*(Sheet2!C$2:C$20=C2)*Sheet2!D$2:D$20,0),COUNTIFS(Sheet2!B$2:B$20,B2,Sheet2!C$2:C$20,LARGE(INDEX((Sheet2!B$2:B$20=B2)*Sheet2!C$2:C$20,0),COUNTIF(Sheet2!B$2:B$20,B2)))),INDEX((Sheet2!B$2:B$20=B2)*(Sheet2!C$2:C$20=C2)*(Sheet2!D$2:D$20=D2)*Sheet2!D$2:D$20,0),0) 添削1 =MATCH(LARGE(INDEX((Sheet2!B$2:B$20=B2)*(Sheet2!C$2:C$20=C2)*Sheet2!D$2:D$20,0),COUNTIFS(Sheet2!B$2:B$20,B2,Sheet2!C$2:C$20,LARGE(INDEX((Sheet2!B$2:B$20=B2)*Sheet2!C$2:C$20,0),COUNTIF(Sheet2!B$2:B$20,B2)))),INDEX((Sheet2!B$2:B$20=B2)*(Sheet2!C$2:C$20=C2)*Sheet2!D$2:D$20,0),0) 添削2 =MATCH(LARGE(INDEX((Sheet2!B$2:B$20=B2)*(Sheet2!C$2:C$20=C2)*(Sheet2!D$2:D$20=D2)*Sheet2!D$2:D$20,0),COUNTIFS(Sheet2!B$2:B$20,B2,Sheet2!C$2:C$20,LARGE(INDEX((Sheet2!B$2:B$20=B2)*Sheet2!C$2:C$20,0),COUNTIF(Sheet2!B$2:B$20,B2)))),INDEX((Sheet2!B$2:B$20=B2)*(Sheet2!C$2:C$20=C2)*(Sheet2!D$2:D$20=D2)*Sheet2!D$2:D$20,0),0) 添削1、添削2の何れを使うかはあなたの目的に合わせてください。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.8

>ロウデータの追加の仕方で、水平方向はダメで垂直方向はOKなんてあるのでしょうか? 意味不明です。 「ロウデータ」はテキストですよね? 行の区切りは改行で列の区切りはカンマやタブの他に空白も使えるようです。 任意の区切り記号(特定の文字でも可)も指定すれば貼り付け時にフィールド(列)を区切って入力されます。 新しいブックへカンマ区切りの行データ(文字列)を貼り付けると1つのセルへ長い文字列が入力されると思います。 貼り付け時に「貼り付けオプション」の「テキストファイルウィザードを使用」を使えば列の区切りを指定できます。

pillow71
質問者

お礼

意味不明です。ということは、貼り付け方の違いが問題の解決に繋がったわけではないと認識します。計算式が複雑になった背景がありまして...ただ、現在は動作しておりますので、やはり計算式の問題とは言い難いです。 ただ、ネストを多用すると正常に動作しなくなるものと心得ます。アドバイスありがとうございました。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.7

186行目までしか動かない理由は解りませんが、式を見る限りでは失礼ですがExcelにあまり慣れてないであろうと推測しました。 質問に何か大事な情報が抜けていると思われます。 -- 長い式で目的の値を取得できるとそれはそれで達成感もありますが、問題が解りにくくなりメンテナンス性も悪いです。 作業列等を使って、なるべく短い式にすることをお勧めします。 例えば今回の例では、「IDを抽出しています」とありますが、Sheet1のセルA2、B2、C2の値3つと全てが一致する行が、Sheet2!B2:D1000の何番目に出てくるかを取得したいのではないでしょうか? その場合、一例ではありますがSheet2のE列を作業列として使用します。 E2セルに↓の式を入れ、E1000までコピーします。 =B2&"_"&C2&"_"&D2 Sheet1には以下の式を入れます =IFERROR(MATCH(B2&"_"&C2&"_"&D2,Sheet2!E$2:E$1000,0),"")

回答No.6

>> =IFERROR(MATCH(LA(略)000,0),0),"") > 空白でした。 ということは、エクセルのシステムは 「ちゃんと最後の行まで関数式を評価(計算)している」 ということですね。 で、その評価(計算)の結果、#NUM!エラーを返している。 つまり「問題は式に有るのではないか?と疑うのが自然」ですね。 5番さんもおっしゃる通り、 「ロウデータ」を簡略したサンプルを提示いただけないと 式が煩雑過ぎて読めないんです。 なので「構成を~」と申したんです。 情報を小出しにして時間をかけるのは 質問者・回答者双方にとってストレスでしかないですよ。 身バレしない程度にボカして、サンプルと目的をご提示くださいませ。 と言いつつ、 私は「無駄に長い、煩雑な式」は不得手なので  (他人に伝達・引継ぎ、メンテナンスを任せるのが困難ですしね)、 特段の意見を思いつかない限り静観の立場を決め込みます。 失礼しました。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.5

>自動計算が186行目までしか働かず困っています。 症状の説明が不明瞭です。 ハングアップ(フリーズ?)するのですか? または、下記で言う出力用シート(Sheet1)の186行目までは正常に抽出できるが187行目以降が抽出できない(エラーになる?)と言うことですか? >動かない=計算式されない の意です。 >セルの戻り値は#num! になっております。 Excelのバージョンは? #N/Aではないですか? MATCH関数で検索範囲に検索値が見つからないと解釈できます。 COUNTIFS関数やCOUNTIF関数では該当が無いとき0が戻ります。 >Work sheet 1: 出力用 >Work sheet 2: ロウデータ >計算式は下記の通りです。 ------------ここから------------ =MATCH(LARGE(INDEX((Sheet2!b$2:b$1000=b2)*(Sheet2!c$2:c$1000=c2)*Sheet2!d$2:d$1000,0),COUNTIFS(Sheet2!b$2:b$1000,b2,Sheet2!c$2:c$1000,LARGE(INDEX((Sheet2!b$2:b$1000=b2)*Sheet2!c$2:c$1000,0),COUNTIF(Sheet2!b$2:b$1000,b2)))),INDEX((Sheet2!b$2:b$1000=b2)*(Sheet2!c$2:c$1000=c2)*(Sheet2!d$2:d$1000=d2)*Sheet2!d$2:d$1000,0),0) ------------ここまで------------ 難解な数式ですね。 >照合の形は0です。検索範囲は昇順です。 Sheet2のB列、C列、D列の全てが昇順と言うことですか? 「照合の形」とはMATCH関数の「照合の種類」のことですよね? 提示の数式が込み入っていて読み切れない状況です。 検索値と一致しない結果が起る可能性はありませんか? 検索の論理を見直して数式を簡略化することを再検討された方が良いでしょう。 次のCOUNTIFS関数でLARGE関数の第2引数(順位)を算出している部分を簡略化できるような気がします。 COUNTIFS(Sheet2!b$2:b$1000,b2,Sheet2!c$2:c$1000,LARGE(INDEX((Sheet2!b$2:b$1000=b2)*Sheet2!c$2:c$1000,0),COUNTIF(Sheet2!b$2:b$1000,b2))) また、条件の論理に誤りはありませんか? 「その値を持つレコードからIDを抽出」とありますが、Sheet2のD列にそのIDが記載されているのでしょうか? Sheet2のB2:D1000の数表をカンマ区切りのテキストデータで貼り付けて頂ければ検証して数式の添削を考えられます。

pillow71
質問者

補足

ロウデータを一列ごとにコピーし直したら問題は解決しました。 大変お騒がせしました。 ただ、原因については特定できませんでしたので念のためご報告いたします。 ・条件の論理には誤りはありませんでした。 ・sheet2のC列にエラーメッセージが混在していました。 ロウデータの追加の仕方で、水平方向はダメで垂直方向はOKなんてあるのでしょうか?難しいですね。

回答No.4

> セルの戻り値は#num! 試しに   =IFERROR(MATCH(LA(略)000,0),0),"") としてみたら返り値はどうなりますか?

pillow71
質問者

補足

空白でした。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.3

動かない、セルの 戻り値は #REF、ですか? 其れとも… ?

pillow71
質問者

補足

動かない=計算式されない の意です。 セルの戻り値は#num! になっております。 何卒よろしくお願いいたします。

回答No.2

追記。 エクセルのオプション(数式)を ご提示の図通り(と言っても、初期値ですね)に戻して 1000行×30列のサンプルデータを作成、   B列:=INT(RAND()*10000)   ※乱数発生   C列:=RANK(B1,B:B)      ※範囲内での順位を判断   D~AD列:=INT(RAND()*10000)   ※乱数発生   A列:=MATCH(ROW(),C:C,0)   でやってみましたが、問題なく動いています。 1000行・・だとするとメモリをそこそこ消費するはずですから、 ご使用のPC環境・表の条件によっては表示が遅れるかもしれませんね。 とはいえ、最近のPCならほとんど問題ないと思うのですが・・ その辺りは環境がわからないと何とも言えませんね。

関連するQ&A

  • Excelの関数で

    お願いします。 Index関数とMatch関数を使用して表の中の値を求めようとしましたが、 検索行が複数あるため、うまくいきません。 検索する列は1列(a,b,c)ですが、検索行(あ、い、う~)が複数になっています。 更に空白もあります。 こんな感じ↓です。 ---------------------   あ  い   う   え      お   か ---------------------    a  10  20  30 b  40  50  60 c  70  80  90 --------------------- こういった場合にはどんな関数を使って一致する値を求めたら良いのでしょうか? 大変困っております。よろしくお願いします。

  • エクセル関数

    二つの条件から抽出する関数INDEXとMATCHをつかって作ってみたのですが行と列からの抽出ではなく二つの列からの抽出を行いたいと思います。 シート1 (データが既に入っております。)    A   B   C 1 \100 a123 tana 2 \200 h456 taka 3 \120 k789 yogi 4 \250 b456 ume シート2    A   B   C 1  k789 yogi シート2のC列に¥120と抽出する関数をご教授ください。 宜しくお願いいたします。

  • EXCELのINDEX関数(数行ごと抽出)について

    たくさん検索をして、数行ごとの値を抽出するしくみはおよそ解りました。 (OFFSETやINDIRECT関数もふまえてどれが最適かピンときていない;;) ひとまずINDEX関数を使ってみようかと思いましたが、 例えば「8行ごと抽出」の場合、 先頭がA1…でなく、数行飛ばして1つ目がA6にある時はどうすればよいでしょうか。 なかなか検索で出て来なくてエラーで困っています。よろしくお願いします。

  • エクセルの関数について

    エクセルの関数について いつもご回答者の方々にはお世話になっています。 関数でまた教えていただきたいのですが、 下記画像のようなデータ(解像度の規制上、1月の途中までのデータのみ表示しています)から、該当月の3行目の値が1になっている最初のセルの1行目(1 月であれば1/1)と、3行目の値が1になっている最後のセルの1行目(1月であれば1/6)の値を返すような関数はありますでしょうか? 条件は下記です。 ・C40-N51にそれぞれの月のデータを作成する。 ・作業用の列/行は作成できない。 ・3行目が1になっている何番目などではなく、最初と最後を指定したい。  (月によっては6が1日だけある日(31日)があり、その場合は本関数で導き出される最初と最後を○/31としたい。) 自分なりにHLOOKUPとMATCHなどを組み合わせてやってみたのですが、どうしてもうまくいかず。 識者の方々よろしくお願いいたします

  • エクセル関数:他と異なる値が入っている行の抽出

    エクセル関数:他と異なる値が入っている行の抽出 商品の注文データがありまして、 同じ商品でも違う価格が入っている場合の注文があります。 この注文について抽出して、セルにフラグを付けたいのですが・・・ 詳しい方がいましたら計算式を教えて頂けないでしょうか? 添付画像のように、 同じネクタイでも、価格が違う(少数派)の行について、 フラグを立てて抽出したいです。 何卒、よろしくお願いしいます。

  • エクセルのMATCH関数について

    エクセルのMATCH関数を使って“E18:E23”の表から125以下の1番目の値相当する”“E11:E16”の値を取り出す計算式を作成しています。(“E18:E23”表のそれぞれの行の数値が“E11:E16”の表のそれぞれの行の数値のリンクしています。そのときの数式が“=INDEX(E11:E16,MATCH(125,E18:E23,1),1)”です。この場合は上手くいくのですが、条件を“125以上の1番目の値相当するを作成して、”=INDEX(E11:E16,MATCH(125,E18:E23,-1),1)“の様にMATCHの式の最後を-1にするんですが、”#N/A“のエラーメッセージが表示します。どうすればいいのでしょうか?(*なお表“E18:E23”は数値が小さい順ですが、表“E11:E16”そうとは限りません)  それと、125以上の1番目だけでなく、2番目、3番目を拾い出す計算式はないでしょうか? 宜しくお願いします。関数に関しては初心者でいろいろ検索しましたが、ぴったり来ません。

  • 二次関数です

    わからなくて困ってます。 問題は、 関数Υ=Χ二乗の α≦Χ≦α+2における最大値と最小値との差が3であるとき、αの値を求めよ なんですけど計算したところ、答えが複素数になっちゃって・・・・ ちなみに  α=-√3 になりました。

  • Excel 関数入れたのに…

    Excelで計算式など関数をいれて保存したシートを保存して、再度ファイルを立ち上げると関数を入れて作ったはずの内容が値だけで表示されてしまうのです。 そのファイルを他のPCに転送して開くと問題ないのですが…。Excelの設定の問題なのでしょうか???? 情報がありましたら教えてください。

  • Excel 関数

    Excelの関数で教えていただきたいことがあります。 A       B      C  店舗コード 売上金額 商品名 1111     1,000    AAA 1111     2,000    BBB 1112     1,000    CCC 1111     2,000    DDD 上記のように、店舗別X商品別の売上金額一覧があります。こちらから、店舗別のTop10ランキングを作成したいです。金額のTop10は集計表の店舗コードをKeyとしてLarge関数で引っ張ってきていますが、商品名も同様に引っ張ってきたいです。しかしながら、参照テーブルでは同額のものがあるため、indexとmatchの入れ子, offset, indirect関数、indexとsumproductの入れ子でもやり方が正しくないようでエラーになってしまいます。 集計表では、 商品名  金額 で並べており、金額のところに店舗コードをKeyとしたLarge関数が入っています。こちらのLarge関数で指定している値と同じ行数の別の列数(B列を引っ張りたい)を返してくれればいいのですが、正しいやり方がわかりません。。。 どなたかご存じないでしょうか? よろしくお願いします!      

  • エクセルの関数についてです。

    エクセルの関数についてです。 とある目的で、添付画像のようなエクセルの テーブルを作ったのですが、 『E列の値が「"OK"」の行の、「C列の金額」を足し合わせる』  ※画像の例で言えば、「¥30,000+¥20,000+¥10,000」を、   E列の値を判定しながら行う。 こういう計算を行う、何か良い関数をご存知でしたら、教えて下さい。 何卒、宜しくお願い致します。

専門家に質問してみよう