
お世話になっております。
ここで質問し、皆様のご協力の下、なんとか差分抽出マクロを完成させましたが、
実行してみると、すごく遅いです。処理が終わるまで、133秒程度かかり、マクロ実行中は、Excelがフリーズしたような状態になります。。。。データー量としては、3,000行程度です。
(これだと普通にExcelの関数を使った方が早い状態です)
そこで、処理を高速化するために、コードをどのように修正していけば良いでしょうか?
このマクロを作ることにより、結構、ループや条件分岐や変数の概念が分かるようになり、かなり勉強になりました。
ただ、もっと、高速化を図りたいですね。。。
↓今回作成し、実行したコード↓
vba
1'作業前データーは、A~F列に貼り付ける。 2'作業後データーは、I~N列に貼り付ける。 3 4Sub MyDiff() 5 Dim cRow As Long 6 Dim befor_Area As Range '作業前対象範囲 7 Dim befor_Rng As Variant '作業後対象範囲内のセルを格納する変数 8 Dim kRow As Long 9 Dim after_Area As Range '作業後対象範囲 10 Dim after_Rng As Variant '作業後対象範囲内のセルを格納する変数 11 Dim c As Long 'C列用カウンター変数 12 Dim k As Long 'K列用カウンター変数 13 Dim h As Long 'H列用カウンター変数 14 Dim diff As Long 15 Dim hRow As Long 16 17 cRow = Cells(Rows.Count, "C").End(xlUp).Row 'C列の最終行取得 18 kRow = Cells(Rows.Count, "K").End(xlUp).Row 'K列の最終行取得 19 20 '作業前のMACアドレスで昇順にソート 21 Range(Cells(2, 1), Cells(cRow, 6)).Sort _ 22 key1:=Range("C2"), _ 23 Order1:=xlAscending, _ 24 Header:=xlYes 25 26 '作業後のMACアドレスで昇順にソート 27 Range(Cells(2, 9), Cells(kRow, 13)).Sort _ 28 key1:=Range("K2"), _ 29 Order1:=xlAscending, _ 30 Header:=xlYes 31 32 '作業前データーの空白チェック。 33 '空白があった場合は、空白に-を入れる。 34 35 36 Set befor_Area = Range(Cells(3, "A"), Cells(cRow, "F")) 37 38 For Each befor_Rng In befor_Area 39 If befor_Rng.Value <> "" Then 40 '何もしない 41 Else 42 befor_Rng.Value = "-" 43 End If 44 Next 45 46 '作業後データーの空白チェック。 47 '空白があった場合は、空白に-を入れる。 48 49 Set after_Area = Range(Cells(3, "I"), Cells(kRow, "N")) 50 51 For Each after_Rng In after_Area 52 If after_Rng.Value <> "" Then 53 '何もしない 54 Else 55 after_Rng.Value = "-" 56 End If 57 Next 58 59 60 'C列を元に、K列のMACアドレスのチェックを行う。 61 '差分があった場合、G列に×を入れる。 62 Cells(2, "G").Value = "差分1" 63 c = 3 64 65 Do While Cells(c, "C").Value <> "" 66 k = 3 67 Cells(c, "G").Value = "×" 68 Do While Cells(k, "K").Value <> "" 69 If Cells(c, "C").Value = Cells(k, "K").Value Then 70 Cells(c, "G").Value = "" 71 Exit Do 72 End If 73 k = k + 1 74 Loop 75 c = c + 1 76 Loop 77 78 'K列を元に、C列のMACアドレスのチェックを行う。 79 '差分があった場合、H列に×を入れる。 80 Cells(2, "H").Value = "差分2" 81 82 k = 3 83 Do While Cells(k, "K").Value <> "" 84 c = 3 85 Cells(k, "H").Value = "×" 86 Do While Cells(c, "C").Value <> "" 87 If Cells(k, "K").Value = Cells(c, "C").Value Then 88 Cells(k, "H").Value = "" 89 Exit Do 90 End If 91 c = c + 1 92 Loop 93 k = k + 1 94 Loop 95 96 97 'H列に"×"がるものデーター(H列~N列)をP列~V列へ移動させる。 98 kRow = Cells(Rows.Count, "K").End(xlUp).Row 99 hRow = kRow 100 diff = 3 101 102 For h = 3 To hRow 103 104 If Cells(h, "H").Value <> "" Then 105 Range(Cells(h, "H"), Cells(h, "N")).Cut Destination:=Range(Cells(diff, "P"), Cells(diff, "V")) 106 diff = diff + 1 107 End If 108 Next h 109 110End Sub
ご教授下さい。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/01/09 09:11