「マクロの記録」を利用する

VBA入門講座

はじめに

 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つの手段としては悪くありません。


コメント

タイトルとURLをコピーしました