【Excel VBA】ActivateSheetの危険性について

りゅう
こんにちは!りゅう(@ryupong_b)です。
今回は、「ActiveSheet」のデメリットについて解説していきます。
はじめに

今回は、ネットでよく見かける「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って低級な言語なのかな…」って思ってしまうのですが、そんなことはありません!!
「ネットで拾ったからコピペで使ってみよう」の感覚の人が多いため、処理時間が長いマクロが量産されてしまっているのが実態です。

この記事が、皆さんのお力になれれば嬉しいです!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大手外資系コンサルティングファーム勤務。ExcelVBA歴は8年。金融関係のプロジェクトにて約100万レコードを処理するマクロの開発実績あり。ExcelVBAの基礎・応用情報を発信中。

コメント

コメントする

CAPTCHA