セル範囲A1:A5の各セルへ、順に数字を入力する操作をマクロ記録すると、次のようなコードが生成されます。
Sub Macro1() Range("A1").Select ActiveCell.FormulaR1C1 = "1" Range("A2").Select ActiveCell.FormulaR1C1 = "2" Range("A3").Select ActiveCell.FormulaR1C1 = "3" Range("A4").Select ActiveCell.FormulaR1C1 = "4" Range("A5").Select ActiveCell.FormulaR1C1 = "5" Range("A6").Select End Sub
それぞれのセルを選択(Select)し、そのアクティブセルに対して数値を入力したのですから、このコードは間違いではありません。ただし、決して効率の良いコードとは言えません。
マクロ記録は、操作を1ステップずつコード化します。つまり「セルA1に1と入力する」操作は、まず「セルA1が選択された」「選択されたセルに1が入力された」さらにEnterキーを押すと「アクティブセルが1つ下に下がった」というように記録されるのです。このようなコードは速度的に不利なだけでなく、メンテナンス性も大きく損なわれます。
今回検証するのは、次のコードです。
Sub test2() Dim i As Long Application.ScreenUpdating = False For i = 1 To 100 Cells(i, 1).Select Selection.Copy Sheets("Sheet2").Select Cells(i, 1).Select ActiveSheet.Paste Sheets("Sheet1").Select Next i Application.ScreenUpdating = True End Sub
これは、前項「画面を止める」で使った"無駄なことをしている"マクロです。一応、画面を止めていますけど。これに対して、同じく前項で使った、"そもそもSelectしない"マクロが次です。
Sub test3() Dim i As Long For i = 1 To 100 Sheets("Sheet1").Cells(i, 1).Copy Sheets("Sheet2").Cells(i, 1) Next i End Sub
両者の実行結果は次のとおりです。
回 | test2 | test3 | % |
---|---|---|---|
1 | 3.203 | 1.953 | 61.0% |
2 | 4.704 | 1.922 | 40.9% |
3 | 4.750 | 1.375 | 28.9% |
4 | 4.765 | 1.656 | 34.8% |
5 | 4.797 | 1.125 | 23.5% |
6 | 4.797 | 1.140 | 23.8% |
7 | 4.656 | 1.125 | 24.2% |
8 | 5.141 | 1.641 | 31.9% |
9 | 5.109 | 1.781 | 34.9% |
10 | 4.703 | 2.125 | 45.2% |
平均 | 4.663 | 1.584 | 34.9% |
分からないことがあったらマクロ記録する。それはいいんです。マクロ記録はそのためにある「調べる機能」だからです。しかし、記録されるコードは、決して最適化されていません。はっきり言えば「ものすごく冗長なコード」です。そりゃそうです。操作を1手順ずつ確実に記録するのですから。少しでもマクロのクオリティを気にするのなら、マクロ記録で記録されたコードを、そのまま使わないで、無駄な部分を削り、自分の望むコードに編集する作業が必要です。
マクロ記録する
↓
コードが記録される
↓
そのコードをそのまま使う
ではなく、
マクロ記録する
↓
コードが記録される
↓
記録されたコードをよく読む
↓
分からないところは自分で調べる
↓
必要な部分だけ自分のマクロに組み込む
です。
言うまでもありませんが、記録されたコードが読めないと話になりません。そのために必要なことは、ただひとつ。VBAの基礎を正しく学習することです。"習うより慣れろ"でマスターできるほど、VBAは簡単ではありません。他の言語に精通しているからといって、使いこなせるほどVBAは単純ではありません。簡単な話です。どれほどC言語に精通しているからといって、残念ながらC言語にセルやワークシートはありません。Excel VBAは、セルやワークシートなどを操作するのが主目的です。また、インターネットを検索して、コピペでマクロを完成させても、VBAのスキルが向上したわけではありません。翻訳サイトで日本語を英語に翻訳しても、英語を話せるようにならないのと同じことですね。何百回とコードをコピペしても、それで上達するのは"コピペの技術"だけです。VBAのスキルは1ミリも向上しません。