[[20190605122227]] 『別シートから重複する項目の多い順に抽出』(KAKU) ページの最後に飛ぶ

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

 

『別シートから重複する項目の多い順に抽出』(KAKU)

シート1

 ・・・R・・・・AN・・・・・CA・・・
1・・・ア・・・・50・・・・・64・・・
2・・・カ・・・・30・・・・・74・・・
3・・・サ・・・・20・・・・・84・・・
4・・・タ・・・・20・・・・・34・・・
5・・・ア・・・・30・・・・・63・・・
6・・・サ・・・・40・・・・・83・・・
7・・・サ・・・・50・・・・・72・・・

これを
シート2に
 A・・・E・・・・F G H
1 サ・・・110・・・84 83 72
2 ア・・・80・・・ 64 63
3 カ・・・30・・・ 74 
4 タ・・・20・・・ 34
と抽出したいのです。

シート2のA列は
シート1のR列で重複する文字を纏め

シート2のE列は
シート1のR列の重複する文字のANの項目の合計値

シート2のF〜H列は
シート1のR列のCA列の大きい値から順番に抽出

更に
シート2のA列は
シート2のE列の大きい値から順番に
同和であればシート1の現れた順で構いません。

この場合の
シート2の
A1、E1、F1、G1、H1の関数を教えて頂けますでしょうか。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


すみません、行がズレて見にくかったので
再投稿いたします

シート1

 ・・・R・・・・AN・・・・・CA・・・
1・・・ア・・・・50・・・・・64・・・
2・・・カ・・・・30・・・・・74・・・
3・・・サ・・・・20・・・・・84・・・
4・・・タ・・・・20・・・・・34・・・
5・・・ア・・・・30・・・・・63・・・
6・・・サ・・・・40・・・・・83・・・
7・・・サ・・・・50・・・・・72・・・

これを
シート2に
 A・・・ E・・・・F・・・ G・・・ H
1 サ・・・110・・・84・・・83・・ 72
2 ア・・・80・・・ 64・・・63
3 カ・・・30・・・ 74 
4 タ・・・20・・・ 34
と抽出したいのです。

シート2のA列は
シート1のR列で重複する文字を纏め

シート2のE列は
シート1のR列の重複する文字のANの項目の合計値

シート2のF〜H列は
シート1のR列のCA列の大きい値から順番に抽出

更に
シート2のA列は
シート2のE列の大きい値から順番に
同和であればシート1の現れた順で構いません。

この場合の
シート2の
A1、E1、F1、G1、H1の関数を教えて頂けますでしょうか。
(KAKU) 2019/06/05(水) 17:36


 シート1で件数は最大何件になるのだろうか?
(ねむねむ) 2019/06/05(水) 17:39

 AN列は整数だけだとして(小数はないものとして)
 作業列を使ってもいいのなら

 Sheet1は ↓ の配置で説明します

	R	S	T	U
1	ア	50	64	80.5
2	カ	30	74	30.33333333
3	サ	20	84	110.25
4	タ	20	34	20.2
5	ア	30	63	
6	サ	40	83	
7	サ	50	72	
8				

 S列 → AN列
 T列 → CA列
 U列 → 作業列

 U1 =IF(R1="","",IF(COUNTIF($R$1:R1,R1)=1,SUMIF(R:R,R1,S:S)+1/ROW(A2),""))
 下コピー

 Sheet1は1行目から100行目までだとして(本当にいきなり1行目から始まってるんですかね?)

 Sheet2
 A1 =IFERROR(INDEX(Sheet1!$R$1:$R$100,MATCH(LARGE(Sheet1!$U$1:$U$100,ROW(A1)),Sheet1!$U$1:$U$100,0)),"")

 E1 =IF(A1="","",SUMIF(Sheet1!$R$1:$R$100,A1,Sheet1!$S$1:$S$100))

 A1とE1を下コピー

 F1 =IF($A1="","",IFERROR(LARGE(IF(Sheet1!$R$1:$R$100=$A1,Sheet1!$T$1:$T$100),COLUMN(A1)),""))

 F1は Ctrl+Shift+Enter で確定し、右と下にコピー

 提示のサンプルデータでしか試してません。

 ところで ↓ 同じ人?
