No.5ベストアンサー
- 回答日時:
フィルタオプションによる抽出は速いという印象がありましたが、ユニークなデータ抽出は劇遅ですね。
50000行のデータで終わるまで待てないで無理矢理終了させてしまいました。この手の処理は連想配列が速いです。標準で機能を持っている言語もありますが、VBAの場合は別の(といってもWindowsが標準で持っている)ActiveXのお世話になる必要があります。下記のコードは、セル操作を最小限に止めるために配列に収納して操作する高速化の技も併用していますが、A列に5万行、乱数で作成したアルファベット2文字の文字列のユニークなリスト取り出しが100msec弱で処理できました。(Windows7Home(64bit), xl2010, Core i5 3.2GHz)
ご参考まで。
なお、APIは時間計測に使っているだけですので、気にしないで下さい。
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub test()
Dim targetRange As Range, destRange As Range
Dim buf As Variant, buf2 As Variant
Dim myDic As Object
Dim i As Long
Dim myKeys As Variant
Dim startTime As Long
startTime = GetTickCount
Set targetRange = Sheets("Sheet1").Range("A1:A50000")
buf = targetRange
Set myDic = CreateObject("Scripting.Dictionary")
On Error Resume Next
For i = 1 To 50000
myDic.Add buf(i, 1), ""
Next i
On Error GoTo 0
With Sheets("Sheet2")
Set destRange = .Range(.Range("A1"), .Range("A" & myDic.Count))
End With
buf2 = destRange
myKeys = myDic.keys
For i = 1 To myDic.Count
buf2(i, 1) = myKeys(i - 1)
Next i
destRange = buf2
MsgBox CStr(GetTickCount - startTime) & "msec"
End Sub
No.6
- 回答日時:
Dictionary オブジェクト速いですね。
当方でも日本郵便の郵便番号データの町域部分で試したところ、
データ数、124,300件、(Excel2010)で
抽出件数:86,117件
ADO→1825ms
Dictionary→1061ms
でした。
都道府県部分だと
ADO→1217ms
Dictionary→172ms
ファイル形式(xls、xlsm)やExcelのバージョンに配慮する必要がないので
#5さんの方法をお勧めします。
No.4
- 回答日時:
マクロを使うことが計算速度を速めることにはならないでしょう。
むしろ関数などによる対応がおすすめです。データがA2セルから下方の行に入力されているとします。
作業列としてB列のB2セルには次の式を入力します。
=IF(A2="","",IF(COUNTIF(A$2:A2,A2)=1,MAX(B$1:B1)+1,""))
その後にB2セルを選択したのちに「コピー」します。
名前ボックスがB2と表示されているでしょう。その窓をB2:B50000ように変更して確定します。
B2セルからB50000セルまでが範囲として選択されますので右クリックして「貼り付け」を選択します。
お求めの表をシート2に表示させるとしてA2セルには次の式を入力して下方にドラッグコピーします。
=IF(ROW(A1)>MAX(Sheet1!B:B),"",INDEX(Sheet1!A:A,MATCH(ROW(A1),Sheet1!B:B,0)))
ご回答ありがとうございます。
なるほどです。関数でここまでのことが出来るとは思いもよらなかったです。
別のシチュエーションで、自分程度のあたまでここまで思いつくかどうかという問題はあるものの、非常に参考になりました!
ありがとうございました。
No.3
- 回答日時:
#2さんのやり方なら速くなるかも(Excelの本来の機能じゃない、
Officeが持ってるデータベース処理の機能を使っているので)。
この辺はこれが参考になるかな?
http://support.microsoft.com/kb/246335/ja
ただ、うまく動かないときにどうするかは、↑でわかるように結構
スキルが必要なので、どうしようもない場合だけ使った方がいい
と思います。
度々のご回答ありがとうございました。
教えていただいたURLに目を通しましたが、まさにこれですね。
頑張ってやってみます。
ありがとうございました。
No.2
- 回答日時:
Excelのバージョンが不明ですが 2007以降なら
Sub test()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.ace.OLEDB.12.0"
.ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties='Excel 12.0; HDR=No'"
.Open
End With
Set rs = New ADODB.Recordset
rs.Open "select distinct f1 from [Sheet1$] ", cn, adOpenDynamic
Sheets(2).Cells(1, 1).CopyFromRecordset rs
cn.Close: Set cn = Nothing
End Sub
でシート2に書き込まれるかも?
ご回答ありがとうございます。うまくいきました。
まだVBAの意味は理解できていませんが、咀嚼して活用できるようにしたいと思います。
No.1
- 回答日時:
いや、VBAはインタプリタ言語ですし、そもそも処理速度は
Excelの持つ関数やウィザードなどより確実に遅いですよ。
ですので、VBAで書き直すなら、抽出とはまったく違った
ロジックを考える必要があります。逆に言えば、簡単に処理
できるロジックに気づかないなら、そのままフィルタオプション
を使った方が速いってことです。
つか、Excelは2007以降でも、データ量が1万件を超えると
処理速度が極端に落ちます。データ量が5万件もあるなら
Aceessにデータ移行して、Accessのクエリを動作させた方が
処理速度も安定性も、格段に上ですよ。
Excelは1万件までのデータ処理ソフトだと思った方がいいです。
この回答への補足
早速のご回答ありがとうございます。
ただ、このデータはどうしてもエクセルで処理せざるを得ず、(同じ会社の人のPCにアクセスが入っていない場合があり、そのPCでも作業する必要があるので)また、例えばオートフィルタをその列にかければ、プルダウンメニューから20種類全てのデータが見えますよね。だからその要件自体はVBAであればすぐ解決できるのかなって思ったんですけど・・・。
自分でも本を読んでみたのですが、そのような機能が見当たらず、お聞きした次第です。
もし、無いようならご指摘のとおり時間がかかってもウィザードで対応しようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 1 2023/02/27 22:21
- Excel(エクセル) VBAで、シート間の転記するコードを教えてください。 4 2023/03/26 10:43
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) エクセル 2つの列にある値の完全一致を抜き出すVBA 15 2022/12/15 03:22
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- Visual Basic(VBA) データを製品別に集計 3 2022/09/11 21:17
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
【お題】・忍者がやってるYouTubeが炎上してしまった理由
-
【お題】逆襲の桃太郎
【大喜利】桃太郎が1回鬼退治に失敗したところから始まる新作昔話「リベンジオブ桃太郎」にはこんなシーンがある
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
「これいらなくない?」という慣習、教えてください
現代になって省略されてきたとはいえ、必要性のない慣習や風習、ありませんか?
-
VBAで重複するデータがあれば1個だけ残して他の重複セルを"(空白)にしたいのですが
Excel(エクセル)
-
【excelVBA】Findメソッドで検索対象を複数列
Excel(エクセル)
-
Excel2000/VBA:値と書式のみ貼り付けたい。
Excel(エクセル)
-
-
4
VBA 複数の行を高速で削除する方法
その他(プログラミング・Web制作)
-
5
エクセル 重複 隣の列 一番上だけの数値を残す VBA
Excel(エクセル)
-
6
【VBA】2つのシートの値を比較して条件一致したら、同じ行の隣の値を別ブックへ転記したいです。 VB
Visual Basic(VBA)
-
7
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
8
複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAから書き込んだ条件付き初期...
-
【VBA】 結合セルに複数画像と...
-
Excel VBAについて。こんな動作...
-
VBA 最終行の取得がうまくいか...
-
VBA Application.Matchについて...
-
【ExcelVBA】値を変更しながら...
-
Excel VBA 定義されたプロージ...
-
ExcelのVBAコードについて教え...
-
Excelのマクロについて教えてく...
-
不要項目の行削除方法について
-
VBA 同じフォルダ内のすべての...
-
[VB.net] ボタン(Flat)のEnable...
-
VBAでCOPYを繰り返すと、処理が...
-
ExcelVBA シート名を複数セルか...
-
【マクロ】オートフィルターに...
-
vba Windowオブジェクト(Window...
-
Vba 型が一致しません(エラー1...
-
Excelのマクロについて教えてく...
-
VBAでセルの書式を変えずに文字...
-
Excel VBA 選択範囲の罫線色の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAについて教えて下さい
-
ExcelのVBAコードについて教え...
-
ExcelのVBAコードについて教え...
-
【ExcelVBA】5万行以上のデー...
-
VBA Application.Matchについて...
-
Excelのマクロについて教えてく...
-
Excel VBAについて。こんな動作...
-
Excelの数式について教えてくだ...
-
ExcelのVBAコードについて教え...
-
VBA 同じフォルダ内のすべての...
-
不要項目の行削除方法について
-
Vba 型が一致しません(エラー1...
-
【マクロ】オートフィルターに...
-
【VBA】 結合セルに複数画像と...
-
VBAで特定の文字が入った行をコ...
-
ExcelのVBAコードについて教え...
-
VBAでセルの書式を変えずに文字...
-
VBAのエラー表示の対処法について
-
Excelのマクロについて教えてく...
-
Excel マクロについて詳しい方...
おすすめ情報