配列数式の動作異常?MATCH及びMINについて

このQ&Aのポイント
  • Windows7、エクセル2016の環境で、配列数式においてMATCH関数とMIN関数が正しく動作しない現象が発生しています。
  • 最安価格の読み出しを行うために、以下の数式を使用しましたが、結果が999999999999999となってしまいます。
  • また、特定日以降の最初の売買単価を読み出すために以下の数式を使用しましたが、MATCH関数の最終項を-1にするとエラーが発生します。なぜこのような現象が起きるのでしょうか?
回答を見る
  • ベストアンサー

配列数式の動作異常?MATCH及びMIN

お世話になります Windows7、エクセル2016です。 概ね100000件には 到底達しない範囲の 件数不定で B列の3行目から下方に 店名●〇 、価格 157円、日付 2014/3/14。 店名×〇 、価格 305円、日付 2014/5/1。 店名●〇 、価格 156円、日付 2014/5/3。 等と、いったデータが 文字列で入力されています。 故あって 最安価格を読み出す必要がでた と、します 其処で =MIN(IFERROR(VALUE(MID($B$1:$B$100000,FIND ("単",$B$1:$B$100000)+2,FIND ("数",$B$1:$B$100000)-FIND ("円",$B$1:$B$100000)-2)),999999999999999)) と、してみました。 が、 上手く行きませんでした。 此の時 結果が何故か 999999999999999 と、なりました。 PF9で確認しても 同じでした 其処で 色々な場所に INDEX文を挟んで見ました ですが、だめでした =VALUE(MID($B$3:$B$10,FIND ("単",$B$3:$B$10)+2,FIND ("数",$B$3:$B$10)-FIND ("円",$B$3:$B$10)-2)) 此れをPF9で見ると ちゃんと値が出ていました また、 上記式を Ctrl+alt.+Enterで確定すると ちゃんと最小値が出ました にも、関わらず です。 何故でしょうか? また、 C3に 日付形式で記載された 特定日以降の 直近最初の売買単価 其れを読み出そう と、 =VALUE(MID(OFFSET($B$0,MATCH(C3,INDEX(IFERROR(DATEVALUE(MID($B$3:$B$100000,FIND ("日",$B$3:$B$100000)+2,FIND ("。",$B$3:$B$100000)-FIND ("円",$B$3:$B$100000)-2)),0),,),-1)-1,0,1,1),FIND ("単",$B$3:$B$100000)+2,FIND ("数",$B$3:$B$100000)-FIND ("円",$B$3:$B$100000)-2)) と、してみました。 此の時、 MATCH文の最終項を1 と、すると 直近直前のデータが読み出されました が、同様に MATCH文の最終項を-1 と、すると データ候補が 目視確認できる にも関わらず 確かエラーが出ました 何故、こんな事に なるのでしょうか? 以上2点、お教えください

  • Nouble
  • お礼率91% (1698/1856)

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

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

>ですかね? >此で如何でしょうか? 空白や改行が数式内に含まれると正しい数式と認められませんので、Excelの数式バーからコピーした文字列を直接貼り付けてください。 OFFSET関数の参照セルを$B$0としていますがそれは認められませんので$B$1にしてください。従って、行位置の隔たりを調整する必要があるでしょう。(ご自身でチェックしてください) また、前回の回答でMATCH関数の照合の種類と並び順を説明しましたが、ご理解いただけていないようです。 照合の種類が-1の時は検索範囲の値が降順(大きい順)にソートされていなければなりませんが、提示の模擬データでは昇順(小さい順)になっています。 >あと、MINの話ですが前はINDEX文を介在させるとEnterでの通常確定で結果が出た >今回は何故此が出来無いのでしょうか? 複数の関数を組み合わせた数式で引数が関数の演算結果であり、然も、配列値となる場合は基本的にCtrl+Alt+Enterキーで確定することになるようです。 =MIN(INDEX(IFERROR(VALUE([文字列]),[数値]),0)) 上記の数式モデルでVALUE([文字列])がエラーを含む配列値であるため、IFERROR関数を経由してINDEX関数へ配列値を引き渡すことになり、暗黙の了解事項が成立しないようです。 INDEX関数は配列を引数として扱うことは暗黙の了解事項であり、四則演算や論理演算の結果を配列として扱うことは暗黙の了解事項とされていることのようです。 関数の演算結果も暗黙の了解事項で処理されるケースもありますが、暗黙の了解事項が認められないことも多くあります。(例示は調査が必要なので省略します) トライ&エラーで対処してください。

Nouble
質問者

お礼

有り難うございます

Nouble
質問者

補足

敢えて口にするほどの事でもない事ですが 〉空白や改行が… 式中に空白や改行が入っても 問題ないですよ 〉Enterキーで確定することにな… そうでもないですよ

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

#2のご回答のようなのがご希望だろうが、私はむつかしい方法を選択しておいて、質問とその回答を複雑にしているように思う。多分「聞いていることに答えろ」と質問者がいうのは、予想されるが、あえて私は下記を薦めたい。 (1)まずテキストの形式の、エクセルデータに適さないデータの状況を、エクセルのデータらしくする。 まずデーター区切り位置で「、」でf各フィールドに分ける。 そして (2)価格は関数で=SUBSTITUTE(SUBSTITUTE(B4,"価格",""),"円","")*Iなどで 価格 157円 を157にする。 日付は=SUBSTITUTE(SUBSTITUTE(C3,"日付",""),"。","")などで 日付 2014/3/14。ーー>2014/3/14にする。日付として使うならさらに加工が必要かも しれない。 店名は略(「店名」がついていても良いだろうから)。 (3)挿入ーピボットテーブルで 例データとしてたとえば 店名 価格 A 23 B 34 A 12 B 11 C 32 A 41 A 42 で、 行  店名 Σ値は 最小値/価格 を指定して、結果は 行ラベル 最小値 / 価格 A 12 B 11 C 32 総計 11 のように区分ごとの最小値が簡単に出る。 10万行ぐらいなら、数量的な心配はないだろう。 ーー #1に対する、質問者のお礼を読んで、質問者がそこまで言うか、と思った。 上記に気に食わなくても「有難うございました」で、スルーして済ましてくださいね。条件該当分の抜き出しを、複雑な関数や配列数式に頼る質問者が多いが、常々疑問に思っている。 FilterやVBAでやれば簡単とかの質問も多いように思う。

Nouble
質問者

お礼

有り難うございます ご意見を受け取りました。 〉あえて私… 解りますよ でもそんな仰る様な事は 抑も不要です 何故なら 手作業を挟む 此れを良し と、するならば エクセルにある基本機能である データ区切り機能 でしたか で 数値部だけを区切り 予め整え用意しておいたシートから 参照する事で お示しの事は 勘弁に得れます よね? 現行は 此の手間を必要 と、していました 今回のものは 此の手間を省く 其のためのもの で、あり 逆に手間を掛けよ は、お示しの通り 本末転倒なのです なお、 ある種の塊 に引っかかってらっしゃる様 〉常々疑問… なので お礼の意味を込めて 少しお役に立てれば と、意見を述べます。 できる、 と、していい、 此れ等は別 ですよね? ある程度、誰でも 人を殺せます でも、殺してはダメ 当たり前ですよね 同様に VBA使用をためらったり 許されない方 其れ等は居ます また、手間をかければ簡単な事も 逆に見れば 省力化に逆行する時 此れもあります。 省力化へ向かう改善者は 場合により 其れなりな式を 扱う必要がある 此の様に 質問者には 其処に向かわせる背景がある ですよね? こう思えば 抱かれる蟠りも 少しは消え 健やかな日々が 貴方のものになる と、思います。 と、いう事で 今回、私にも 背景があります 抑も今回、 私が求めるものは VBAを操り ユーザー関数を作り 使用すれば 簡単勘弁な事 ですよね? 解っていて 敢えて回避している なのです。 申し訳有りませんが ご理解頂き 入りかけた袋小路を 回避頂きたく思います。

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

模擬データが次のものとすると提示の数式に誤りがあります。 店名●〇 、価格 157円、日付 2014/3/14。 店名×〇 、価格 305円、日付 2014/5/1。 店名●〇 、価格 156円、日付 2014/5/3。 上記3行のデータについて確認します。 、は区切り記号と考えればA列に店名、B列に文字列で価格、C列に文字列の日付になります。 B3セルに「店名●〇 、価格 157円、日付 2014/3/14。」と言う文字列とし、B4以下も同様の文字列と考えても提示の数式では目的の値を抽出できません。 提示の数式でFIND関数の検索文字が"単”と"数"になっていますので、B列の模擬データには"単"も"数"もないのでエラーとなり、999999999999999が返ることになります。 B3="店名●〇 、価格 157円、日付 2014/3/14。" =MIN(IFERROR(VALUE(MID($B$1:$B$100000,FIND ("単",$B$1:$B$100000)+2,FIND ("数",$B$1:$B$100000)-FIND ("円",$B$1:$B$100000)-2)),999999999999999))       ↓ =MIN(IFERROR(VALUE(MID($B$1:$B$100000,FIND("価",$B$1:$B$100000)+2,FIND("円",$B$1:$B$100000)-FIND("価",$B$1:$B$100000)-2)),999999999999999)) この数式はVALUE関数の返り値が配列値になりますので、数式の確定時にはCtrl+Alt+Enterキーの打鍵が必要です。 MATCH関数の照合の種類には次のような規則があります。 照合の種類の1は検索範囲の値が昇順に並んでいるときに有効で、-1は検索範囲の値が降順に並んでいるとき有効に作用します。 0は照合の値と一致する値が無いときはエラーになります。 関数のヘルプで使い方を習得されると良いでしょう。

