- 締切済み
SUMPRODUCT関数について
SUMPODUCT関数を使ったとき、並び替えをすると参照する値がずれて困っています。 たとえば、ある会に参加した人を調べたいとします。 A B C 1 参加日 名前 出身 2 12/1 aaa 東京 3 bbb 千葉 4 ccc 埼玉 ・ ・ ・ 50 12/4 kkk 千葉 51 ppp 静岡 E F G 名前 出身 参加数 1 aaa 東京 1 2 bbb 千葉 1 3 ccc 埼玉 2 ・ ・ 50 kkk 千葉 1 51 ppp 静岡 2 A・B列にデータの一覧が入っていて、この中から「aaa」さんかつ「東京」が何回参加したかを調べたいのでG列に、=SUMPRODUCT(($A$1:$A$2000=E2)*($B$2:$B$2000=F2))という数式を入れています。 A~C列のデータは今は200くらいなんですが、今後も増えていく予定で2000は行く予定です。 A~C列はその日ごとの参加者が書いてあるデータ欄で E~Gは参加者の一覧(集計欄)にしています。 ランダムに名前を打っているのであいうえお順に並び替えるために E~G列を名前優先で並びかえをするとG列の参照範囲がずれてしまいます。 これがずれないようにすることはできないでしょうか? 参加者を数える作業は会が終わったごとにするので随時A・Bのデータが増えていくことになります。 excel2003を使用しています。 参照範囲がずれないようする方法がありましたらお聞きしたいです。 また、いまいちどうやって集計するのが効率的なのかわからず、考えた末この方法にしたのですが もっと簡単に集計できる方法がありましたら教えていただきたいです>< よろしくお願いいたします。
- a_pin
- お礼率28% (2/7)
- その他(ビジネス・キャリア)
- 回答数3
- ありがとう数1
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kagakusuki
- ベストアンサー率51% (2610/5101)
>INDEXやROWは使ったことないので解読するのに苦労しています・・笑 まず、INDEX関数は INDEX(範囲, 行番号, [列番号]) という形式で表される関数で、「範囲」の所で指定したセル範囲内において、上から数えて「行番号」番目にあたる行の中の、左から数えて「列番号」番目の所にあるセルを指定する関数です。 そして、範囲の所に1列のみ(或いは1行のみ)の直線上に並んだセル範囲を指定した場合には、 指定したセル範囲の幅(或いは高さ)は1セルしかありませんから、[列番号]は1以外にはありえない事になりますので、[列番号]を省略して、 INDEX(直線状の範囲, 行番号) という形式で記述する事が出来ます。 例えば、「範囲」にA列全体を指定し、「行番号」に2をして INDEX(A:A,2) とした場合、A列において上から2番目の所にあるセル、即ち、A$2セルを指定したのと同じ事になります。 又、「範囲」の指定方法を絶対参照にして、 INDEX($A:$A,2) とした場合には、$A$2と指定したのと同じ事になります。 次に、ROW関数は、関数の括弧内に指定したセルの行番号を返す関数です。 例えば、 ROW(D3) とした場合には、D3セルが存在している行である3行目の行番号である3という数値が返されます。 そして、ROW関数の括弧内にセル番号を何も入力せずに、 ROW() とした場合には、その関数を入力しているセルの行番号が返されます。 つまり、 ROW() という関数を、例えばI2セルに入力した場合には、I2セルの行番号である2が返されますし、G5セルに入力した場合には、G5セルの行番号である5が返される事になります。 さて、そうしますと、例えばI2セルに INDEX($A:$A,ROW()) と入力しますと、ROW関数の部分は2が返されますから、 INDEX($A:$A,ROW()) ↓ INDEX($A:$A,ROW(G2)) ↓ INDEX($A:$A,2) ↓ $A2 という事になり、$A2セルを指定した事と同じ事になります。 一方、同じ関数を例えばG5セルに入力した場合には、$A5セルを指定した事と同じ事になります。 つまり、 INDEX($A:$A,ROW()) という関数は、A列における同じ行のセルを指定したのと同じ事になります。 同様に、例えば INDEX($B:$B,ROW()) とした場合には、B列における同じ行のセルを指定したのと同じ事になります。 又、 INDEX($A:$A,ROW()-1) とした場合には、A列における1行上の行のセルを指定したのと同じ事になります。 処で、 INDEX($A:$A,ROW()) という関数の中には、列番号が指定されているだけで、特定のセル或いは行などは何も指定されていません。 そのため、この関数を例えばG5セルに入力した場合には、$A5セルを参照している事になるからと言って、並べ替え等を行った際に、A5セルの位置がずれてしまい、例えば3行下のA8セルに変わってしまったとしましても、 ROW() という部分が勝手に、 ROW()+3 に変化してしまう訳ではありませんし、ROW関数の所で返されている5という値は、A5セルの行番号ではなく、関数が入力されているG5セルの行番号なのですから、A5セルの位置がずれたとしても影響される事はありません。 従いまして、この方式でセルを指定しますと、並べ替えや、セルの切り取り・挿入等のセルの位置が変わってしまう様な操作を行っても、上下方向のずれに関しては影響を受ける事はまずなくなる訳です。 SUMPODUCT関数に限らず、関数を用いている場合には、セルの位置がずれてしまうと正しい結果が得られなくなる事が多いので、この手法でセルを指定すると便利です。 尚、1番上の項目名が入力されているセルの位置がずれる事はまずありませんので、$B$1等は、そのままセル番号を指定しています。 解読に苦労されておられるとの事ですが、 「このROW関数が2行目のセルに入力されているから、この部分の数値は2になるので、INDEX($A:$A,ROW())の部分はA2セルを参照していて…」 などという事を一々考える様な事はなさらずに、 「INDEX($A:$A,ROW())という記述の所は同じ行のA列のセルである」 と考えれば良いと思います。
- kagakusuki
- ベストアンサー率51% (2610/5101)
済みません、色々と間違えておりました。 >=SUMPRODUCT(($A$1:$A$2000=E2)*($B$2:$B$2000=F2)) という事ですが、実際には、名前が入力されているのはA列ではなくB列であり、出身が入力されているのはB列ではなくC列なのですね。 そうなりますと、SUMPRODUCT関数を使う方法において、G2セルに入力する関数は、次の様な関数となります。 =IF(OR(INDEX($E:$E,ROW())="",INDEX($F:$F,ROW())=""),"",SUMPRODUCT(($B$1:INDEX($B:$B,2000)=INDEX($E:$E,ROW()))*($C$1:INDEX($C:$C,2000)=INDEX($F:$F,ROW())))) 又、作業列を使う方法において、I2セルに入力する関数は、次の様な関数となり、 =IF(OR(INDEX($B:$B,ROW())="",INDEX($C:$C,ROW())=""),"",INDEX($B:$B,ROW())&"★"&INDEX($C:$C,ROW())) G2セルに入力する関数は、次の様な関数となります。 =IF(OR(INDEX($E:$E,ROW())="",INDEX($F:$F,ROW())=""),"",COUNTIF($I:$I,INDEX($E:$E,ROW())&"★"&INDEX($F:$F,ROW())))
- kagakusuki
- ベストアンサー率51% (2610/5101)
参照範囲がずれない様にするだけでしたら、次の様な方法があります。 =IF(OR(INDEX($E:$E,ROW())="",INDEX($F:$F,ROW())=""),"",SUMPRODUCT(($A$2:INDEX($A:$A,2000)=INDEX($E:$E,ROW()))*($B$2:INDEX($B:$B,2000)=INDEX($F:$F,ROW())))) 或いは =IF(OR(INDIRECT("E"&ROW())="",INDIRECT("F"&ROW())=""),"",SUMPRODUCT((INDIRECT("A2:A2000")=INDIRECT("E"&ROW()))*(INDIRECT("B2:B2000")=INDIRECT("F"&ROW())))) 只、SUMPODUCT関数は繰り返し計算を行う関数で、計算対象とする行範囲に含まれている行数が増える程、繰り返しの回数も多くなるため、余り行数を多くしますと計算処理に要するコンピュータの負荷が大きくなり、計算を終了するまでに要する時間が長くなり過ぎるという短所があります。 ですから、 >A~C列のデータは今は200くらいなんですが、今後も増えていく予定で2000は行く予定です。 という事であれば、SUMPODUCT関数を使わずに済ませる方法に切り替えた方が宜しいのではないかと思います。 その様な場合には、一般的には、適当な列を作業列として使用する方法が使われます。 作業列とは、計算処理がしやすいようにデータの前処理を行うための関数が入力されている列とでも考えて頂ければよいかと思います。 例えば、I列を作業列として使用するものとした場合、まず、I2セルに次の様な関数を入力して下さい。 =IF(OR(INDEX($E:$E,ROW())="",INDEX($F:$F,ROW())=""),"",INDEX($E:$E,ROW())&"★"&INDEX($F:$F,ROW())) 次に、I2セルをコピーして、I3以下に貼り付けて下さい。 次に、G2セルに次の様な関数を入力して下さい。 =IF(OR(INDEX($E:$E,ROW())="",INDEX($F:$F,ROW())=""),"",COUNTIF($I:$I,INDEX($E:$E,ROW())&"★"&INDEX($F:$F,ROW()))) そして、G2セルをコピーして、G3以下に貼り付けて下さい。 これで、SUMPODUCT関数と同じ結果を、SUMPODUCT関数を使うよりも高速で求める事が出来ます。 尚、上記の例では、I列を作業列として使用しておりますが、別シートの列を作業列として使用しますと、印刷の際等において無用の表示内容が印刷されてしまう事を避ける事が出来ます。
関連するQ&A
- Excel2002:複数条件のデータの個数の集計
苦手な集計について質問させてください。 [A] [B] [1] AAA aaa [2] BBB bbb [3] AAA aaa [4] AAA bbb [5] BBB ccc 上記のようなデータで[A]と[B]のAND条件でみたときの個数を集計したいと思います。 例えば上記であれば、 [A]AAAかつ[B]aaa・・・2個 [A]BBBかつ[B]bbb・・・1個 [A]AAAかつ[B]bbb・・・1個 [A]BBBかつ[B]ccc・・・1個 になります。[B]のデータは[A]のデータに依存せず、[A]の各値にまたがっています。([B]bbbは[A]AAAと[A]BBBの場合があります) 実際のシートでは、全パターンを網羅したリストがA列とB列、集計対象がD列とE列にあります。 上記の例でいえば、以下のようになっています。 [A] [B] [C] [D] [E] [1] AAA aaa AAA aaa [2] AAA bbb BBB bbb [3] BBB bbb AAA aaa [4] BBB ccc AAA bbb [5] BBB ccc つまり[A]列と[B]列が組み合わせパターン、[D]列と[E]列が集計元データです。 ちなみにパターン数が414個、集計元データは29000個程度です。 そして最終的な各パターンの個数を[C]列に表示させたいと思います。 VLOOKUPやピボットテーブルを考えましたが、ピンと来ません。 適切なやり方を教えてください。よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- SUMPRODUCT関数の使い方
A列 aaa aaa bbb bbb ccc ccc と入力して、 「aaa」の個数と「bbb」の個数の合計を求める式を教えてください。 見た限りの答えは、「aaa」が2個、「bbb」が2個で4なのですが B1に 「=SUMPRODUCT(A:A="aaa",A:A="bbb")」 としたのですが、「0」が返ってきてしまいます。 B2に 「=SUMPRODUCT(COUNTIF(A:A,"aaa"),COUNTIF(A:A,"bbb"))」 だと、 4が返ってきますが A列を aaa aaa bbb にすると「3」が返ってきてほしいのに、2になってしまいます。 個数の合計を返す関数式をご教授ください。
- ベストアンサー
- オフィス系ソフト
- SUMPRODUCT関数について
アンケートの集計をするにあたって、 SUMPRODUCT関数を使いました。 シートが2つあります。 【データ】シート・・・アンケートのデータ A:No. B:データ 1 0 2 1 3 2 4 3 5 空欄が入っている ・ ・ 【集計】シート・・・B列の空欄、1~3の個数を集計する B列に数式 =SUMPRODUCT((データ!$A$4:$A$40000<>"")*(データ!B$4:B$40000=$A4)) を入れました。 A B 0 2 ・・・・※ 1 1 2 1 3 1 空欄 2・・・・※ 0(ゼロ)と空欄を区別しないで同じと計算してしまいます。 データに、ゼロと空欄が混在している場合、SUMPRODUCTは使えないのでしょうか? この場合、どの数式を使うのがベストでしょうか? 分かりにくくて申し訳ありませんが、 宜しくお願い致します。
- ベストアンサー
- オフィス系ソフト
- VBAで特定の値がある行を連続コピーしたい
Excel 2003 OS XP Professional SP3 VBAは自分でコードは組むことはできませんので見よう見まねでやっているレベルです。 A B C D E の列があり、行の1行目はタイトル行になっています。 A B C D E *** *** *** *** *** ’ AAA BBB CCC DDD 111 222 333 ' EEE FFF GGG HHH ' III JJJ KKK LLL 444 555 ' MMM NNN OOO PPP A列にカンマがある行にはB~E列に値が入力されていて、A列にカンマ以外の値が入力されている 場合にはB~Eには何も入力されていません。 A列にカンマ以外の値の時、カンマのある行のデータを次のカンマのある行までフィルハンドルをドラッグしてコピーするよう にしたいです。 A B C D E *** *** *** *** *** ’ AAA BBB CCC DDD 111 AAA BBB CCC DDD 222 AAA BBB CCC DDD 333 AAA BBB CCC DDD ' EEE FFF GGG HHH ' III JJJ KKK LLL 444 III JJJ KKK LLL 555 III JJJ KKK LLL ' MMM NNN OOO PPP sub 連続コピー() Dim r As Long Dim n As Long r = 2 n = r + 1 Do While Worksheets("sheet1").Cells(r, 1) <> "" If Worksheets("sheet1").Cells(r, 1).Value = Worksheets("sheet1").Cells(n, 1).Value Then r = n n = n + 1 Else Range(Cells(r, 2), Cells(r, 5)).Copy Range(Cells(n, 2), Cells(n, 5)) n = n + 1 End If Loop End Sub 自分なりに考えてみましたが、ぜんぜん動きません。 どなたかご教授をお願いします。
- ベストアンサー
- オフィス系ソフト
- Excel比較関数について教えてください。
下記のようにA列とC列を比較して、 一致した値が存在する場合、B列とC列を比較して、 E列に一致した場合は、●一致しない場合は、空欄にしたいのですが教えてください。 A列 B列 C列 D列 E列 12345 aaa 12389 bbb A2と一致したので● 12389 bbb 22222 bbb 一致しないので空欄 33333 bbb 12345 aaa A1と一致したので●
- ベストアンサー
- オフィス系ソフト
- Excel比較関数について教えてください。2
下記のようにA列とC列を比較して、 一致した値が存在する場合、B列とC列を比較して、 E列に全て一致した場合は○、一致しない場合は×にしたいのですが教えてください。 また、A列にあってC列にない場合は、×を表示したいです。 A列 B列 C列 D列 E列 1 12345 aaa 12389 aaa A1とA3が一致&B1とD3が一致したので○ 2 12389 bbb 22222 bbb A2とC1が一致したが、B2とD1が一致しないので× 3 33333 bbb 12345 aaa A3の値がC列にないので空欄 教えてください。
- ベストアンサー
- その他MS Office製品
- 検索VBAを教えてください。
VBAの勉強中です。 超初心者です。 シート1のB3に入力した値を、シート2のデータベースのC列から検索して、その検索した値と同じ行のD列・E列・F列の値を、シート1のB4・ B5・B6に表示したいと思います。 <シート1> A B C D 1 2 3 あああ ←ここを入力すると 4 aaa ←表示したい! 5 bbb ←表示したい! 6 ccc ←表示したい! <シート2> A B C D E F 1 あああ aaa bbb ccc 2 いいい eee fff ggg 3 ううう hhh iii jjj 4 えええ kkk mmm nnn 5 おおお ooo ppp qqq findを使えばいいと聞きましたが、使い方がよくわかりません。 例を読みましたが、どう自分に生かせばいいのかわかりませんでした。 どなたか未熟な私に教えていただけませんか? どうぞよろしくお願いいたします。
- 締切済み
- SE・インフラ・Webエンジニア
- SUMPRODUCT関数について
excel2010 SUMPRODUCT関数で、式の内容が理解できず教えてください。 sheet1に、A22からAM1047までデータがあります。B,E列を参照し、 sheet2のA、Cに設定された内容で抽出するという内容になっています。 具体例を下記に示します。 sheet1の構成 A1~AM21までは題目が記載されています。抽出したいデータ対象ではありません。 A列は見出しの内容でほとんど空欄です。 A427セルに本体、以降空欄が続きA490セルにヘッド、また空欄が続きA544セルに 見出しの内容といった感じです。 B22~B30セルにX001という識別コード(同じものが9) B30~B39セルにX002という識別コード(同じものが9) 以降、識別コードがB1047セルまで入ります。 E22~E30までは、a,b,c,d,e,f,g,h,iという検索内容が入ります。 以降同じ検索内容が続きます。 H22~H1047まで数字のデータが入ります。 上記以外の列は無関係なので説明省略。 下記のイメージです。 A1からAM20までにも何かしら内容が入っていますが、関係ないので説明省略。 A21の様に記載しているのはセルアドレス、その直下は入っている内容です。 A21 B21 E21 H21 名称 コード 検索 3月2日 A22 B22 E22 H22 準備 X001 a 0 X001 b 3 X001 c 2 X001 d 5 X001 e 2 X001 f 0 X001 g 3 X001 h 0 X001 i 0 X002 a 4 X002 b 7 X002 c 0 X002 d 0 X002 e 1 X002 f 3 X002 g 0 X002 h 0 X002 i 3 … A427 B427 E427 H427 本体 X701 a 0 X701 b 0 X701 c 1 X701 d 0 X701 e 2 X701 f 3 X701 g 0 X701 h 0 X701 i 1 … A490 ヘッド X792 a 4 X792 b 7 X792 c 2 X792 d 0 X792 e 1 X792 f 3 X792 g 0 X792 h 0 X792 i 3 sheet2は A1 C1 D1 コード 検索 X001 c 2 X002 c 0 X003 c 0 X004 c 0 X005 c 0 X006 c 0 X007 c 0 X008 c 0 X009 c 0 … X701 c 1 X792 c 2 の様にコードと検索条件でD列にsheet1からデータをひっぱってきたいのです。 下記はsheet2のD27セルに設定した内容です。 =IF(SUMPRODUCT((Sheet1!$B$22:$B$1047=$A27)*(Sheet1!$E$22:$E$1047=$C27)), INDEX(Sheet1!H$22:H$1047,SUMPRODUCT((Sheet1!$B$22:$B$1047=$A27)*(Sheet1!$E$22:$E$1047=$C27)*(ROW(sheet1!$A$1:$A$1026)))),"-") webや過去のokwebのsumproduct関数について調べた上で上記式にたどり着き、この内容で、sheet1の内容をひっぱってくるので良いのですが、 最後の*(ROW(sheet1!$A$1:$A$1026))の部分が理解できません。 疑問の内容は、下記2点 (1)単独でROW(sheet1!$A$1:$A$1026)を実施すると1になります。 しかしながら、 =IF(SUMPRODUCT((Sheet1!$B$22:$B$1047=$A27)*(Sheet1!$E$22:$E$1047=$C27)), INDEX(Sheet1!H$22:H$1047,SUMPRODUCT((Sheet1!$B$22:$B$1047=$A27)*(Sheet1!$E$22:$E$1047=$C27)*1)),"-") としてフィルハンドコピーすると、全ての行が27行目の値になってしまいます。 何故1ではだめなのでしょう? (2)データの範囲はA22からAM1047なので範囲を下記の様に同じにしてみました。 *(ROW(sheet1!$A$1:$A$1026))→*(ROW(sheet1!$A$22:$A$1047)) とすると全く正しく抽出されません。0になってしまいます。 *(ROW(sheet1!$A$1:$A$1026))が*(ROW(sheet1!$A$1:$A$1025)) の様に設定すると#N/Aとなり、抽出する設定条件で必要なのですが、 この*(ROW(sheet1!$A$1:$A$1026))の意味を教えていただきたく。
- ベストアンサー
- Excel(エクセル)
- SUMPRODUCT関数で複数条件適用されない
Sheet1 A列:日付 B列:注文番号 C列:品名 D列:整理番号 E列:数量 集計 A列:品名 B~AF列:日付(1~31日) 【集計】B~AF列の日付、A列の品名が 【Sheet1】A列の日付、C列の品名と一致したら 【Sheet1】E列の数量を【集計】の該当するセルに抽出する 式をSUMPRODUCT関数で作成しました。 例)10/1 りんご 20 【集計】B3セルに以下の数式を入れましたが なぜか数量が「0」のままになります。 =SUMPRODUCT('Sheet1'!$A$3:$A$200='集計'!B$2)*('Sheet1'!$C$3:$C$200="りん ご")*('Sheet1'!$E$3:$E$200) 特に数式のミスはないと思うのですが どうしても正しい値が入りません。 数式に間違いがあればご指摘いただけませんでしょうか。 また、他に良き方法があればご教示いただけるとありがたいです。
- ベストアンサー
- その他MS Office製品
- エクセル集計
下記の表でfujiに関し、到着時間が2月3日分で3件あるので、処理結果表に3件というように集計したが、時間の境目のところで集計値が正しくない。式を、どう直せばよいかわからない。 OFFSET機能も不理解。適性値の考えを教えて。 データ(datremo!シート) B列: クラス D列:名前 G列:到着時間 Zzz: kon: 2006/2/10 14:47 Zzz: kon: 2006/2/10 14:47 Bbb: miu: 2006/2/10 14:43 Bbb: miu: 2006/2/10 14:42 Aaa: kon: 2006/2/10 14:34 Aaa: kon: 2006/2/10 13:25 Ccc: tan: 2006/2/9 16:24 Ccc: tan: 2006/2/9 15:18 Ccc: tan: 2006/2/9 15:00 Aaa: fuji: 2006/2/3 17:45 Aaa: fuji: 2006/2/3 17:30 Aaa: fuji: 2006/2/3 16:14 ccc: tan: 2006/2/1 13:40 処理結果::*の場所、c6の式=SUMPRODUCT((INT(OFFSET(datremo!$G$2,,,100,1))=$A6)*(OFFSET(datremo!$B$3,,,100,1)=C$3)*(OFFSET(datremo!$D$3,,,100,1)=C$4)) (datremo!$G$2:到着時間、$A6:集計表日付け 、datremo!$B$3:集計表のクラス、 datremo!$D$3:データの名前、C$4:集計表の名前) A列 C列 クラス Aaa: Bbb: ccc: 名前 fuji: miu: tan: 数 数 数 2006/2/1 水 0*: 0: 0: 2006/2/2 木 0: 0: 0: 2006/2/3 金 2: 0: 1: 2006/2/4 土 0: 0: 0: 2006/2/5 日 0: 0: 0: 2006/2/6 月 0: 0: 0: 2006/2/7 火 0: 0: 0: 2006/2/8 水 0: 0: 0: 2006/2/9 木 1: 0: 2: 2006/2/10金 0: 2: 1: 2006/2/11土 0: 0: 0: 略 2006/2/28火 0: 0: 0: トータル 3件 2件 4件
- ベストアンサー
- オフィス系ソフト
お礼
ご回答ありがとうございました。 私が列を間違えていたためわざわざ訂正してくださってありがとうございます>< 複雑な関数になるのですね。。。 INDEXやROWは使ったことないので解読するのに苦労しています・・笑 この数式は、もしA~C列をならびかえたときはまたずれてしまうのでしょうか??