我一直在尝试通过 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 返回工作表中所有分页符的位置,那就太棒了!

谢谢。

@乔尔:是的,我尝试过显示用户界面,然后设置 ScreenUpdating true - 它产生了相同的结果。另外,我已经尝试过设置的组合 pSheet->PrintArea 整个工作表和/或调用 pSheet->ResetAllPageBreaks() 在我打电话之前 HPageBreaks 收集,这也没有帮助。

@乔尔:我用过 pSheet->UsedRange 确定要滚动过去的行,Excel 确实会滚动过去所有水平分隔符,但当我尝试访问第二个水平分隔符时,我仍然遇到相同的问题。不幸的是,切换到 Excel 2007 也没有帮助。

有帮助吗?

解决方案

在 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 到工作表底部的连续数据。如果不这样做,则需要使用其他方法来确定继续滚动的距离。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top