1

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、「無効なインデックス」が発生します。

コレクションを反復処理する列挙子を取得するために を使用しようとしてpHPageBreaks->Get_NewEnum()も、 への呼び出しの直後に同じエラーで失敗しますGet_NewEnum()

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

Excel でシート内のすべての改ページの位置を返す方法を誰かが教えてくれたら、それは素晴らしいことです!

ありがとうございました。

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

@Joel:pSheet->UsedRange過去にスクロールする行を決定するために使用しましたが、Excel はすべての水平方向の区切りを超えてスクロールしますが、2 番目の区切りにアクセスしようとすると、まだ同じ問題が発生します。残念ながら、Excel 2007 に切り替えても効果はありませんでした。

4

2 に答える 2

2

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

私が見つけた最善の回避策は、シートの一番上からデータを含む最後の行まで、ページダウンすることでした。次に、すべての改ページを列挙できます。

これがVBAコードです...これをCOMに変換する際に問題がある場合はお知らせください:

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 つの仮定を作成しました。

  • .End(xlDown) メソッドを使用して、データがどこまで移動するかを把握しました...これは、A1 からシートの下部まで連続したデータがあることを前提としています。そうでない場合は、他の方法を使用して、スクロールし続ける距離を把握する必要があります。
于 2008-09-17T01:14:02.470 に答える
0

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

実際に True に切り替えて、画面の再描画を強制することもできます。改ページの計算は、Excel がオンデマンドで行うものではなく、実際にページをレンダリングすることの副作用であるように思われるため、画面上でページ レンダリングをトリガーする必要があります。

于 2008-09-17T00:04:01.843 に答える