[[20190602094438]]『シート1で重複する文字列の値をシート2に拾い出す』(saku)

 参考まで
(笑) 2019/06/05(水) 21:13

わたしは、質問者さんと違って、数式は苦手なので
この程度の複雑さになるともう、ちんぷんかんぷんで、応用もできません。
わたしのような人向けにマクロを書いてみました。
マクロもわかりませんな人は、どうしたらよいか、わかりません。
 Option Explicit

 Sub test()
    Dim wsS As Worksheet, wsD As Worksheet
    Dim wsT As Worksheet
    Dim dic As Object, k
    Dim c As Range, s As String
    Dim n As Long

    Set wsS = Worksheets("Sheet1")
    Set wsD = Worksheets("Sheet2")

    With wsD.UsedRange
        .Offset(, 4).ClearContents
        .Columns(1).ClearContents
    End With

    Set dic = CreateObject("scripting.dictionary")

    For Each c In wsS.Columns("E").SpecialCells(xlCellTypeConstants)
        s = c.Value
        If Not dic.exists(s) Then
            Set dic(s) = CreateObject("system.collections.arraylist")
            dic(s).Add 0
        End If
        dic(s)(0) = dic(s)(0) + c.EntireRow.Columns("R").Value
        dic(s).Add c.EntireRow.Columns("CA").Value
    Next

    Set wsT = Worksheets.Add

    For Each k In dic.keys
        n = n + 1
        wsT.Cells(n, 1).Value = k
        wsT.Cells(n, 2).Value = dic(k)(0)
        dic(k).removeat 0
        dic(k).Sort
        dic(k).Reverse
        wsT.Cells(n, 3).Resize(, dic(k).Count).Value = dic(k).toarray
    Next

    With wsT.Cells(1).CurrentRegion
        .Sort .Cells(2), xlDescending
        wsD.Columns(1).Resize(n).Value = .Columns(1).Value
        wsD.Columns(5).Resize(n, .Columns.Count).Value = .Offset(, 1).Value
    End With

    Application.DisplayAlerts = False
    wsT.Delete
    Application.DisplayAlerts = True

 End Sub

(マナ) 2019/06/06(木) 20:46


 VBA 作業シート無しで

 Sub test()
     Dim a, e, x, y, i As Long, ii As Long, temp, dic As Object
     Set dic = CreateObject("Scripting.Dictionary")
     With Sheets("sheet1")
         With .Range("r1", .Range("r" & .Rows.Count).End(xlUp)).Resize(, 62)
             a = Application.Index(.Value, Evaluate("row(1:" & .Rows.Count & ")"), Array(1, 23, 62))
         End With
     End With
     For i = 1 To UBound(a, 1)
         If Not dic.exists(a(i, 1)) Then
             dic(a(i, 1)) = Array(0, CreateObject("System.Collections.ArrayList"))
         End If
         dic(a(i, 1))(1).Add a(i, 3)
         dic(a(i, 1)) = Array(dic(a(i, 1))(0) + a(i, 2), dic(a(i, 1))(1))
     Next
     x = dic.keys: y = dic.items
     For i = 0 To UBound(x) - 1
         For ii = i + 1 To UBound(x)
             If y(i)(0) < y(ii)(0) Then
                 temp = x(i): x(i) = x(ii): x(ii) = temp
                 temp = y(i): y(i) = y(ii): y(ii) = temp
             End If
         Next
     Next
     With Sheets("sheet2")
         Intersect(.UsedRange, .Range("a:a,e:h")).ClearContents
         For i = 0 To UBound(x)
             .Cells(i + 1, 1) = x(i)
             .Cells(i + 1, "e") = y(i)(0)
             y(i)(1).Sort: y(i)(1).Reverse
             .Cells(i + 1, "f").Resize(, y(i)(1).Count) = y(i)(1).ToArray
         Next
     End With
 End Sub

(seiya) 2019/06/06(木) 21:36


コメント返信:

[ 一覧(最新更新順) ]


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