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正确指示了工作表中的分页符数,但我似乎只能检索第一个。在循环的第二次运行中,调用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 也无济于事。

4

2 回答 2

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 到工作表底部的连续数据。如果不这样做,则需要使用其他方法来确定要滚动多远。
于 2008-09-17T01:14:02.470 回答
0

如知识库文章中所述,您是否将 ScreenUpdating 设置为 True?

您可能希望将其实际切换为 True 以强制重新绘制屏幕。听起来分页符的计算是实际渲染页面的副作用,而不是 Excel 按需执行的操作,因此您必须在屏幕上触发页面渲染。

于 2008-09-17T00:04:01.843 回答