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件)
- 最新から表示
- 回答順に表示
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で探すとかも考えられそうです。
実際のデータ(のイメージだけでも)もわかれば、より効率の良い方法が教えてもらえると思いますよ。
No.2
- 回答日時:
プロパティを設定することでの処理の高速化を紹介します。
自動で計算を行わないようにする。
Application.Calculation = xlCalculationManual
解除
Application.Calculation = xlCalculationAutomatic
イベントがあがらないようにする。
Application.EnableEvents = False
解除
Application.EnableEvents = True
画面の更新を行わない設定をする、Application.ScreenUpdatingと同じイメージです。
試してみてください。
#1さんのおっしゃること(.VALUE)、と上記を加えることで、
回答者の実行環境ではありますが、処理が2倍程度早くなりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別のシートから値を取得するとき
-
Excel マクロについての相談
-
別のシートを参照して計算する方法
-
エクセルのマクロについて教え...
-
ブック名、シート名を他のモジ...
-
VBA 最終行まで数式をコピーする
-
【ExcelVBA】全シートのセルの...
-
特定の文字を含むシートだけマ...
-
エクセルのマクロについて教え...
-
VBA 入力月で該当シートを選択...
-
一括印刷マクロ シート名を数字...
-
【ExcelVBA】動的にボタン、ボ...
-
VBA 存在しないシートを選...
-
同じ作業を複数のシートに実行...
-
ListViewの画面の更新
-
実行時エラー1004「Select メソ...
-
シートが保護されている状態で...
-
エクセルで通し番号を入れてチ...
-
【VBA】指定した検索条件に一致...
-
ユーザーフォームに入力したデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
【ExcelVBA】全シートのセルの...
-
同じ作業を複数のシートに実行...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
XL:BeforeDoubleClickが動かない
-
ExcelVBA シート名を複数セルか...
-
実行時エラー'1004': WorkSheet...
-
VBA 存在しないシートを選...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ブック名、シート名を他のモジ...
-
【Excel VBA】Worksheets().Act...
-
ExcelのVBAのマクロで他のシー...
-
エクセルのシート名変更で重複...
-
特定の文字を含むシートだけマ...
-
シートが保護されている状態で...
-
Excel マクロについての相談
-
VBA 検索して一致したセル...
おすすめ情報