セル範囲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ミリも向上しません。