読解練習の最後はあるセルの値をコピーして他のセルに貼り付けしたときに生成されるプログラムを教材に使用します。
比較のため、貼付形式として"通常の貼り付け"と"形式を指定して貼り付け(値)"の操作を行いました。
<例題>
1 :Sub Macro1()
2 : Range("A1").Select
3 : ActiveCell.FormulaR1C1 = "セルのコピー"
4 : Selection.Copy
5 : Range("B1").Select
6 : ActiveSheet.Paste
7 : Range("C1").Select
8 : Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
9 : :=False, Transpose:=False
10: Application.CutCopyMode = False
11:End Sub
<解説>
2〜3行目がコピー元のセルを用意する操作、
4行目がコピーの操作、
6行目が通常の貼付けの操作、
8〜9行目が形式を指定して貼り付けの操作になります。
では順を追ってみていこうと思いますが、
1〜3行目までは特に新しい情報はありませんので割愛します。
4行目
Selection.Copy
ここで選択しているセルは"A1"ですので、
Range("A1").Copyと同義であり、この一文でセルの情報をコピーしています。
5〜6行目
5 : Range("B1").Select
6 : ActiveSheet.Paste
セル"B1"を選択した後、ActiveSheetにPasteをしています。
感の良い方は既にお解りかもしれませんが、ActiveSheetとは「現在のシート」という意味であり、
セルにおけるActiveCellのようなものです。
従って、この一連の操作を行っているのが「Sheet1」であれば、この部分は以下のように書き換えることができます。
Worksheets("Sheet1").Paste
ここで、セルに貼り付けを行っているのに何故シートにコピーするのか疑問に思われる方もいらっしゃると思いますが、
それが「ルール」ですので覚えてください。
また、セルを特定するときにRange("番地")と書くように、シートを指定するときにWorksheets("シート名")と書くこともルールですので覚えてください。
7〜9行目
7 : Range("C1").Select
8 : Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
9 : :=False, Transpose:=False
セル"C1"を選択した後、SelectionにPasteSpecialしています。
ここで「形式を指定して貼り付け」を行っているわけですが、
ActiveSheetではなくSelection、すなわちセルに対する操作である点がPasteと異なります。
これも「ルール」ですので覚えてください。
さて、8行目の最後が"_"(アンダースコア)で終わっている点に注目してください。
VBAでは1行が長すぎる際に、"_"を使うことで複数行に渡る文を記述することができます。
これはプログラマの便宜(見やすさ)のための機能であり、すべてを1行に書いても問題はありません。
なお、"_"を使う場合はこの例のように、"=(イコール)"や",(カンマ)"や".(ピリオド)"の前後など、文の切れ目でのみ使用することができ、
単語の途中で使用することはできません。
Range("A1").Interior.ColorIndex = 3
○ Range("A1").Interior. _
ColorIndex = 3
× Range("A1").Interior.Color _
Index = 3
PasteSpecialについてもう少し詳しく見てみましょう。
PasteSpecialの後ろにスペースを挟み、以下のように記述されています(改行しない状態に書き直しています)。
Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
これらは「引数」と呼ばれ、PasteSpecialの動作を決めるための変数です。
":="の前に書いてあるのが引数の名前で、":="の後が値です。
ここでは4つの引数が","で繋がれています。
翻訳すると、
貼り付けの形式(Paste)は値(xlPasteValues)、演算(Operation)はしない(xlNone)、空白セルを無視(SkipBlanks)しない(False)、
行列を入れ替え(Transpose)しない(False)ということを表していますが、
これは、Excelの[ホーム]→[貼り付け]→[形式を指定して貼り付け]を選んだときに表示されるダイアログボックスのチェックボックス等に対応しています。
なお、ある文が引数を必要とするかどうかは予め決められています。
それを確認するために、VBEで次のように書いてみてください。
Sub test
Range("A1").PasteSpecial
End Sub
ここで、PasteSpecialの後ろにカーソルを合わせてスペースボタンを押すと、下のようなボックスが表示されることでしょう。

他にもRange("A1")の後に"."を入力したときなどボックスで選択肢が表示されることを見かけていると思います。
これらは「インテリセンス」と呼ばれ、VBEがVBAのルールを解釈して、次に取るべき選択肢を列挙してくれる便利な機能です。
巧く使えば作業効率を大幅に向上させることができるでしょう。
少し脱線しましたが、改めてボックス内の情報を見てみましょう。
良く見ると、例題のようなPaste,Operation,SkipBlanks,Transposeが含まれていることが確認できますが、ここでは次の3点をおさえてください。
1つ目は、引数の名前は省略可能です。
具体的には、例題の8〜9行目は次のように書いても意味は変わりません。
但し、この場合インテリセンスで表示される順序に書く必要があります。
Selection.PasteSpecial xlPasteValues, xlNone, False, False
2つ目は、引数の名前を省略しない場合に限り、引数は任意の順序で書くことができます。
例えば、PasteとOperationの順序を入れ替えて次のように書くことができます。
Selection.PasteSpecial Operation:=xlNone, Paste:=xlPasteValues, SkipBlanks:=False, Transpose:=False
最後に3つ目ですが、インテリセンスで表示される際に"[]"で括られた引数は省略可能です。
この場合、予め決められた既定値が指定されたものと看做されます。
PasteとOperationについては既定値は"="以降に表示されている"xlPasteAll"及び"xlPasteSpecialOperationNone"です。
SkipBlanksとTransposeについてはそれぞれFalseが既定値となります。
10行目
Application.CutCopyMode = False
これは、コピーモードを終了するための一文です。
さて、長々と細かい説明を続けてきましたが「マクロの記録」の読解はこれで以上にします。
まだ説明していない動作は多数ありますが、読解のための基礎はできつつあるはずですので、
後は実際に手を動かしながら実験してみてください。
「習うより慣れろ」です。
次回は次のステップに進むための下準備として、ヘルプの使い方を説明します。