[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ピボットテーブルを使わないデータの集計方法』(i03t)
A B C D 1 作業列 CD A001 2 1 A001 A002 3 A001 A006 4 2 A002 A005 5 3 A006 A009 6 A002 7 4 A005 8 A005 9 5 A009 10 A006 11 A001 12 A001 13 6 A007 14 7 A008 15 A008 16 A009
上記のB列にコードが振られており、D列に全パターンのCDを
抽出したいのですが、よい方法があれば教えていただきたいです。
現状は
A2に「=IF(COUNTIF(B$2:B2,B2)=1,MAX(A$1:A1)+1,"")」
D1に「=IFERROR(VLOOKUP(ROW(),A:B,2,),"")」
のような数式を下にフィルコピーで抽出しています。
データが多くなる(10万行くらい)と計算が遅いのでピボットテーブルで抽出するように
しているのですが、関数で出す良い方法はないでしょうか。
よろしくお願いいたします。
エクセル2010 windows7使用
2007以上では[重複の削除]という機能があるので、それを利用してみてはいがかでしょうか。
エクセル2010基本講座:重複データを削除する http://www4.synapse.ne.jp/yone/excel2010/excel2010_filter24.html
B列をD列にコピーしてから試してみてください。
(se_9)
回答ありがとうございます。
「重複の削除」は知らなかったので、勉強になりました。
今後はピボットテーブルではなく、こちらで処理しようと思います。
ありがとうございました。
関数では何かいい方法はないでしょうか?
可能であれば、関数で解決できるといいのですが。
(i03t)
もしもB列のCDが昇順に並び替え可能なら、
A2セル =IF(B2=B1,"",ROW())
D1セル =IF(COUNT(A:A)<ROW(),"",INDEX(B:B,SMALL(A:A,ROW())))
で多少は速くなるかもしれません。 ですが10万となると数式で処理するのはあまり現実的ではないと思います。
一般機能ならピボットの他にも統合やフィルタオプションが使えそうですが、それでも結構重いでしょうね。 これはマクロ案です。 Sub sample() Dim v, dic, a, i As Long, ii As Long Set dic = CreateObject("scripting.dictionary") v = Range("B2:B" & Range("B" & Rows.Count).End(xlUp).Row).Value ReDim a(1 To UBound(v), 1 To 1) For i = 1 To UBound(v) If Not dic.exists(v(i, 1)) Then dic.Add v(i, 1), "" a(ii + 1, 1) = v(i, 1) ii = ii + 1 End If Next i With Range("D1").Resize(dic.Count, 1) .Value = a .Sort Key1:=Range("D1"), Order1:=xlAscending End With End Sub (Jera)
回答ありがとうございます。
SMALLを使った集計方法、昇順に並べるという条件付きですが
検索も多少早くなり、勉強になりました。
やはりこのようなデータはマクロがいいですよね。
マクロに関しては初心者なので勉強しないとダメだなと
再度実感しました。
連想配列・・・UBound・・・勉強します。
(i03t)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.