はじめに
VBAをやった事が無い人でも「マクロの記録」は、ご存じの方も多いと思います。
「マクロの記録」があれば業務を自動化できると思った方でも、次第に使わなくなっていきます。
その原因は、
「マクロの記録」では、変数や繰り返し処理、条件分岐が出来ないからです。
幸い、「マクロの記録」は書き換えが可能です。
動作のコツさえ掴めばExcelの操作をプログラムに起こすという作業を省略できますのでそれを体験してみましょう。
関連記事: マクロの記録を料理する
「マクロの記録」の使い方
「マクロの記録」はメニューの「開発」から「マクロの記録」を押すとダイアログが出てきます。

マクロ名や実行のためのショートカットキーを変更できますが、そのまま「OK」を押して開始します。

今回は、以下のように操作してみてください。
・A1セルをクリックして選択し、右クリックから「コピー」を選択

・C1セルをクリックして選択し、右クリックから「貼り付け」を選択

メニューの「開発」から「記録の終了」をクリックして「マクロの記録」を終了させます。

「マクロの記録」が出力するコードを読む
終了すると、VBEに標準モジュールが追加されます。
開くと以下のように記録されると思います。(コメント部分はカットしました。)
Sub Macro1()
Range("A1").Select
Selection.Copy
Range("C1").Select
ActiveSheet.Paste
End Sub
何となく意味は分かると思いますが、プログラムの動作は以下のような手順です。
A1セルを選択
選択したセルをコピー
C1セルを選択
アクティブなセルに貼り付け
単純なコピー操作ですが、A1セルとC1セルの部分を変更すればセルのコピー関数が作れそうですね。
「マクロの記録」を汎用関数にする
先のコードを汎用関数に変更してみます。
A1とC1という固有の値を引数で受けて、外から呼び出すようにしてみましょう。
プロシージャ名を適当な名前に変更して、
Range(“A1”)
Range(“C1”)
の部分を引数に取れば良いでしょう。
Sub myCopyAtoB(rngA As Range, rngB As Range)
'AをBにコピーする
rngA.Select
Selection.Copy
rngB.Select
ActiveSheet.Paste
End Sub
引数は、「変数名 As 変数型」なので、
rngA As Range
としました。
2つあるのでカンマで区切ります。
呼び出すためのテストコードは以下の通りです。
Sub testCode()
Call myCopyAtoB(Range("A1"), Range("C1"))
End Sub
これで、最初の Macro1 と同じ動作になります。
汎用化したので、For文で繰り返し処理を行ってみましょう。
RangeとCellsは同等に使えます。
第2引数はFor文で変化するのでCellsを使います。
Sub testCode2()
Dim i As Long
For i = 2 To 5
Call myCopyAtoB(Range("A1"), Cells(i, "C"))
Next i
End Sub
このように改造すれば、変数や繰り返し処理、条件分岐ができない「マクロの記録」を有効活用できます。
「マクロの記録」のコードを簡略化
出来上がったコードですが、最後に選択の痕跡が残ってしまうのはちょっと格好悪い感じがします。
「マクロの記録」では Select や Selection を多用するのですが、これらは省略できることが殆どです。
Sub Macro1()
Range("A1").Select
Selection.Copy
Range("C1").Select
ActiveSheet.Paste
End Sub
上記のプログラムは、以下のように書き変える事が出来ます。
Sub testCopy()
Range("A1").Copy
Range("C1").PasteSpecial
End Sub
このように短くなれば、汎用化するまでもなく、コードとして組み込めそうです。
testCode2 を書き直してみましょう。
Sub testCode2a()
Dim i As Long
For i = 2 To 5
Range("A1").Copy
Cells(i, "C").PasteSpecial
Next i
End Sub
さらに、 Range(“A1”).Copy は一回実行すれば、クリップボードに保存されますので、For文の外に出すことが出来ます。
Sub testCode2b()
Dim i As Long
Range("A1").Copy
For i = 2 To 5
Cells(i, "C").PasteSpecial
Next i
End Sub
ここまで来ると「マクロの記録」の面影は無くなってしまいますが、プログラミングの練習には良いでしょう。
変更すべきプロパティと変更不要のプロパティ
セルの背景色を変えるプログラムを書いてみましょう。
「マクロの記録」で、以下の2種類の記録を取ってみます。
・A1セルの背景色を「黄色」に設定する
・A1セルの背景色を「塗りつぶしなし」に設定する
結果は以下のようになりました。
(コメント部分は変更しています。)
Sub Macro2()
'セルの背景色を「黄色」にするマクロ
Range("A1").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Sub Macro3()
'セルの背景色を「塗りつぶしなし」にするマクロ
Range("A1").Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
この2つのプログラムは、「塗りつぶす」「塗りつぶしなし」の相対する操作と言えます。
この2つを見比べた時に、同じプロパティ値を設定しているものは、無くても良いと判断できそうです。
.TintAndShade = 0
.PatternTintAndShade = 0
この2つは削除しても良さそうですね。
更に、Range()部分を引数にして汎用化させてみます。
Sub InteriorPatternYellow(rng As Range)
'セルの背景色を「黄色」にするマクロ
With rng.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
End With
End Sub
Sub InteriorPatternNone(rng As Range)
'セルの背景色を「塗りつぶしなし」にするマクロ
With rng.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Sub testCodeInter()
Dim i As Long
For i = 2 To 10
If i Mod 2 = 0 Then
Call InteriorPatternYellow(Range(Cells(i, "A"), Cells(i, "D")))
Else
Call InteriorPatternNone(Range(Cells(i, "A"), Cells(i, "D")))
End If
Next i
End Sub
変更点は、Selection の部分に引数の rng を充てています。
テストプログラムの testCodeInter では、2行目から10行目までの巡回させて、
偶数行は、黄色に塗りつぶし、奇数行は塗りつぶしなしに設定しています。
「 i Mod 2 」は以前出てきましたが、「i を 2 で割った余り」を返します。
呼び出し関数の引数ですが、引数の型がRange型なので、複数のセルを指定できます。
Range(Cells(i, “A”), Cells(i, “D”)) も以前出てきましたが、
Range( 始点セル , 終点セル ) という書き方なので、
i 行のA列からD列までのセルが選択領域となります。
色を変更したければ、.Color = 65535 の部分を変更すれば良いというのは想像できると思います。
「マクロの記録」で好きな色に変更してみて、変化した数値に替えれば良いでしょう。
実行結果は以下のようになります。

まとめ
まとめ
「マクロの記録」を使えば、普段操作している内容をプログラムコードに起こしてくれます。
そのままでは、変数、繰り返し処理、条件分岐を表現できませんが、
オブジェクトのプロパティ値を表示させてくれるのは大いに役に立ちます。
ここに出てきた用語からネットで検索して調べれば、より理解も深まると思います。
「マクロの記録」は美味しい所だけを使わせてもらうのが賢い使い方でしょう。
VBAプログラミングとしてはイマイチですが、ヒントを得られるので1つの手段としては悪くありません。
入門講座 目次
・開発環境を整える
・VBAプログラムの基礎
・VBAプログラムの基礎2
・セルの使い方
・ブックやシートの参照
・プログラムでの日付の扱い方
・プロシーシャの使い方
・「マクロの記録」を利用する
・デバッグのやり方
・やりたい事の調べ方と解決方法
・自力でプログラムを書いてみる
・別ブックのデータを集計
・別ブックのデータを集計 2
コメント