Microsoft 製品に組み込まれている Visual Basic の実装。
提示されたコード自体は問題あるわけがありません。
ですから複合要因ということでしょう。
実際にクラッシュが再現できるようなコードが提示が可能であれば良いのですが、なかなか難しいでしょうね。
で、一般論ですが、プロテクトされたシートが存在する状況でコードを実行するのは無用なトラブルを招きます。
ですから、コードの入り口でプロテクトを解除し、終了直前にプロテクトをかけるようにするのが普通ではないかと思います。
また、SelectとかActivateを多用されているようですが、このようなコードを書いてしまうと、実際どのような状況で動いているのかによって動きが変わりますのでトラブルの際解決が難しくなります。(このケースでは直接の関係はありません。またSelectとかActivateはほぼ100%なしでコードは書けます)
で、互換性はあると申し上げましたが、バージョンが変わると、仕様が厳密になり今まで結果オーライで動いていたものがエラーになるとか、前と異なった動きをするようになるケースはままあります。
ですから、細かく言うとOfficeのバージョン、OSの各バージョンで実際にうごかしてみるまで本当のところは分かりません。
申し訳ないですが、実際に症状が再現できるようなサンプルコード(実物の長大なものではなく)が提示されないと余程良く知られている現象でないとそのものずばりの回答は出ないのではないかと思います。