ここから本文です

VBAで検索するときのアルゴリズムについて教えてください 4000件のデータを4000...

shi********さん

2019/2/519:39:45

VBAで検索するときのアルゴリズムについて教えてください

4000件のデータを4000件のリストから検索しようとしています。
何かいい方法はないでしょうか?

試した手段

1.配列に格納してForでひとつずつみていく。
この場合、4000件×4000件なので、単純に16000回処理が走ります
実際は途中で見つかり、ループを抜けるのでもっと少ないですが
実行時間は2~3秒でした イマイチ。

2.Find関数を使う
これも実行時間がForよりちょっと遅い感じがしました

3.ワークシート関数 Matchを使う
これはFindよりおそく感じました

なにかほかに早い方法はないでしょうか?
1秒以内(ボタンをおしたら即完了)するぐらいの検索速度にしたいです。

閲覧数:
37
回答数:
2

違反報告

ベストアンサーに選ばれた回答

sk_********さん

編集あり2019/2/521:18:31

一つの例ですが。
連想配列を使用します。
前提として、セル[A1:A4000]にデータ、セル[B1:B4000]にリストがあるとします。
次をコードを実行すると、リストの値をデータから検索し、見つかった場合は上から数えた位置を、見つからなかった場合はEmpty値をD列に書き出します。

Sub Sample()
Dim myDic As Object, i As Long
Dim v1 As Variant, v2 As Variant, v As Variant
Set myDic = CreateObject("Scripting.Dictionary")
v1 = Range("A1:A4000").Value
v2 = Range("B1:B4000").Value
With myDic
For i = 1 To 4000
.Add v1(i, 1), i
Next
For i = 1 To 4000
v = .Item(v2(i, 1))
If IsError(v) Then v2(i, 1) = Empty Else v2(i, 1) = v
Next
End With
Range("D1:D4000").Value = v2
End Sub

  • 質問者

    shi********さん

    2019/2/523:10:44

    なるほど…!多次元配列を使用した検索はイマイチでしたが
    Dictionaryオブジェクトなら速そうですね!!

    今まで重複のないリストを作る時ぐらいしか使っていなく、そのスクリプトもほぼコピペ化していたので存在を忘れていました。
    ありがとうございます。

    明日試してみます!!

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/2/6 00:34:04

仮のデータを作ってやってみたところ、1万件でも一瞬でした。dictionaryオブジェクトの検索は最強ですね!
ありがとうございます!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

aka********さん

2019/2/519:51:28

2.Find関数を使う
これも実行時間がForよりちょっと遅い感じがしました

FOR と FIND を 比較できないと 思うのですが

FINDは 検索機能
FOR に 検索機能は 全くありませんが

FINDは 直接 どのセルにあるか セルアドレスを つかむので 一番早いのでは

問題は つかんだ後の 処理を どうするかですが

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる