Excel2013以前→Excel2013へ移行したときにVBA周りがてんやわんやしたときの話。
知識集約として載せる。
Excel2013で何がおこったか
平たく言うと、2013以前はExcelアプリケーションというウインドウに複数のBookが乗っかっていた(アプリケーション閉じるボタンの下の奴で最小化すれば、複数bookを並べられたやつ)。
2013以降は個別のBookごとにウィンドウが立ち上がる。
VBAにどんな問題が?
1Bookで閉じてる処理なら問題ない。
問題があるのは、複数bookに渡って操作をする場合だ。
2013以前は1アプリケーションに紐づく全てのBookがActiveな状態だった。
対して2013以降は、別ウィンドウとして表示されるBookが処理の過程で非Activeとなる可能性がある、と言う話。
VBA、ExcelApplicationの一部の処理が、Active Bookを前提とした動作をするため、そのときに対象が非Activeな状態だったらVBA処理がエラー落ちしてしまう。
####対処法は?
非Activeな操作の前に、意図的に対象をActive、もしくは明示してやる必要がある。
自分で分かっているActive前提の処理をいかに羅列する。
.Runでマクロを起動する処理
既にOpen済みのBookに対してだけなら、マクロ名を引数に渡せば実行してくれる。
だけど、Excel2013以降、Open済みでも非ActiveなBookが対象なら、ブック名!マクロ名で起動する必要がある。
.Deleteでシートを削除する処理
ということで、Delete発効前に、非ActiveなBookをActivateさせなきゃいけない。
まとめ
現状動かないと分かったのは上記。
ExcelAppの中身が調べられればいいんだけど、その方法は知らないっす。
とりあえず、リネームやシートの移動は問題ないみたい。
また何か不具合があったら追記します。