2008-09-16 12 views
1

COM経由で特定のExcel 2003ワークシート上のすべての改ページの場所を取得しようとしました。ここで私がやろうとしているもののようなものの例です:COM経由でExcel 2003ワークシート内のすべての改ページを繰り返す方法

Excel::HPageBreaksPtr pHPageBreaks = pSheet->GetHPageBreaks(); 
long count = pHPageBreaks->Count; 
for (long i=0; i < count; ++i) 
{ 
    Excel::HPageBreakPtr pHPageBreak = pHPageBreaks->GetItem(i+1); 
    Excel::RangePtr pLocation = pHPageBreak->GetLocation(); 

    printf("Page break at row %d\n", pLocation->Row); 

    pLocation.Release(); 
    pHPageBreak.Release(); 
} 
pHPageBreaks.Release(); 

私は、これはpSheetで水平改ページのそれぞれの行番号を印刷することを期待。私が抱えている問題は、countが正しくワークシート内のページ区切りの数を示しているにもかかわらず、私は最初のページだけを取り出すように見えることがあるということです。ループを2回目に実行したときに、pHPageBreaks->GetItem(i)を呼び出すと、エラー番号0x8002000bの "無効なインデックス"がスローされます。

Get_NewEnum()の呼び出しで、pHPageBreaks->Get_NewEnum()を使用して列挙子がコレクションに対して反復処理を実行しようとしても、同じエラーで失敗します。

解決策を探しましたが、これまでに見つかったことのうち最も近いものはhttp://support.microsoft.com/kb/210663/en-usです。印刷する範囲を超えたセルや右下のセル(IV65536)など、ページ区切りを超えてさまざまなセルをアクティブにしようとしましたが、それは役に立ちませんでした。

Excelでページ区切りのすべての場所を返す方法を教えていただけたら、それはすばらしいことでしょう。

ありがとうございます。

@Joel:はい、私はユーザーインターフェイスを表示しようとしましたが、ScreenUpdatingをtrueに設定しようとしました - 同じ結果が出ました。また、ワークシート全体にpSheet->PrintAreaを設定したり、HPageBreaksコレクションを取得する前にpSheet->ResetAllPageBreaks()を呼び出すと、どちらの方法も役に立たなかった組み合わせを試してみました。

@Joel:私はpSheet->UsedRangeを使用して過去のスクロール行を特定し、Excelはすべての水平ブレイクをスクロールしますが、2番目のスクロールにアクセスしようとすると同じ問題が発生します。残念なことにExcel 2007に切り替えることは役に立たなかった。

答えて

2

Visual BasicからExcel 2007を試して、画面に少なくとも1回は表示されていない限り、改ページがわからないことを発見しました。

シートの最上部からデータが入っている最後の行までページを下ろすのが最善の回避策でした。次に、すべてのページ区切りを列挙できます。

ここではVBAコードを使用すると、COMにこれを変換するすべての問題を持っているなら、私に知らせて...です。(私は.ENDを使用

  • Range("A1").Select 
    numRows = Range("A1").End(xlDown).Row 
    
    While ActiveWindow.ScrollRow < numRows 
        ActiveWindow.LargeScroll Down:=1 
    Wend 
    
    For Each x In ActiveSheet.HPageBreaks 
        Debug.Print x.Location.Row 
    Next 
    

    このコードは、1つの単純化の仮定を作りましたxlDown)メソッドを使用して、データがどのくらい離れているかを調べます。これは、A1からシートの一番下まで連続したデータがあることを前提としています。そうでない場合、スクロールをどのくらい保持するかを把握するために、他の方法を使用する必要があります。

+0

これに加えて、Application.ActiveWindow.ViewをxlPageBreakPreviewではなくxlNormalViewに設定する必要があります。xlNormalViewに設定されているビューを持たない限り、同じ8002000bエラーが発生します。 助けてくれてありがとう! – Martin

0

KBの記事に記載されているように、ScreenUpdatingをTrueに設定しましたか?

実際に画面を強制的に再描画して、画面を再描画したい場合があります。ページ区切りの計算は、Excelがオンデマンドで行うものではなく、実際にページをレンダリングすることの副作用であるように聞こえるので、画面上でページレンダリングをトリガーする必要があります。

関連する問題