VBA100本ノック 33本目:マクロ記録の改修
この記事から得るもの
1 今回のお題
「このVBAはマクロの記録から作ったのですが、件数の数値を変更してから実行しなければならず、データ件数も多くて何分も時間がかかりとても困っています。なんとかしてもらえないでしょうか?」
こう頼まれました。VBAを書いて対応してあげましょう。
Sub ノック33_ソース() Sheets("データ").Select For i = 2 To 3500 DoEvents Range("D" & i).Select ActiveCell.FormulaR1C1 = _ "=IFERROR(VLOOKUP(RC[-2],マスタ!C[-3]:C[-1],2,FALSE),"""")" Range("E" & i).Select ActiveCell.FormulaR1C1 = _ "=IFERROR(VLOOKUP(RC[-3],マスタ!C[-4]:C[-2],3,FALSE),"""")" Range("F" & i).Select ActiveCell.FormulaR1C1 = _ "=RC[-1]*RC[-3]" Range("D" & i & ":F" & i).Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Next Range("A1").Select End Sub
2 今回のお題の意図
処理速度をあげる処理を追加。必要な分だけ処理する。
3 回答
記録マクロのソースコードを動かしてみるとわかるのですが、「For i = 2 To 3500」とループ回数を決めてしまっています。そのため、データが入力されている分だけ処理をする。加えて、処理速度をあげるコードを追加してあげます。
私の回答
Sub ノック33_1() Dim ws As Worksheet: Set ws = Worksheets("データ") '処理速度を上げるやつ設定 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Sheets("データ").Select For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row '最終行の取得 Range("D" & i).Select ActiveCell.FormulaR1C1 = _ "=IFERROR(VLOOKUP(RC[-2],マスタ!C[-3]:C[-1],2,FALSE),"""")" Range("E" & i).Select ActiveCell.FormulaR1C1 = _ "=IFERROR(VLOOKUP(RC[-3],マスタ!C[-4]:C[-2],3,FALSE),"""")" Range("F" & i).Select ActiveCell.FormulaR1C1 = _ "=RC[-1]*RC[-3]" Range("D" & i & ":F" & i).Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Next Range("A1").Select '処理速度を上げるやつ設定終了 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub
1 処理速度を上げる処理
画像描写更新を止める。再計算処理を止める。
2 データの最終行を取得する。
これだけですね。ざっくりした質問には、ざっくりした対応です。
ではでは、この辺で(^^)/~~~