それぞれ数万行ある2シート間でデータの突合せをしようと思うのですが、どうしても動作中に固まってしまいます。
もっと早く動くようなやり方がありましたらご教示いただけましたら幸いです。
Dim sh1 As Worksheet Dim sh2 As Worksheet Dim Start As Date Dim Finish As Date Dim lrow As Long Dim i As Long Dim n As Long Dim R1 As Long Dim R2 As Long Dim key, key2 As Variant On Error Resume Next Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).row R2 = sh2.Cells(sh2.Rows.Count, "A").End(xlUp).row Application.ScreenUpdating = False Application.EnableEvents = False Application.DisplayAlerts = False Application.Calculation = xlCalculationManua '計算を手動 For lrow = 2 To R1 For i = 2 To R2 key = sh1.Cells(lrow, "A").Value & "|" & sh1.Cells(lrow, "L").Value key2 = sh2.Cells(i, "A").Value & "|" & sh2.Cells(i, "F").Value If sh1.Cells(lrow, "AR").Value = "" And key = key2 Then sh1.Cells(lrow, "AR") = sh2.Cells(i, "AB") End If Next i Next lrow Application.StatusBar = False Application.Calculation = xlCalculationAutomatic Application.DisplayAlerts = True Application.EnableEvents = True Application.ScreenUpdating = True Finish = Time MsgBox "取得が完了しました" & vbLf & "実行"
コードが正しく張り付けられてないため読み辛いですが、
ぱっと見た感じでもForを二重にして処理しているようなので、
If sh1.Cells(lrow, "AR").Value = "" And key = key2 Then
sh1.Cells(lrow, "AR") = sh2.Cells(i, "AB")
End If
の部分で一致するものが一つだとわかっているなら、
sh1.Cells(lrow, "AR") = sh2.Cells(i, "AB")
の下に
Exit For
と入れて内側のFor文を即座に抜けさせることで大分処理を軽くできます。
ただ二つ以上一致する物があると想定されていると使えませんが。
・コードは「コードの挿入」で記入してください。
・「どうしても動作中に固まって」というのはVBAの実行が止まるという意味でしょうか?
失礼しました。コードを入れなおしました。
ありがとうございます試してみます。
実行が止まるというのはかなり遅くエラーになるという意味です。
ありがとうございます。
エラーが出ているのであれば、そのエラーを掲載してください。遅いのとエラーが発生するのとでは大分違います。※ところでメモリは足りていますか?
応答していないというエラーです。デバックとかではありません。
ああ、エラーではなく、エクセルが固まったということですね。待てば処理が終わるということですね。
エクセルでデータ数が多いとある程度時間が掛かるのは仕方ないかもしれません。
回答1件
あなたの回答
tips
プレビュー