質問: ### 発生している事象と質問の内容 win7で稼働中のマクロブックのwin10互換性検証を行っています。 ボタン押下後、 ForEachでシートを順番に取得し、If文で名称が一致したシートにUnprotectを行う処理で、勝手にアクティブになってしまうシートと、問題なく(アクティブにならずに)処理できるシートが混在してしまっています。 この現象では必ず同じシートがアクティブになるのですが、そのシートが複数あり(sheetA、sheetBとします) -通常実行 →sheetAがアクティブになる -ステップイン →どのシートもアクティブにならず、本来アクティブであるべきシート(sheet1)がアクティブになる -ブレイクポイント設定後、F5押下 →sheetBがアクティブになる -途中までステップイン後、途中からF5で実行 →F5を押した箇所によってsheetA、sheetB、sheet1とアクティブなシートが変化 と言った状況で、実行方法によってアクティブなシートが変わっていきます。 修正方法は、本来アクティブであるべきシートを「Sheets().Activate」で明示的にアクティブにすれば解決すると思いますが 原因について、見当がつかず困っている、という状況です。 お力を貸していただければ幸いです。 ### 初期処理より前の処理に関して 現象が発生するボタンがこの処理にたどり着くまでに行っている処理は以下の通りです。 -Application.ScreenUpdating=False -sheet1のオートフィルタ解除 -ボタン押下フラグの判定 ### 試したこと -1つ1つの処理にブレイクポイントを、設置して一度ステップインをしてからF5押下でどこで現象発生するか検証する(End If,Nextにブレイクポイント設置時のみ正しく動作する) -ウォッチウィンドウでアクティブシートが変化する度に処理を停止させる -MsgBoxでアクティブシートの名前を表示するようにし、通常実行時のアクティブシートがどう移り変わるか調査(ウォッチウィンドウと同じ結果) ### 備考 使用PC1 Windows7(32bit) Excel2010(32bit) ver.14.0.7128.5000 使用PC2 Windows10(64bit) Excel2016(32bit) ver.16.0.4266.1001 win7ではこの現象は発生しません。 社内環境のため、バージョン変更等はできません。 何卒、よろしくお願い致します。
回答: コードが提示されていないので何とも言えませんが、状況的にアクティブシートに対しての処理をしているのではないかと思います。 まあそれでもきちんと制御できていれば構わないのですが、アクティブシート前提の作りは失敗すると現在のような状況になりますし、作り的にもあまり効率的ではありません。 VBAは処理したいシートをアクティブ化しなくても直接指定して処理できますので、全体的にそのような作りに変えてみてはいかがでしょうか。 ``` WorkSheets(x).Activate ActiveSheet.Cells() = xxx ActiveSheet.Cells() = xxx ActiveSheet.Cells() = xxx ↓ Dim sh as Worksheet Set sh = WorkSheets(x) sh.Cells() = xxx sh.Cells() = xxx sh.Cells() = xxx ```