最近会社でExcelをいじる機会が多くなってきてます。それも珍しくVBAで。JScriptでいじってたときに比べて、ちょっとしたIDEがついてたり、インテリセンスが使えたりするのは便利なのですが、やはり旧VB、例外処理がOn Errorステートメントしかないとかなかなか不便。
このプログラムのコーダーもどうせわたし一人だし、素直に(?)JScriptでやった方がよかったかなあ。
今回特にはまったのが_Globalオブジェクト。これはオブジェクト名を省略して書けるというJScriptのGlobal(名前はわかりませんが)オブジェクトみたいなもの。
ここにRangeというおなじみのセル範囲を取得するメソッドがあるんですが、この_Global.Range、現在アクティブなWorkbookからRangeを取ろうとしてくれます。
結果、処理の最中に別のブックを開いて何かしようなどと思ったときには、目的通りのRangeがとれなくてエラー。その問題に気づかずあっちこっちで使ってしまったので修正するのが大変でした。
結論。ExcelのVBAでオブジェクトを取得するときには、しっかり親のオブジェクトを指定して書かないとはまるなと思いました。RangeはしっかりThisworkbookなり、あらかじめとっておいたWorksheetのインスタンスなりから取るようにしましょう と。
あと、特定のセルを参照したいときには名前を付けて参照した方がいいですね。セルが何らかの事情で移動したときもちゃんと名前でセル範囲を取得できますし、なによりマクロの中にぱっと見わけのつかないセルアドレスを書かずにすみます。
こちらも、_Global.Rangeメソッドを使ったりせずに、Thisworkbook.Names([Name]).ReferToRangeで*1。
*1:これもまたアクティブなブックが変わったときに、名前がたどれずにエラーがでます