自分が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
これだけで済みます。
塗りつぶしやフォントの文字色変更などもそうなのですが、設定する必要がないプロパティの情報も変更しようとするので無駄が非常に多いです。
フォント系をマクロで記録した時は、スリム化出来ないか検討するようにしましょう。
コメントを残す