今回は、ネットでよく見かける「ActiveSheet」のデメリットについてです。
こちらはVBA以外の理解があるプログラマさんでも、使っている方が多いと思いますが、大きな罠があります。
デメリットと、その理由について詳しく解説していきますので、ぜひ最後までお付き合いください。
- ActiveSheetの潜在的なデメリットをご紹介します。
- 実行時の他アプリケーションを意識したコーディングが出来るようになります。
なぜ使ってはいけないのか
勿体ぶらずに結論から言います。
マクロを動かしているときに、ユーザが別のExcelやアプリケーションを使ってしまう可能性があるからです。
上記の状況が発生した場合に、バグが発生する原因になり得るからです。
ここまででピンとこない方もいるかと思いますので、具体例を混ぜながら見ていきましょう。
実際に検証してみました
前提として、以下のように複数シートが存在するExcelがあったとします。
上記のExcelを対象に、1列目に数字を 1,000,000回繰り返し入力するプログラムがあったとします。
※実験用に、100ループ目で意図的にストップさせます。
サンプルコード
Option Explicit
Public Sub testMethod()
Dim i As Long
For i = 1 To 1000000
' 1000000回ループ
' Activeシートの1列目にループ回数を入力
ActiveSheet.Cells(i, 1).Value = i
' 100ループ目でストップ
Debug.Assert i <> 100
Next i
End Sub
実行例
Step1
まずは ActiveSheetに1から100までの数字が入力されました。
Step2
この時、ActiveSheetを、Sheet1からSheet2に切り替えます。
Step3
そのあと、マクロの実行を再開します。
すると、Sheet2に数字が入力されていきました。
ここまでのまとめ
ユーザの操作(Sheetの切り替え)によって、マクロの実行結果が変わるのが分かりましたね。
これはプログラムとしてリスクを抱えていると取っていただいて良いと思います。
また、個人的な意見として可読性が下がると思います。
ActiveSheetというのは、「今どのシートがActivateされているのか」を、コードを読む人に常に意識させる必要があるからです。
最後に
皆さんは、VBAをコーディングする際に「ユーザ操作」のことを考えてコーディングしていますか?
このことを考えながらコーディングしている人は、残念ながら少数であるように感じます。
ただし、マクロの特徴としてExcelを扱う関係上「大量データを処理することが多くなる」傾向にあるのは事実です。
僕が見た中でひどいマクロですと、「処理が完了するのに 2時間かかります!」というマクロがありました。
こういうマクロを見てしまうと、「VBAって低級な言語なのかな…」って思ってしまうのですが、そんなことはありません!!
「ネットで拾ったからコピペで使ってみよう」の感覚の人が多いため、処理時間が長いマクロが量産されてしまっているのが実態です。
この記事が、皆さんのお力になれれば嬉しいです!
コメント