[Excel VBA]要注意なExcel VBAコード
目次
Excel VBAはマクロの書き方に自由度があり、簡単にマクロを実装できます。
それゆえに実装を間違えると、意図しない動作のマクロややけに遅いマクロになってしまいます…
ここで紹介するのはその一例と対処法です。
1.画面更新有効のままマクロ実行
Application.ScreenUpdatingをFalseにすることで、マクロ実行中の画面更新を無効にできます。
'画面更新無効化
Application.ScreenUpdating = False
'ここに処理を入れる
'画面更新有効化
Application.ScreenUpdating = True
もしこれがないと、マクロを1処理実行する度にExcelの画面表示が更新されます。
そのため、
- 画面が見ずらくなる
- マクロを実行する処理が遅くなる
ということが発生します。
逆に処理の最後でApplication.ScreenUpdatingをTrueに戻し忘れることにも注意。
2.いきなりセル指定、いきなりシート指定
“Test.xlsm”というファイル(ブック)のVBAで”Sheet1”で起動するプマクロで以下の機能を実装します。
- “Test.xlsm”の”Sheet1”A1セルの文字を”テスト”にする
これを一番簡単に書くと、以下の短い一文になります。
'"Test.xlsm"の"Sheet1"A1セルの文字を"テスト"にする
Range("A1").Value = "テスト"
シート1枚、開くブックが1つなら問題ないのですが、
シートが2枚、開くブックが2つ以上になると厄介なことになります。
このマクロを”Sheet1”以外のシート、もしくは”Test.xlsm”以外のブックを表示中に実行すると…
表示中のブックの、表示中のシートのA1セルの文字が”テスト”になります。
そして、”Test.xlsm”の”Sheet1”A1セルの文字は”テスト”になりません。
対策
対策としては、ブック、ワークの指定を追加することをおすすめします。
- ThisWorkBook…このマクロが書かれているブックを指定
- Sheets(“Sheet1”)…”Sheet1”を指定
'"Test.xlsm"の"Sheet1"A1セルの文字を"テスト"にする
ThisWorkBook.Sheets("Sheet1").Range("A1").Value = "テスト"
'もしも他のブックから指定する場合
Workbooks("Test.xlsm").Sheets("Sheet1").Range("A1").Value = "テスト"
3.Select,Selection,ActiveCell
Excelでマクロを記録すると出てくるのがSelect,Selection,ActiveCell。
Sub Macro1()
Range("A1").Select
ActiveCell.FormulaR1C1 = "テスト"
Range("A1").Select
With Selection.Font
.Color = -16776961
.TintAndShade = 0
End With
End Sub
このコードを編集したりデバッグしたりしなければいいのですが、もしするとなると要注意です。
3つの文それぞれの意味は
- Select…セルを選択
- Selection…選択中のセル
- ActiveCell…現在カーソルがあるセル
です。コードを編集したりデバッグしたりして、SelectをしてからSelection、ActiveCellを使用すると
意図しないセルに処理がされます。
対策
対策としては、Select,Selection,ActiveCellを使わないことをおすすめします。
Sub Macro1()
Range("A1").FormulaR1C1 = "テスト"
With Range("A1").Font
.Color = -16776961
.TintAndShade = 0
End With
End Sub
上記のようにSelection、ActiveCellをRange(“A1”)に置き換えることで、意図しない処理を回避できます。
ついでに、2章で取り上げたブック、シート指定を加えるとこうなります。
Sub Macro1()
Dim range As range
Set range = ThisWorkbook.Sheets("Sheet1").range("A1")
range.FormulaR1C1 = "TEST"
With range.Font
.Color = -16776961
.TintAndShade = 0
End With
End Sub
少しコードが長くなりますが、意図しない動作はこれで回避できます。
おわりに
Excel VBAは要注意な部分がありますが、そこさえ気を付ければExcelでの作業を効率よく実行できます。
「これをマクロで自動化すれば時間をかけずに作業ができる!」
ということがあれば使ってみるのはいかがでしょうか。
Tweet
←Next: [VBA,VB6]GoToとラベルの使いどころ
Previous: [.net、Java連携]C#.netで.jarを実行するンジャー →