• ベストアンサー

《エクセル》 マクロで条件にあった行を検索するには

いつもお世話になります。 エクセルシートにあるリストから、別のリストにある重複するデータを検索し、削除したい場合に、現在は 「作業セルにVLOOKUPを行い、エラーが出なかったものを削除する」 という方法を取っていますが、VLOOKUPはデータ量が多くなると、起動時間が非常に長くなるという難点があります。 マクロでもっとスマートに出来る方法はありますでしょうか。 また、同じく、VLOOKUPを使わずに、別のリストのデータをくっつけるという方法はありますでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

処理の柔軟性などを求めるのであれば、Findなどを使うしかないですが、処理速度を求めるのであれば、ワークシート関数を使うのがもっとも速いです。 ということでマクロ上でVlookUPするのが一番かと。 もう一つの質問は何をしたいのかがよくわかりません。

参考URL:
http://www.officetanaka.net/excel/vba/speed/s11.htm
7-samurai
質問者

お礼

ありがとうございました。 もう一つの質問ですが、 「マクロで、別のリストにある重複するデータを検索し、データをVLOOKUPのようにつなげていくということが可能かどうか、また、それによって処理速度を速くすることが出来るのか」 という意味です。 言葉足らずで申し訳ございません。 ですが、検索するのにVLOOKUPが最適なら、こちらもVLOOKUPを使うのが良いのでしょうね。 もし、他の方法をご存知でしたらご返答の方、お願いできますでしょうか。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

シート1のキー列でソート(下記例ではA列) シート2のキー列でソート(下記例ではA列) マッチングのロジックで比較。 一致したものを削除するのも、合成するのも出来ます。 sheet3に一致しないものを書き出し。 1:1か1:多かによって少しロジックが変ります。 (下記はマッチングのイメージを紹介するためのもので、実際のニーズにあわせてコードを変える必要あり) Sub test01() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") Set ws3 = Worksheets("sheet3") '---- bothread = "Y" highval="zzzzzz" i = 0: j = 0: k = 1 '----- p01: i = i + 1 k1 = ws1.Cells(i, "A") If k1 = "" Then k1 = highval If bothread <> "Y" Then GoTo comp bothread = "N" '----- p02: j = j + 1 k2 = ws2.Cells(j, "A") If k2 = "" Then k2 = highval '----キー比較 comp: If k1 = k2 Then GoTo eql If k1 > k2 Then GoTo high If k1 < k2 Then GoTo low '---- eql: If k1 = highval Then GoTo owari '何もしない bothread = "Y" GoTo p01 '---- high: ws3.Cells(k, "A") = ws2.Cells(j, "A") ws3.Cells(k, "B") = ws2.Cells(j, "B") k = k + 1 GoTo p02 '---- low: ws3.Cells(k, "A") = ws1.Cells(i, "A") ws3.Cells(k, "B") = ws1.Cells(i, "B") k = k + 1 GoTo p01 owari: End Sub

7-samurai
質問者

お礼

ありがとうございました。 初心者に毛の生えたような現在の私の知識では、参考書を片手に理解するのに非常に時間がかかりそうですが、頑張って身につけさせていただきます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

具体的な回答ではありませんが、下記のページの結果では、vlookup を使うのがもっとも早い処理になるようです。 それに近いことが出来るのは、セルのデータをメモリに配列として取得することになります。

参考URL:
http://www.officetanaka.net/excel/vba/speed/s11.htm
7-samurai
質問者

お礼

ありがとうございました。 取り合えずは、VLOOPUPで対応しますが、いただきましたURLの技術も、参考にさせていただきます。

回答No.2

sheet1とsheet2のデータが重複するかどうかをチェックするVBAを書いてみました。 両シートとも1行目はタイトルでA列2行目以下にデータがあり、抜けはないものとします。 重複の場合、両シートのB列に「重複」と出ます。 Sub 重複CHECK() Dim 最終行1, 最終行2 As Integer Dim 行1, 行2 As Integer 最終行1 = Worksheets(1).Range("A1").CurrentRegion.Rows.Count 最終行2 = Worksheets(2).Range("A1").CurrentRegion.Rows.Count For 行2 = 2 To 最終行2 For 行1 = 2 To 最終行1 If Worksheets(2).Range("A" & 行2) = Worksheets(1).Range("A" & 行1) Then Worksheets(1).Range("B" & 行1) = "Sheet2と重複" Worksheets(2).Range("B" & 行2) = "Sheet1と重複" End If Next 行1 Next 行2 End Sub

7-samurai
質問者

お礼

ありがとうございました。 なるほど・・・。 初心者で、変数の使い方がまだまだ拙いので、非常に参考になりました。 ぜひ試させて頂きたいと思います。