Nouble
質問者

お礼

有り難うございます。 失政しました 投稿に際し 初期に考えたデータ形式を 投稿間際で変えたのですが 其の変更を 式に適応し忘れました 申し訳ない。 訂正も頂いている様ですが 自ら訂正します 偽 =MIN(IFERROR(VALUE(MID($B$3:$B$100000,FIND ("単",$B$3:$B$100000)+2,FIND ("数",$B$3:$B$100000)-FIND ("円",$B$3:$B$100000)-2)),999999999999999)) =VALUE(MID(OFFSET($B$0,MATCH(C3,INDEX(IFERROR(DATEVALUE(MID($B$3:$B$100000,FIND ("日",$B$3:$B$100000)+2,FIND ("。",$B$3:$B$100000)-FIND ("円",$B$3:$B$100000)-2)),0),,),-1)-1,0,1,1),FIND ("単",$B$3:$B$100000)+2,FIND ("数",$B$3:$B$100000)-FIND ("円",$B$3:$B$100000)-2)) 正 =MIN(IFERROR(VALUE( MID($B$3:$B$100000, FIND ("価",$B$3:$B$100000)+2, FIND ("円",$B$3:$B$100000) -FIND ("価",$B$3:$B$100000)-2) ),999999999999999)) =VALUE(MID(OFFSET($B$0,MATCH(-C3,-INDEX( IFERROR(DATEVALUE( MID($B$3:$B$100000, FIND ("日",$B$3:$B$100000)+2, FIND ("。",$B$3:$B$100000) -FIND("日",$B$3:$B$100000)-2 )),0),,),-1)-1,0,1,1), FIND ("価",$B$3:$B$100000)+2, FIND ("。",$B$3:$B$100000) -FIND ("価",$B$3:$B$100000)-2) ) ですかね? 此で如何でしょうか? あと、MINの話ですが 前はINDEX文を介在させると Enterでの通常確定で 結果が出た 今でも物によっては 此の方法で 通常確定できる と、思います。 今回は何故 此が出来無いのでしょうか? お教えください。

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.1

質問文が長大過ぎて読み終わっていないけど、 》 …等と、いったデータが文字列で入力されています 》 故あって最安価格を読み出す必要がでた 「データが」すべて「文字列で入力されて」は、Excel を操作する人の仕業とは思えません。 「価格」の「円」は取っ払って、「日付」も日付形式(←分かる?)で入力し直すっても「故あって」不可能ですか?

Nouble
質問者

お礼

