ExcelのAPIが、同じファイルなのにシーンによって異なる結果を返す / Range::CurrentRegion編
VSTO... ってか VBA でも同じ事が起きます @ Excel2003/2007 で確認。他は未調査…
↓こんなテーブルがあったとして…
A1 | B1 | C1 | D1 |
A2 | B2 | C2 | D2 |
A3 | B3 | C3 | D3 |
' workbook 保存前イベントをフック Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim r As Range Dim q As Range Dim s As Worksheet Set s = ActiveSheet Set r = s.Range("b2") Set q = r.CurrentRegion ' B2 が含まれる最大の矩形を取得 Debug.Print q.Address End Sub
■出力結果 # CTRL+S した場合 $A$1:$D$3 # Workbook::Save() を呼び出した場合 $B$2
……いやいやいやいや!同じコードですやん!! なんで違う範囲返してるんよ!!('A`)
さてどうしたモンかと悩み中...
追記 2013-03-08
"保存" のメニュー経由で実行したら、正常に API が動作してくれるようになりました。 詰まるところ CTRL+S をシミュレートしたって感じですね。
int SAVE_MENU_ID = 3; object m = Type.Missing; Excel.Application app = どうにかする; Office.CommandBarButton button = app.CommandBars.ActiveMenuBar.FindControl(m, SAVE_MENU_ID, m, m, true); button.Execute();
…私的には、Workbook::Save() で API の挙動が変わるのはどうなのよ? と思いたいところですがー