[[20130214164110]] 『ピボットテーブルを使わないデータの集計方法』(i03t) ページの最後に飛ぶ

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

 

『ピボットテーブルを使わないデータの集計方法』(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)

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)

Jera様

回答ありがとうございます。
SMALLを使った集計方法、昇順に並べるという条件付きですが
検索も多少早くなり、勉強になりました。

やはりこのようなデータはマクロがいいですよね。
マクロに関しては初心者なので勉強しないとダメだなと
再度実感しました。

連想配列・・・UBound・・・勉強します。

(i03t)


コメント返信:

[ 一覧(最新更新順) ]


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