ご来訪には感謝致します 有り難うございます 〉操作する人の… 仰る通りです 思えなくて当然です 人がそういうデータを入力した とは、申してません よね? 変更不可ですし 回答の本質は式の評価 と、エクセルの動作不良評価 ですよね? 〉価格」の「… 式を読めばお分かりになる と、思います 無用の進言 ですよね? 更に、 質問文中に 日付形式で入力された との記載も、しましたし DATEVALUEも使っていますよね? 〉(←分かる?… 読まずに 此方の技量を 著しく低く見積る のは 失礼に思いますよ あと其れ、余談では? 式以外 長い と、いうほどの ものでなく 読まない 此れは失礼では? で、なくとも 少々早計な気がします 此のスレッドは 全環境で動作不良なのか 此の確認 でも、あります 故にある程度エクセルを知り尽くしたものの トラブルレポートでもあります。 ので いささか不愉快ですよ

関連するQ&A

  • 文字列の中から複数の数値を取り出す

    A1に画像のような2パターンの複数の数値入りの文字列が入っています この数値を1つずつ分けたい 当方 Excel 2013です 1. 現状 FIND の多用で実現できているのですが、数値が増えるとややこしくなるので、分かりやすくできないものかと質問しました。 2. また今後の拡張のため、数値の区切りを"/"でなく数値以外(2文字以上でもOK)で作れないかと模索しています。 気温28度、湿度54.7%、AB123C-456DEF7890GH-123.45JKL・・・ ←こんなのを 28 54.7 123 -456 7890 -123.45  ・  ・  ・ 合わせてご教授いただきたくお願いいたします。 一応、今使っているものを書いておきます、 A3  =VALUE(LEFT(A1,FIND("/",A1)-1)) A4  =VALUE(MID(A1,FIND("/",A1)+1,FIND("/",A1,FIND("/",A1)+1)-FIND("/",A1)-1)) A5  =VALUE(MID(A1,FIND("/",A1,FIND("/",A1)+1)+1,FIND("/",A1,FIND("/",A1,FIND("/",A1)+1)+1)-FIND("/",A1,FIND("/",A1)+1)-1)) A6  =IFERROR(VALUE(MID(A1,FIND("/",A1,FIND("/",A1,FIND("/",A1)+1)+1)+1,FIND("/",A1,FIND("/",A1,FIND("/",A1,FIND("/",A1)+1)+1)+1)-FIND("/",A1,FIND("/",A1,FIND("/",A1)+1)+1)-1)),LOOKUP(10^17,RIGHT(A1,COLUMN($1:$1))*1)) A7  =IFERROR(VALUE(RIGHT(A1,LEN(A1)-FIND("/",A1,FIND("/",A1,FIND("/",A1,FIND("/",A1)+1)+1)+1))),"-") 余談ですが A3 を =LOOKUP(10^17,LEFT(A1,COLUMN($1:$1))*1) とすると誤表示になった

  • Excel 配列数式の応用?

    先の質問で、下記のことができるようになりました。 下記のような土日を除いた日付データでセルA11、A12に期首、期末の日付を指定すると、その期間の合計がセルC11に{=SUM(IF((A1:A9>=A11)*A1:A9<=A12),C1:C9,""))}の式で出せるようになりました。 平均もSUMをAVERAGEに変えて出せるのですが、 期間中のマイナスのデータ個数 =COUNTIF(C3:C9,"<0") のような値を 期首、期末の日付の指定で求める式は、どのような式でできるのでしょうか?お教え下さい。 ( 9行以降は行の挿入で新たなデータが追加されます。A列・・日付 B列・・曜日 C列・・数値等) 列行 A  B  C  1 10/01 金 3 2 10/04 月 0 3 10/05 火 空欄 4 10/06 水 -2 5 10/07 木 文字 6 10/08 金 -1 7 10/11 月 4 8 10/12 火 2 9 10 ------------------------------------ 11 10/04 (期首) 2 (←セルC11にマイナスのデータ数を出したい) 12 10/11 (期末)

  • FIND関数の値が#VALUE!の場合の非表示

    エクセルで、セルの値に「virus」の文字列がある場合、「virus」と書く関数をFINDとMID関数で作ってみました。 =MID(C3,FIND("virus",C3),FIND("virus",C3)+4) この式だけだと、FINDの結果が無いときに、「#VALUE!」の文字が出てきます。この「#VALUE!」の文字を非表示にしたいと思い、IF文や条件付書式を試すのですが、「#VALUE!」は、長さ0の文字列””でもNULLでもないため、数式になりません。 良い方法をご存知の方教えてください。 よろしくお願いします。

  • 関数で複数データを取り出す(配列数式を使う)

    参照サイト:http://www.eurus.dti.ne.jp/~yoneyama/Excel/waza/fukusu_data.html A列日付、B列商品、C列販売数が並んでいるシートが有ります。 同シートにG2に日付を設定、その日付に一致するデータだけを G5以下日付、H5以下商品、I5以下販売数を反映させます。 G5セルに=IF(COUNTIF($A$2:$A$11,$G$2)<ROW(A1),"",INDEX(A$2:A$11,SMALL(IF($A$2:$A11=$G$2,ROW($A$1:$A$10)),ROW(A1)))) の関数を記入します。 上記の条件は、参照サイトの下側ページそのままの条件です。 しかし、参照サイトでは、11列ぐらいまでしか反映されません。 100列ぐらいまで伸ばして使いたいのです。 関数をどこを改造したら反映列を増やせますか? よろしくお願いします。

  • excel match で日付が見つからない

    ■困っていること vbaの worksheetfunction のmatach関数を用いているが、日付が見つかってくれない。 なぜ見つからないか、原因を教えていただけないでしょうか?よろしくお願いします。 ■状況、やりたいこと 下記、コードで、「fRow」と「syu」までは正しく求められるのですが、「tcol」を求めようとすると、どうしても0になってしまいます。 ワークシートはD1セルに日付を入力おり、さらに右のセルへ行く毎に+7しています。「syu」の日付がどの週に該当するのかを、列数で求めたいです。 例えば、10年3月17日なら、Fの列なので 6 を求められるようにしたいです。 sub test() Dim fRow As Long Dim tcol As Long Dim syu As long With Worksheets("data") Set fRange = Sheets("data").Columns(1).Find(What:=TextBox1.Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then Exit Sub End If fRow = fRange.Row   syu = .Cells(fRow, 2).Value tcol = Application.WorksheetFunction.Match(syu, .Range("1:1"), 1) msgbox tcol   end with end sub

  • テーブルから複数のレコードにマッチする条件

    以下のようなSQL文があった場合 SELECT table_a.* FROM table_a LEFT JOIN table_b ON (table_a.id = table_b.aid) これでtable_bを連結したtable_aができると思いますが、table_bのフィールドは id , aid, value となっていた場合、valueが「1」かつ「2」のデータを検索する場合は、どのようにWHERE句を書けばいいのでしょうか。 WHERE (table_b.value = '1' AND table_b.value = '2') ではうまく取得出来ませんでした。 お分かりの方、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • エクセルの以下の算式の説明をして欲しいです。Mshr1962さんの答えです。

    A1にもとデータが入っているとして B1=MID(A1,3,SUMPRODUCT(NOT(ISERROR(VALUE(MID(A1,3,{1,2,3,4}))))*1))+0

  • EXCEL関数の配列の考え方について

    EXCEL関数の配列について、ご教授願います。 具体的には、集計作業で条件を絞り込む時、例えば、列Aでは文字列「あ」又は「い」を含み、列Bでは文字列「う」、「え」、または「お」を含むデータ数を集計する場合、 =SUMPRODUCT((A1:A100={"あ","い"})*(B1:B100={"う","え","お"}))・・・(1) 私はいつもこの方法を使用しています。この場合、列Aでの条件数(「あ」「い」の2つ)と列Bでの条件数(同3つ)が異なっている場合でも、特に問題は起こりません。 但し、これを下記のように書き換えます。 =SUMPRODUCT(ISNUMBER(FIND({"あ","い"},A1:A100))*ISNUMBER(FIND({"う","え","お"},B1:B100)))・・・(2) (2)式は(1)式と同じ意味を示すはずですが、こちらは#N/Aでエラーとなります。調べてみたところ、列Aの条件数(2つ)と列Bの条件数(3つ)が異なる場合(どちらかの条件数が1の場合を除く)、エラーになるという事実は判明しましたが、計算式内部でどのような処理が行われた結果、そうなったのか、全く分かりませんでした。恐らく、EXCELの配列や行列式の考え方が両者で異なっているからだと思うのですが、ネットで調べてもその答えらしきものを見つけることができませんでした。  これについて、ご存知の方、どうぞご教授下さいます様、お願い致します。

  • エクセルについて教えてください<(_ _)>

    エクセルの式に数時間悩んでます・・。 外はすでに明るくなっていて、時間がなくなってきたのでみなさまに力を貸して頂きたく質問させてもらいます<(_ _)> 6時間掛かっても出来ませんでした(T_T) エクセルの、セル内の一部を取り出したいのです。 A1のセルに「あいうえお[マル]1-2[××会社]」と言うデータが入っていて、[××会社]の部分だけ取り出ししたいのです。 ただ、会社名は、5社だけです。 なお、データーによって、文字数はバラバラです。 会社名も、文字数バラバラです。 私が考えていたのは、MID(A1,FIND("[××",A1),LEN(A1))です。 この式ですと、××会社は出力出来ました。 同じ方法で、◯◯◯会社も出来ました。 MID(A2,FIND("[××",A2),LEN(A2)) なので、他も同じように式を作り、ORなどで1つの式にするのは難しいでしょうか? 会社別では、なくランダムにデーターが並んでいて、量が多い為1つの式でそれぞれ出力できたらとっても助かります・・。 自分の力では出来ませんでした・・(>_<) 式を入力するたび、”#VALUE”が並んでいて泣きそうです・・。 (ORとかIFとか使ってみたのですが・・・) よろしくお願いします。<(_ _)>

  • エクセル:横一列のデータを別の形式の表にしたい

     ある製品の発注数を店舗・日付け別の表にする必要があります。元データから目的の表を作成するために、効率がよく間違いが極力少ない方法を教えて下さい(ちなみに今は元データを見ながら手入力しています)。    <元データ>    一列に、店番号・店名・日付け・発注数などの    項目が並んでいる。(これが500行ほどあります)  <目的の表>基本的な形式の変更はできません。     縦軸に店番号と店名、横軸に日付(1ヶ月分)。店名と日付を結んだセルに、発注数を入力。  よろしくお願いします。

専門家に質問してみよう