作業列を使わなくとも済む様に、SUMPRODUCT関数を使って処理を行う際に、仕入日として同じ日付が複数入力されていたり、元のデータが入日順には並んでいなくとも、Sheet2では在庫のみが入日順に表示されている様にするためには、A列からE列まで同じ形式の関数を使ったのでは、非常に長い関数が必要となりますので、多少なりとも短い関数で済ますためには、仕入日を抽出する関数と、仕入日以外のデータを抽出する関数の、2種類の関数に分けて、次の様にする必要があります。(仕入日順に並べずとも良いのでしたら、回答No.5様の方法の様に、もっと短い関数で済ます事も出来るのですが)
まず、Sheet2のC2セルに次の関数を入力して下さい。
=IF(ROWS($2:2)>COUNTIFS(Sheet38!$C:$C,">1",Sheet38!$E:$E,"在庫"),"",SMALL(Sheet38!$C:$C,SUMPRODUCT(ISREF(INDIRECT("Z1:Z"&COUNT(Sheet38!$C:$C)))*(COUNTIFS(Sheet38!$E:$E,"在庫",Sheet38!$C:$C,"<="&SMALL(Sheet38!$C:$C,ROW(INDIRECT("Z1:Z"&COUNT(Sheet38!$C:$C)))))<ROWS($2:2)))+1))
次に、Sheet2のA2セルに次の関数を入力して下さい。
=IF(ISNUMBER($C2),IF(INDEX(Sheet1!$A:$E,SUMPRODUCT(ISREF(Sheet1!$C$1:INDEX(Sheet1!$C:$C,MATCH(9E+307,Sheet1!$C:$C)))*(COUNTIFS(OFFSET(Sheet1!$E$1,,,ROW(Sheet1!$C$1:INDEX(Sheet1!$C:$C,MATCH(9E+307,Sheet1!$C:$C)))-ROW(Sheet1!$C$1)+1),"在庫",OFFSET(Sheet1!$C$1,,,ROW(Sheet1!$C$1:INDEX(Sheet1!$C:$C,MATCH(9E+307,Sheet1!$C:$C)))-ROW(Sheet1!$C$1)+1),$C2)<COUNTIF($C$1:$C2,$C2)))+ROW(Sheet1!$C$1),COLUMNS($A:A))="","",INDEX(Sheet1!$A:$E,SUMPRODUCT(ISREF(Sheet1!$C$1:INDEX(Sheet1!$C:$C,MATCH(9E+307,Sheet1!$C:$C)))*(COUNTIFS(OFFSET(Sheet1!$E$1,,,ROW(Sheet1!$C$1:INDEX(Sheet1!$C:$C,MATCH(9E+307,Sheet1!$C:$C)))-ROW(Sheet1!$C$1)+1),"在庫",OFFSET(Sheet1!$C$1,,,ROW(Sheet1!$C$1:INDEX(Sheet1!$C:$C,MATCH(9E+307,Sheet1!$C:$C)))-ROW(Sheet1!$C$1)+1),$C2)<COUNTIF($C$1:$C2,$C2)))+ROW(Sheet1!$C$1),COLUMNS($A:A))),"")
次に、Sheet2のA2セルをコピーして、Sheet2のB2セルとSheet2のD2~E2のセル範囲に貼り付けて下さい。
次に、Sheet2のC2セルの書式設定の表示形式を[日付]として下さい。
次に、Sheet2のD2セルの書式設定の表示形式を[通貨]とし、金額の頭に付ける記号を「\」になる様に設定して下さい。
次に、Sheet2のA2セル~E2の範囲をコピーして、同じ列範囲の3行目以下に貼り付けて下さい。
これで、Sheet2に在庫だけが、仕入日順に表示されます。
尚、配列式やSUMPRODUCT関数は、データの組の数だけ同じ様な計算を繰り返して行うもので、この場合のデータの組の数は、計算の対象としている行範囲に含まれている行数になります。
例えば、配列式やSUMPRODUCT関数の中で、処理の対象としているセル範囲を、C2:C1000等とした場合には、999回(C1セルは指定されているセル範囲外となるため、計算の対象となるのは、2行目~1000行までの999行になります)に亘って同じ形式の計算が繰り返される事になります。
このため、配列式やSUMPRODUCT関数は、繰り返し計算の対象となる行数が多いと、処理が重くなりやすく、数千行もの行数に亘って入力されているデータを処理する場合には、処理に時間が掛かり過ぎるため実用的ではなくなってしまいます。
ですから、数百行程度のデータを対象とする場合には、配列式やSUMPRODUCT関数は便利ですが、(パソコンの性能にもよりますが)2000行以上にもなる場合には、配列式やSUMPRODUCT関数を使うのは避けて、作業列を使う方法で処理した方が良いと思います。
お礼
ありがとうございました。 解決いたしました。