このエントリーをはてなブックマークに追加

本記事は、Qiitaのこの記事と同一内容です。

目次

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での作業を効率よく実行できます。
「これをマクロで自動化すれば時間をかけずに作業ができる!」
ということがあれば使ってみるのはいかがでしょうか。



←Next: [VBA,VB6]GoToとラベルの使いどころ
Previous: [.net、Java連携]C#.netで.jarを実行するンジャー