Excel 2007 以降のバージョンで Application.ExecuteExcel4Macro("get.document(50)") を実行しても正しいページ数が取得できない

適用対象: Excel 2013Excel 2010Microsoft Office Excel 2007

現象


Microsoft Office Excel 2007 以降のバージョンで、図形等のオブジェクトが存在するシートに対して、Application.ExecuteExcel4Macro("get.document(50)") を実行しても、正しいページ数が取得できない場合があります。
例えば、オブジェクトのみが存在するシートで Application.ExecuteExcel4Macro("get.document(50)") を実行すると、「0 ページ」という結果になります。

各製品バージョンおよびオブジェクト毎の再現状況は以下となります。
各製品バージョンおよびオブジェクト毎の再現状況を示した表

原因


Excel 2007 以降のバージョンで、Application.ExecuteExcel4Macro("get.document(50)") を実行した際、シートの使用している領域を元にページ数を割り出しますが、「シートの領域内に図形等のオブジェクトが無い」とExcel が誤った判断をして図形の存在が認識されません。
その結果、図形を含んだ印刷範囲の計算結果が正しくない状態となります。

なお、セルに値が入ってる場合は、この図形のチェックとは別の計算処理でページ数を計算しているため、正しいページ数を取得することができます。

回避策


以下のいずれかの方法で回避してください。

方法 1 : 一時的にオブジェクトの背面にあるセル (左上と右下のセル)に仮の値をセットする

Shape.TopLeftCell プロパティと Shape.BottomRightCell プロパティを使用して、オブジェクトの左上隅および右下隅に位置するセルに、一時的に仮の値をセットし、その後で、Application.ExecuteExcel4Macro("get.document(50)") を実行することで、正しいページ数を取得することができます。

以下は、Sheet1 に Shape オブジェクトが 1 つしか無く、セルには何も値が入力されていない想定でのサンプル コードとなります。

Sub Workaround()
    ' ページ数を取得する前に、オブジェクトの右上と左下にあたるセルに仮の値 (1) を一時的に入力します
    Sheets(1).Shapes(1).TopLeftCell.Cells.Value = 1
    Sheets(1).Shapes(1).BottomRightCell.Cells.Value = 1
 
    Debug.Print Application.ExecuteExcel4Macro("get.document(50)")
   
    ' セルの値を元に戻します
    Sheets(1).Shapes(1).TopLeftCell.Cells.Value = ""
    Sheets(1).Shapes(1).BottomRightCell.Cells.Value = ""
End Sub


方法 2 : PageSetup.Pages.Count プロパティを使用する

Excel 2007 以降で追加された新しいプロパティ PageSetup.Pages.Count を使用することで、正しいページ数を取得することができます。
なお、特定の条件下における現象となりますが、PageSetup.Pages.Count プロパティについて以下の現象が確認されています。

 サポート技術情報 2439589 :  Excel 2007 および Excel 2010 で Pages.Count プロパティを取得すると実際の印刷総ページ数と異なる値を取得する

状況


マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

詳細


問題の再現手順
  1. Excel 2010 を起動します。
  2. [挿入] - [図形] から任意の図形を 1 ページに収まるように挿入します。
  3. 挿入した図形を選択して右クリックし、[サイズとプロパティ] をクリックします。
  4. [プロパティ] をクリックし、[オブジェクトを印刷する] にチェックが入っていることを確認して [閉じる] をクリックします。
  5. [Alt] + [F11] キーを押下して、VBEditor を起動します。
  6. イミディエイト ウィンドウで、以下のコードを実行します。

    ?Application.ExecuteExcel4Macro("get.document(50)")
結果
正しくは 1 ですが、0 が返ります。