[[20161017124529]] 『複数銘柄の中から、銘柄別の抽出方法』(パシリ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数銘柄の中から、銘柄別の抽出方法』(パシリ)

いろいろな銘柄の果物を果物別に一つだけ持っている人を抽出する方法があればご教授ください。

Aさん  青森りんご  2個
Aさん  津軽りんご  1個
Bさん  青森りんご  1個
Cさん  三ケ日みかん 2個
Cさん  青森りんご  1個 

上記の表で、りんごだけ持っているAさんとBさんを抽出したいのです。

Aさん  青森りんご  3個 
Aさん  津軽りんご  1個
Bさん  青森りんご  1個

という表ができればベストですが、AさんとBさんが該当するということがわかるだけでもかまいせん。

 

< 使用 Excel:unknown、使用 OS:unknown >


 ピボットテーブル。
 
(GobGob) 2016/10/17(月) 12:59

 あー。「りんごだけ」ってことね。

 	A	B	C	D	E	F	G	H
1	Aさん	りんご	2	1		Aさん	りんご	2
2	Aさん	りんご	1	2		Aさん	りんご	1
3	Bさん	りんご	1	3		Bさん	りんご	1
4	Cさん	みかん	2					
5	Cさん	りんご	1					

 D列作業列
 D1 =IF(COUNTIFS(A:A,A1,B:B,"*りんご*")=COUNTIF(A:A,A1),ROW(),"")

 F1 =IF(MAX($D:$D)<ROW(A1),"",INDEX(A:A,SMALL($D:$D,ROW(A1))))
 右下へコピー。

(GobGob) 2016/10/17(月) 13:12


 > F1 =IF(MAX($D:$D)<ROW(A1),"",INDEX(A:A,SMALL($D:$D,ROW(A1))))

 MAX じゃなく、COUNT では?

 Excelのバージョンが不明だけど、2007以降を想定してるんだったら
 IFERROR 関数使ってもいいですけど。
(笑) 2016/10/17(月) 13:37

 >いろいろな銘柄の果物を果物別に一つだけ持っている人を抽出
 ということはたとえばCさんがみかんしか持っていなければCさんも抜き出し対象とするのでは?

 つまり

 Aさん  青森りんご  2個 
 Aさん  津軽りんご  1個 
 Bさん  青森りんご  1個 
 Cさん  三ケ日みかん 2個 

 だった場合

 Aさん  青森りんご  2個  
 Aさん  津軽りんご  1個 
 Bさん  青森りんご  1個 
 Cさん    三ケ日みかん 2個 
 なのでは?
(ねむねむ) 2016/10/17(月) 13:48

GobGobさん、笑さん、ご回答ありがとうございます。

説明不足ですいません。りんごだけを持っているというのは、複数ある果物のうち、
りんごという果物、みかんという果物、バナナという果物を一種類だけ持っている人なのです。
しかも、りんごやみかんにはそれぞれ複数の銘柄(青森りんごや津軽りんご、三ケ日みかんや愛媛みかん など)
がある中で、銘柄にかかわらずりんごだけ持っている人、みかんだけ持っている人を抽出したいのです。
例えば、青森りんごと三ケ日みかんを持っている人を除いて、りんごだけ持っている人のリストを作り、
これからその人にみかんやバナナを売る、というのが趣旨です。

どうかよろしくお願いします。

なお、エクセルのバージョンは2010です。
(パシリ) 2016/10/17(月) 13:58


ねむねむさん

 Aさん  青森りんご  2個 
 Aさん  津軽りんご  1個 
 Bさん  青森りんご  1個 
 Cさん  三ケ日みかん 2個
 Cさん  青森りんご  1個

 だった場合

 Aさん  青森りんご  2個  
 Aさん  津軽りんご  1個 
 Bさん  青森りんご  1個 

 と、Cさんのように複数の果物を持っているの人を除きたいのです。

(パシリ) 2016/10/17(月) 14:03


 『もしCさんがみかんしか持っていなかったら』Cさんも抜き出すのでは、と書いたのだが?
 (パシリさんの例題の書き方が「りんご」だけを対象にしているように見えるため)
(ねむねむ) 2016/10/17(月) 14:09

Sub main()
'シート「果物一覧」のA列に果物名列挙(例:A1=りんご、B1=みかん)
'シート「Sheet1」に元データ (結果はSheet1の後ろにシートを作成して表示)
    Dim rg1 As Range, rg2 As Range, dic, k
    Set dic = CreateObject("scripting.dictionary")
    For Each rg1 In Sheets("果物一覧").UsedRange.Columns("A").Cells
        For Each rg2 In Sheets("Sheet1").UsedRange.Columns("A").Cells
        If rg2.Offset(, 1).Value Like "*" & rg1.Value & "*" Then
            If Not dic(rg2.Value) = rg1.Value Then
                If dic(rg2.Value) = Empty Then
                dic(rg2.Value) = rg1.Value
                Else
                dic(rg2.Value) = "NG(2種類以上持っている)"
                End If
            End If
        End If
        Next rg2
    Next rg1
    Sheets.Add after:=Sheets("Sheet1")
    Set rg1 = ActiveSheet.Range("A1")
    For Each k In dic.keys
        rg1.Value = k
        rg1.Offset(, 1).Value = dic(k)
        Set rg1 = rg1.Offset(1)
    Next k
End Sub
(mm) 2016/10/17(月) 14:11

 趣旨がよく理解できてないけど、
 果物を1種類しか持ってない人だけを抽出で、作業列を2列使ってもいいんだったら

	G
1	りんご
2	みかん
3	バナナ

 ↑ のようにどこかに果物名を全部書き出しておく。

 D1 =IFERROR(LOOKUP(1,0/FIND($G$1:$G$3,B1),$G$1:$G$3),"")
 E1 =IF(D1="","",IF(COUNTIFS(A:A,A1,D:D,D1)=COUNTIF(A:A,A1),ROW(),""))

 D1とE1を下コピー

 抽出したいところに

 =IFERROR(INDEX(A:A,SMALL($E:$E,ROW(A1))),"")

 右下コピー

 とか?
(笑) 2016/10/17(月) 14:18

皆さん回答ありがとうございました。

笑さんの方法でサンプルデータではできました。

ただ、データが10万行あるので、遅々として計算は進まずですが・・・
(パシリ) 2016/10/18(火) 07:53


 横から失礼します。

 関数のことは詳しくないのですが、

 >>ただ、データが10万行あるので、遅々として計算は進まずですが・・・

 そうそうたる皆さんからの回答の式でも、遅いということであれば、もう、それは
 関数で処理する限界というか、関数以外の方式(マクロとか)を検討する必要があるのかもしれません。

 で、そういうこととは別に、現在の構想は、たとえば 「りんご」という文字列を与え
 データ内に「りんご」という文字列があるものは、きっと「りんご」だろう、ないものは「りんご」じゃないだろう。
 こういうロジックですよね。

 でも、品種ということであれば 「紅玉」もりんごですよね。 でも 「りんご」で検索してもマッチしない。
 逆に、「グレープ」を抽出しようとすれば「グレープフルーツ」も「グレープ」だとみなされてしまう。

 何を言いたいかというと、こうした「分析」処理をするにあたっては、データの中に「分析コード」(たとえば りんご なら 1 とか)を
 持っておく必要があるだろうなということです。
 明細データの一部として持つ形もありでしょうけど、通常は、マスタとして

 青森りんご  1
 紅玉     1
 三ケ日みかん 2

 こんなように持たせますね。

 で、元データの品名を 分析コードとしての品種に置き換えて、Aさんの 1 が Aさんのすべてと同じ個数なら
 Aさんは りんごだけを持っている という判断ができると思います。

(β) 2016/10/18(火) 13:00


皆さま、色々ご回答ありがとうございます。元データの品名を 分析コードとしての品種に置き換えた表を作って作業してみます。
(パシリ) 2016/10/22(土) 13:32

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.