4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Excel VBA]要注意なExcel VBAコード

Last updated at Posted at 2021-01-10

本記事は、自分サイトのこの記事と同一内容です。

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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?