プロが教えるわが家の防犯対策術!

Sub a()
Dim i As Long
Dim s As Long
Dim b As Worksheet
Dim c As Worksheet
Dim maxi As Long
Dim maxs As Long
Application.ScreenUpdating = False
With ThisWorkbook
Set b = .Worksheets("bbb")
Set c = .Worksheets("ccc")
End With
maxi = b.Range("A1").CurrentRegion.Rows.Count
maxs = c.Range("A1").CurrentRegion.Rows.Count
For i = maxi To 2 Step -1
For s = maxs To 2 Step -1
If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then
c.Cells(s, 14) = b.Cells(i, 3)
End If
Next s
Next i
Application.ScreenUpdating = True
End Sub
ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。
・そもそもあっているのか、あっていないならどこを修正すればよいか
・早く終わるようにするにはどうしたらいいか
アドバイスをよろしくお願いします。

A 回答 (2件)

こんばんは



・そもそもあっているのか、あっていないならどこを修正すればよいか

こうしたことを切り分けるためには、
Application.ScreenUpdating = False
Application.ScreenUpdating = True
をコメントアウトして、ブレークポイントをかけてステップ実行し、動きを追うのがいいですよ。

で、プログラムなんですが、
・Bのシートを1行ずつ後ろからみながら、Cのシートを1行ずつ後ろから見ていますよね。これはイメージとあっていますか?

・データだけを比較したいなら c.Cells(s, 1).Value = b.Cells(i, 1).Value And c.Cells(s, 2).Value = b.Cells(i, 2).Value の方が早いと思います。代入も c.Cells(s, 14).Value = b.Cells(i, 3).Valueの方がたぶん早い。

・Bのシートの後ろの方で、Cのシートのデータと一致するものがあった時、さらにBのシートの前の方で、Cのシートのデータと一致するものがあった場合には、Cの14列目の値が上書きされますが、これを意図していますか?それとも2回以上一致することがないという前提でしょうか?あるいは複数回一致したら、Bのシートの前の方の値を使用するという仕様なんでしょうか?・・・・・仮に最後の問いにYESであれば、外側のループをCのシートにして、内側のループをBのシートにして i = 2 To maxi Step 1 にした上、代入直後にExit Forを入れれば、Bのシートの残りの検索を行わなくなり高速になります。

ほかにもC,Bのワークシートに一時的に(1列目と2列目を=":"&1列目&":"&2列目&":"と式を入れた列)を挿入してVLOOKUPで探すとかも考えられそうです。

実際のデータ(のイメージだけでも)もわかれば、より効率の良い方法が教えてもらえると思いますよ。
    • good
    • 0

プロパティを設定することでの処理の高速化を紹介します。


自動で計算を行わないようにする。
Application.Calculation = xlCalculationManual
解除
Application.Calculation = xlCalculationAutomatic
イベントがあがらないようにする。
Application.EnableEvents = False
解除
Application.EnableEvents = True
画面の更新を行わない設定をする、Application.ScreenUpdatingと同じイメージです。
試してみてください。
#1さんのおっしゃること(.VALUE)、と上記を加えることで、
回答者の実行環境ではありますが、処理が2倍程度早くなりました。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!