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 の挙動が変わるのはどうなのよ? と思いたいところですがー