マクロ記録からVBAを作る人に知っておいてほしいこと

自分がVBAプログラムの初心者だった時、どうやってVBAを考えていたかと思いだしてみると、Excel標準の「マクロ記録」を使っていたと思います。

VBAの案件をこなすようになった今でも「マクロ記録」は使っていて、書式を整えたいときなど、コードがパッと出てこない時に確認しています。

そのため、「マクロ記録」からカスタマイズで制作をしている人は多いと予想しているのですが、あの機能は結構手直ししないといけないケースも多いです。

自分が、どんな時に手直ししないといけないと感じるか記載したいと思います。

セルへの値代入が何故かFomula使用

まず、マクロの記録でセルに値を代入するマクロを記録してみます。

単純にシート上のセルに値を入れて、記録終了!すると…

Range("F14").Select    
ActiveCell.FormulaR1C1 = "5"
Range("F10").Select
ActiveCell.FormulaR1C1 = "5"    

こんな感じの式になりました。(F14に”5″、F10に”5″を入力)

何故かセルの値を入れるのに、FormulaR1C1を使用しています

Formulaはセルの式を設定するためのプロパティなので、値を設定するには違和感があります。

確かにFormulaを使用して”=”をつけなければ、値になるのですが、普通の人が見れば「何故Formulaを使用しているんだ?理由でもあるのかな?」と思ってしまいますよね。

ここは素直にValueを使うようにしましょう

Range("F14").Select    
ActiveCell.Value = "5"
Range("F10").Select
ActiveCell.Value = "5"    

ちなみに、SelectやActiveCellを使うのもどうかなあと思っています。それについて次項で記載します。

Activeや暗黙的オブジェクト指定をしない

マクロの記録を使用すると、ほぼ全てがActiveなWorkSheet、Activeなセルに対しての処理になります。

これは予期せぬ動作に繋がるので必ずシート名やセル番号指定をするようにしましょう

Range("F14").Select 
ActiveCell.Value = "5"
Range("F10").Select
ActiveCell.Value = "5"

↑先程のこのマクロをSheet1で動かすとSheet1のF14とF10が”5″になります。Sheet2で動かすとSheet2のF14とF10が”5″になります。

実際には「このマクロを動かしたいのは、このシート」と決まっていることがほとんどなので予期せぬ動作に繋がります。

またSelect自体もあまり使用したくないです。なぜかと言うと処理速度が圧倒的に遅くなりますし、そのセルを選択できない状態だとエラーになるからです。

アドレスで指定すればいいだけなので、そこは素直に書いていきましょう。

Dim wb As Workbook
Dim ws As Worksheet

Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
ws.Cells(14, 6).Value = "5"
ws.Cells(10, 6).Value = "5"

ActiveWorkSheetや暗黙的なWorkSheetsもマクロ記録ですとよく使われるのですが、上記のようにブックまで指定したほうが硬いと思います。


クリップボードを使用しない

他のセルの値を特定のセルにコピーしたい場合は多くあるかと思います。それをマクロに記録すると以下のようになります。

Range("F14").Select
Selection.Copy
Range("F10").Select
ActiveSheet.Paste

Activeを使用しない、暗黙的オブジェクト指定をしないというのは前述の通りなので、そこを直してみます。

Dim wb As Workbook
Dim ws As Worksheet

Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
ws.Range("F14").Copy
ws.Range("F10").Select
ws.Paste

ここから更に改善点があります。

よくないのはCopyとPasteを使用していることです。CopyとPasteはクリップボードを使用して値を移送するのですが

  • クリップボードの中身が上書きされてしまう
  • マクロ実行中にクリップボードが使えなくなる
  • 速度が著しく遅くなる
  • Selectを使わないといけなくなる

というデメリットがあります。

以下のようにクリップボードは使わないでコピーさせます。

Dim wb As Workbook
Dim ws As Worksheet

Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
ws.Cells(10, 6).Value = ws.Cells(14, 6).Value

余計なプロパティを削除する

下記のように、セルに羅先を付けるマクロを記録します。

    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

半端ない量のコードが記録されました。

マクロの記録では、上下左右を分けて羅先を引いているのですが、マジで無駄なのでスリム化します。

Dim wb As Workbook
Dim ws As Worksheet

Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
ws.Range("C10").Borders.LineStyle = xlContinuous

これだけで済みます。

塗りつぶしやフォントの文字色変更などもそうなのですが、設定する必要がないプロパティの情報も変更しようとするので無駄が非常に多いです。

フォント系をマクロで記録した時は、スリム化出来ないか検討するようにしましょう。


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)