データの分析、グラフ作成、および通信のためのツールを備えた Microsoft 表計算ソフトウェアのファミリ。
こんにちは。
最初に確認で申し訳ありませんが・・・。
①について:提示されている表は罫線でいくつかのブロックに分けられていますが、この罫線は無視して(空きの行も無視して)全ての品名をそのままの順番で処理するということで良いでしょうか?。
②について:品名とサイズの組み合わせが重複しない形にして、別シートに I 列(計)の集計を取りたいということですよね?。
その前提で、提示されている表のデータで集計を取ってみた結果が図1です。
<図1>
この表で良いとしてですが、ワークシート上で関数を使って処理したいとのご希望ですので、提示されている表の右側の J 列に「作業列」を設ける形で考えてみました。
- 以下、Sheet1 に提示されている表があり、Sheet2 に集計のための表(図1)を作ると仮定しています。
- Sheet2 には、最初にまず表の項目名(品名、サイズ、集計)を図1のように入力しておきます。
- Sheet1 の作業列 J5 セルの数式。
=IF(B5&C5="","",IF(COUNTIFS(B$5:B5,B5,C$5:C5,C5)=1,ROW(A1),""))
この数式を下方向に必要なだけコピーしておきます。
最大で 1000 行を処理する場合には 1004 行目までコピーが必要になります。
以降の数式中のセル範囲(行方向)は、仮に 1004 としています。
<動作概要>
最初の IF 関数で、対象の B 列および C 列の値が両方とも空白("")の場合に該当セルに空白("")を表示します。
そうでない場合には、COUNTIFS 関数によって、対象の B 列および C 列の値と同一のセルの個数をカウントし、2番目の IF 関数と ROW 関数で個数が1個の行位置( J5 セルを基準とした相対位置)を列挙していきます。
尚、個数が2個以上になる場合には空白("")を表示していきます。
ここでは、COUNTIFS 関数のセル範囲の参照の仕方に注意してください。
これにより、B 列と C 列の組み合わせが最初に現れる行位置のみ列挙することが可能になります。
※ Sheet2 の表に表示されるデータの行数は、この作業列に列挙される数値の個数により決まります。
図2で、作業列に列挙される数値を確認してみてください。
今回の場合、図2に表示されていない作業列には全て空白("")が表示されます。
<図2>
<参考サイト>
http://you-zou.com/pc/excel/unique-of-data/http://you-zou.com/pc/excel/unique-of-data/Sheet2 2. Sheet2 の A2 セルの数式
=IFERROR(INDEX(Sheet1!$B$5:$C$1004,SMALL(Sheet1!$J$5:$J$1004,ROW(A1)),COLUMN(A1)),"")
この数式を B2 セルにコピーし、A2 と B2 セルを選択したまま下方向に必要なだけコピーします。
<動作概要>
SMALL 関数と ROW 関数で、Sheet1 の作業列( J5 以降)の内容を数値の小さい順に取り出して INDEX 関数に行番号として渡し、該当セルの値を表示していきます。
尚、COLUMN 関数で列番号を指定することで、数式の右方向へのコピーを可能にしています。
IFERROR 関数は余分なエラー表示を空白("")に変えています。 3. Sheet2 の C2 セルの数式
=IF(A2&B2="","",SUMIFS(Sheet1!I$5:I$1004,Sheet1!B$5:B$1004,A2,Sheet1!C$5:C$1004,B2))
この数式を下方向に必要なだけコピーします。
(A 列および B 列と同一行数コピー。)
<動作概要>
IF 関数で、対象の A 列および B 列の値が両方とも空白("")の場合に該当セルに空白("")を表示します。
そうでない場合には、SUMIFS 関数で Sheet1 の B 列のセル範囲の値と Sheet2 の A 列の値を比較し、更に Sheet1 の C 列のセル範囲の値と Sheet2 の B 列の値を比較して、両方とも同一になる行位置を求め、Sheet1 の I 列の該当行の値を加算して表示します。
尚、3種類の数式が連携して動作しますので、手元の PC 環境では、1000 行程度でしたら1秒前後で処理が終わりましたが、10000 行の処理には最大8秒前後かかりました。
作業列の数式がネックになっていると思われます。
この点にご留意の上、よろしければお試しになってみてください。
余談ですが、処理する行数が 1000 行を超えるような場合に限って言えば、ここでご紹介した数式を使うよりもマクロ(連想配列)を使ったほうが処理速度は速いかと思います。
(1000 行と 10000 行の処理時間を比べてみただけですが・・・。)
Windows10Pro、Excel2016 の組み合わせで動作確認しています。
ご参考になれば幸いです。