• 締切済み

ExcelにおけるVBAで、データの振り分けをしたい

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列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

みんなの回答

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

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

  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

こんばんは ・そもそもあっているのか、あっていないならどこを修正すればよいか こうしたことを切り分けるためには、 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で探すとかも考えられそうです。 実際のデータ(のイメージだけでも)もわかれば、より効率の良い方法が教えてもらえると思いますよ。

関連するQ&A