Selectしない


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