マクロの記録を料理する

中級VBA

マクロの記録を料理する

 これまでの記事の中で何度かマクロの記録を使って自分のプログラミングに活かしていく方法を紹介してきました。
 一方で、初心者のうちはマクロの記録を使わない方が良いとも述べてきました。

 今回は初心者がマクロの記録からプログラムコードを抜き出して使うノウハウについて見ていきたいと思います。

マクロの記録を観察してみる

 最初はあるセルを別のセルにコピーして貼り付けるというマクロの記録を見てみます。

Sub Macro1()
'
' Macro1 Macro
'

'
    Range("B4").Select
    Selection.Copy
    Range("D4").Select
    ActiveSheet.Paste
End Sub

 操作としては、以下の通りです。
   ・B4を選択。
   ・(右クリックで)コピー。
   ・D4を選択。
   ・アクティブシートに(右クリックで)貼り付け。
 
 プログラムと操作の内容が一致していますね。
 実は、VBAですと1行で書けますので徐々に変更してみます。

  まず最初の2行。

Range("B4").Select
Selection.Copy


 B4を選択して、その選択したセルをコピーするので、B4をコピーすれば良いだけですので以下のように書けます。

Range("B4").Copy

  次は3,4行目。

Range("D4").Select
ActiveSheet.Paste

  今度は安易につなげてはいけません。D4を選択した後に、アクティブシートに貼り付けをしいるので、セルとシートが異なるためです。

 実は、先ほどのCopyの後ろにペースト先を書く事ができます。

Range("B4").Copy Destination:=Range("D4")

 こうする事で、3,4行目は省略できます。
 Destination は貼り付け先の指定です。これは省略しても良いので、  

Range("B4").Copy Range("D4")

 という事で一行で書くことができました。 
 結局Selectが余計なのです。

前提の知識はどうやって見つけるのか?

 このような知識は、ネットで検索するといくらでも出てきます。
 googleなどで「excel vba コピー ペースト」 などで検索して、いくつか自分にしっくりくるページを参考にすると良いでしょう。

 1つのページではなく、必ずいくつかのページを参考にすると物事を立体的に捉えられるのでお勧めです。

値だけをコピー貼り付け

 先の例では書式なども含めた全てのコピーでした。
 値だけをコピーする方法を見ていきましょう。

Sub Macro2()
'
' Macro2 Macro
'

'
    Range("B2").Select
    Selection.Copy
    
    Range("D2").Select
    
    Selection.PasteSpecial _
        Paste:=xlPasteValues, _
        Operation:=xlNone, _
        SkipBlanks:=False, _
        Transpose:=False

    'PasteSpecial = 形式を選択してペースト
        '貼り付け対象 = 値
        '演算=しない
        '空白セル=無視
        '行列入れ替え=行わない
  
End Sub

 説明を付け加えるため改行するなど多少変更しています。
 今回は、貼り付けオプションを「値」にして貼り付けています。
 先程より複雑になっていますね。

 では変形していきます。
 まず、最初の2行は前と同じで以下のように書けます。

Range("B2").Copy

次もSelect同士なのでつなげてOKです。

 Range("D2").PasteSpecial 
    .................

 次いてオプション部分ですが、デフォルト値を取っている場合は省略できます。
 これはVBA全般でそのような仕様になっています。
 (デフォルト値とは「初期設定値」という意味で何も選ばれなかった時にその値を取ります。)

 という事で、以下は全てデフォルト値なので省略できます。

    Paste:=xlPasteValues
    Operation:=xlNone
    SkipBlanks:=False
    Transpose:=False

最後に2行が残りました。

 Range("B2").Copy
 Range("D2").PasteSpecial 

 これはCopyとPasteSpecial を用いた例です。
 しかし、値だけのコピーであれば、RangeのValueを代入できます。

 Range("D2").Value = Range("B2").Value

 Valueは省略してもいいので、

 Range("D2") = Range("B2")

 こちらも1行で書けることになります。

マクロの記録を有効に使う方法

 マクロを記録を有効に使うには、利点欠点を見極める事が大事です。
 まず、欠点ですが、変数条件分岐繰り返し処理ができませんので、その辺のプログラミングのやり方はマクロの記録では学ぶことができないという事になります。

 そして利点としては、面倒なプロパティ値などを見せてくれる点です。
 
 プログラミングには、変数、条件分岐、繰り返しという基礎的な要素と、オブジェクト、プロパティ、メソッドなどVBA固有の扱い方を学ぶ必要があります。
 これらをプログラムの両輪に例えるならマクロの記録は片方の車輪しか対応していないという事になります。
 この辺を理解すれば、自ずと使い方は見えてくるでしょう。

マクロの記録で出来ない事

 筆者が初心者の頃は、「マクロの記録でプログラムを自動化できる」という事を妄信してきました。
 しかし、実際にやってみると訳の分からないコードがたくさん生成され混乱するばかりですし、上手くいかないケースも出てきました。

 マクロの記録は「再現」させるプログラムで、「自動化」とは意味合いが異なります。
 具体的には、以下の事ができません。

 ・変数の使用
 ・条件分岐
 ・繰り返し処理

 繰り返し処理に関しては、同じようなコマンドを重ねていけばできるので代用は効きますが、変数を介しての値の引き渡しや、条件分岐に関しては無理です。
 まずは、この事を理解してマクロの記録と向き合うようにしましょう。

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