2008-09-16 45 views
1

我一直在嘗試通過COM檢索給定Excel 2003工作表上的所有分頁符的位置。以下是我正在試圖做那種事的例子:如何迭代Excel 2003工作表中的所有分頁符通過COM

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正確指出工作表中的分頁符數量,但我似乎只能檢索第一個。在循環的第二次運行中,調用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會滾過所有水平分隔符,但是當我嘗試訪問第二個分隔符時,我仍然遇到同樣的問題。不幸的是,切換到Excel 2007也沒有幫助。

回答

2

從Visual Basic中試用Excel 2007,我發現分頁符不知道,除非它至少在屏幕上顯示過一次。

我能找到的最佳解決方法是從工作表頂部向下翻頁,最後一行包含數據。然後你可以枚舉所有的分頁符。

這裏的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 

此代碼由一個簡單的假設:

  • 我用.END( xlDown)方法來計算數據的走向......這假設您有從A1到底部的連續數據。如果不這樣做,則需要使用其他一些方法來確定滾動的距離。
+0

除了這樣做,我發現Application.ActiveWindow.View需要設置爲xlNormalView(而不是xlPageBreakPreview)我仍然得到相同的8002000b錯誤,除非我已將視圖設置爲xlNormalView。 感謝您的幫助! – Martin 2008-09-17 20:30:41

0

您是否將ScreenUpdating設置爲True,如知識庫文章中所述?

您可能希望將其切換爲True以強制屏幕重繪。這聽起來像是分頁計算是實際呈現頁面的一個副作用,而不是Excel按需執行的操作,所以您必須觸發屏幕上的頁面呈現。