- ベストアンサー
EXCELで重複データの抽出方法
EXCELでデータを作成中なのですが、いい方法があれば教えてください。 例:Aの列にたくさんの名前が入っています。Bの列に1.バナナ、2.ナシ、3.りんごなどの商品名が入っています。 Aの名前には重複した同じ人もいるのですが、Bの列の商品は同じ人でもバラバラになっています。それをCの列で同じ人は、同じ商品名にしたいのです。 具体的に図で説明すると、 A列 |B列 |C列 小田 |1.バナナ | 1.バナナ 佐藤 |2.ナシ |2.ナシ 田中 |1.バナナ |1.バナナ 小田 |2.ナシ |1.バナナ 佐藤 |3.バナナ |2.ナシ 小田 |3.りんご |1.バナナ 上のようにCの列に同じ人に同じ商品が入るように関数かもしくはマクロで設定したいのですが・・・ もし、良い方法があれば教えてください。 説明が分かりにくくてすみません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
3.バナナ の数字部分が全角なのか半角なのかよくわからなかったですが、 物は試しに。 Sub try() Dim Dic As Object Dim i As Long, j As Integer Dim v, w Set Dic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") v = .Range(.Range("A1"), .Cells(Rows.Count, 2).End(xlUp)).Value ReDim w(1 To UBound(v, 1), 1 To 1) For i = 1 To UBound(v, 1) If Not Dic.exists(v(i, 1)) Then j = Val(StrConv(Split(v(i, 2), ".")(0), 8)) Dic(v(i, 1)) = Array(j, v(i, 2)) ElseIf Dic(v(i, 1))(0) > Val(StrConv(Split(v(i, 2), ".")(0), 8)) Then j = Val(StrConv(Split(v(i, 2), ".")(0), 8)) Dic(v(i, 1)) = Array(j, v(i, 2)) End If Next For i = 1 To UBound(v, 1) w(i, 1) = Dic(v(i, 1))(1) Next .Range("C1").Resize(i - 1, 1).Value = w End With Set Dic = Nothing Erase v, w End Sub 違っていたらごめんなさい。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
この例が相当実際と換骨ダッタイされているようで、実際のニーズが見えないのですが、 ーー これは関数では難しいと思う。 佐藤の行のC列の最小は配列数式で出せるが、関数処理が重くなったり 、C列が数字だけでないことも複雑にする。 佐藤の行で、今までのC列の最小のものを見つけるのは難しいから。 (最小のものということは質問に書いてない。質問例でも書いてない。ここが大切な点なので、質問をするとき注意のこと) 佐藤について A.最初のもの B.最小のもの C.最近(行的に直前の佐藤) などが考えられるが、Bなのか? であれば、質問の書き方としておかしくないか。 今は質問例では7行目の佐藤のC列を問題にしているが、5行目の佐藤の時はどのようにしたの?同じ理屈で行けば1番目の佐藤のC列が全体を規定するのでは。 この問題は6行目まではデータがC列まで入っていて、7行目のC列だけを求めて終わりではなかろう?。 C列全体行をどう決めるかの問題でしょう?。 ==== それとも、C列まで全データが入力し終わって、C列について、上記B.最小のものを見出して、佐藤の全行をB.最小のもので置き換える問題か?そう受け取ると、>作成中なのですが、ともしっくりこないし、質問にはそういうような、表現がないが。 === 質問文を考え直して見てください。
- hotosys
- ベストアンサー率67% (97/143)
C1=VLOOKUP(A1,A:B,2,FALSE) として下へコピー。
補足
回答ありがとうございます。 回答のやり方だと、A列の重複している人の最初に出た商品名がC列に記入されて、説明の図のようになるのですが、 そうではなく、例えA列の重複している人の中で、B列の商品の最小の番号の商品が選ばれるようにしたいのですが (例えば、一番目の小田のB列の商品が3.りんごだとしても1.バナナが選ばれるように) 最初の図と説明が悪くてすみません。