
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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
vbsでのwebフォームへの入力制限?
-
改行文字「vbCrLf」とは
-
Vba セルの4辺について罫線が有...
-
エクセルのマクロについて教え...
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードについて教...
-
testファイル内にある複数のpng...
-
エクセルVBA 検索結果を隣のシ...
-
VBAの質問(Msgboxについて)です
-
以下のプログラムの実行結果は...
-
質問58753 このコードでうまく...
-
VBAでユーザーフォームを指定回...
-
エクセルの改行について
-
エクセルのVBAコードと数式につ...
-
ワードの図形にマクロを登録で...
-
【マクロ】値を渡されたプロシ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
testファイル内にある複数のpng...
-
改行文字「vbCrLf」とは
-
エクセルVBA 検索結果を隣のシ...
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードと数式につ...
-
【マクロ】切取りの場合、形式...
-
【ExcelVBA】5万行以上のデー...
-
ExcelVBAでパワポを操作したい
-
(EXCEL超初心者)EXCELの関数(ま...
-
エクセルの改行について
-
Excelマクロで使うVBAコードを...
-
ワードの図形にマクロを登録で...
-
【マクロ】変数を使った、文字...
-
VBAでFOR NEXT分を Application...
-
VBAの質問(Msgboxについて)です
-
エクセルのVBAコードについて教...
-
Excelマクロで使うVBAコードを...
-
Excelのマクロについて教えてく...
-
VBAの「To」という語句について
-
【マクロ】値を渡されたプロシ...
おすすめ情報