- ベストアンサー
エクセル一覧から抽出するには
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>合計ではなく、得意先CDが一致する顧客の行全部を別シートに取り出す。 そして、取り出した顧客売上データをピポットを使ってグラフなどにして行きます。 なるほど。抽出したい得意先が 1 件や 2 件なら簡単だけど、200 件もあるから毎回同じなのにたいへん、ということですね。 では 30,000 行ある一覧に 1 列を追加し(Sheet1)、各レコードの、得意先の一覧(Sheet2)での有無を表示してはいかがでしょうか。そうすれば、ピボットテーブルなりオートフィルタなりで、簡単に得意先のみを抽出できますね。抽出したらその表をコピーし、別シートに貼り付けて保存するなどしてもいいですね。 次式は、Sheet2 に載っている個数を計算します。 Sheet1 の F2 =countif(sheet2!A$1:A$200,c2) 得意先の一覧を用意する場所は、Sheet1 の中でも特に問題ありません。その場合は式中の「sheet2!」という部分を削除して、該当のセル範囲に書き換えます。
その他の回答 (5)
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
するって~と、3シートが絡むわけね!? わざわざ難しくする必要もないので、全部同じブックでイってみよう~!! 結果:ActiveSheet、はガチで動かせないとして、 デフォルトは、 マスタ:Sheet1 抽出キー:Sheet2 Option Explicit Sub RagPicker() 'Const xMaster = "HeyMaster" Const xMaster = "Sheet1" Const xSteal = "Sheet2" Dim xBook As Workbook Dim xSheet As Worksheet Dim zSheet As Worksheet Dim jj As Long Dim kk As Long Dim nn As Long Dim mm As Long Dim xLast As Long Dim zLast As Long Application.ScreenUpdating = False If (ActiveSheet.Name <> xMaster) And (ActiveSheet.Name <> xSteal) Then ActiveSheet.UsedRange.Clear Else MsgBox ("空のシートをActiveSheetにして実行してね!") Exit Sub End If If (InStr(xMaster, ".xls") > 0) Then Set zSheet = Workbooks(xMaster) Else Set zSheet = Sheets(xMaster) End If Set xSheet = Sheets(xSteal) xLast = xSheet.Cells(Rows.Count, "A").End(xlUp).Row zLast = zSheet.Cells(Rows.Count, "A").End(xlUp).Row Application.CutCopyMode = False zSheet.Rows(1).Copy ActiveSheet.Rows(1).PasteSpecial Paste:=xlPasteAll kk = 2 For jj = 2 To xLast For nn = 2 To zLast mm = nn With ActiveSheet If (xSheet.Cells(jj, "A").Value = zSheet.Cells(nn, "C").Value) Then For mm = nn + 1 To zLast If (zSheet.Cells(mm, "C").Value <> zSheet.Cells(nn, "C").Value) Then Exit For End If Next mm Application.CutCopyMode = False zSheet.Rows(nn & ":" & mm - 1).Copy ActiveSheet.Rows(kk & ":" & kk + (mm - nn) - 1).Resize(mm - nn).PasteSpecial Paste:=xlPasteValues ', Operation:=xlNone, SkipBlanks:=False, Transpose:=False kk = kk + (mm - nn) End If End With nn = mm If (nn > zLast) Then Exit For End If Next nn Next jj Application.CutCopyMode = True Application.ScreenUpdating = True End Sub
- kagakusuki
- ベストアンサー率51% (2610/5101)
今仮に、御質問欄の添付画像の一覧表がSheet1に存在していて、Sheet2のA列に抽出したい得意先CDを一覧にして入力すると、Sheet2のC列~G列に、抽出結果が表示される様にするものとします。 又、Sheet3のA列を作業列として使用するものとします。 まず、Sheet3のA2セルに次の数式を入力して下さい。 =IF(COUNTIF(Sheet2!$A:$A,INDEX(Sheet1!$C:$C,ROW())),ROW(),"") 次に、Sheet3のA2セルをコピーして、Sheet3のA3以下に貼り付けて下さい。 次に、Sheet1のA1~E1の範囲をコピーして、Sheet2のC1~G1の範囲に貼り付けて下さい。 次に、Sheet2のC2セルに次の数式を入力して下さい。 =IF(OR(ROWS($C$1:$C1)>COUNT(Sheet3!$A:$A),COUNTIF(Sheet1!$A$1:$E$1,C$1)=0),"",INDEX(Sheet1!$A:$E,SMALL(Sheet3!$A:$A,ROWS($C$1:$C1)),MATCH(C$1,Sheet1!$A$1:$E$1,0))) 次に、Sheet2のC2セルをコピーして、Sheet2のD2~G2の範囲に貼り付けて下さい。 次に、Sheet2のC2~G2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。 以上です。
お礼
kagakusukiさんアドバイスありがとうございました
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
単に合計金額が分かればいいというだけでしたら、No.2さんみたいな感じの数式でよろしいかと思います。ベストアンサーは辞退します。 ただファイル容量がどれくらいか分かりませんが、データ数がそこそこ多いので、計算の負荷を抑えるために、No.2さんの数式中、「C:C」→「C2:C30000」、「E:E」→「E2:E30000」のように書いておくとベターかもしれません。
補足
コメントありがとうございます 解りにくい表現ですみません。 合計ではなく、得意先CDが一致する顧客の行全部を別シートに取り出す。 そして、取り出した顧客売上データをピポットを使ってグラフなどにして行きます。 本当に解りにくくてすみません
- KURUMITO
- ベストアンサー率42% (1835/4283)
シート1にお示しの表が有るとします。 シート2のA列には得意先CD一覧が入力されているとします。 シート2のB1セルには次の式を入力して下方にドラッグコピーします。 =IF(A1="","",SUMIF(Sheet1!C:C,A1,Sheet1!E:E) シート1で新たな入力が有った場合でも即座にデータに反映されます。
お礼
KURUMITOさんアドバイスありがとうございました
補足
コメントありがとうございます 解りにくい表現ですみません。 合計ではなく、得意先CDが一致する顧客の行全部を別シートに取り出す。 そして、取り出した顧客売上データをピポットを使ってグラフなどにして行きます。 本当に解りにくくてすみません
- keithin
- ベストアンサー率66% (5278/7941)
>決まった得意先CDだけの売上を抽出したい 「抽出したい」とは、単純に今あるリストからコピーして取り出したいなら。 データタブのフィルタの「詳細設定」で、まとめて抜き出して書き出させることが出来ます。 ただし、C1の「得意先CD」という記入内容と、完全に同一の内容を抽出したいCDリストの先頭セルに記入しておいてから実行します。 それとも。 該当のCDの売上を「集計したい」(=同じCDの売り上げを合算して、CDごとの売り上げ一覧に集計したい)という意味なら。 データタブの「統合」を使って、用意のCD一覧の横に集計を一発で算出させられます。 あるいは単純にSUMIF関数を、抜き出し一覧の横に並べて集計させてもOKです。
お礼
keithinさんアドバイスありがとうございました
お礼
MarcoRossiItalyさん 出来ました、本当に感謝します。 自分の悩みを伝えるのも難しですけど、その不完全に表現された悩みを理解しようとするのは更に高度ですね。 本当に感謝します。 ありがとうございました。