Я пытался получить расположение всех разрывов страниц на данном листе 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 тоже не помог.





Вы установили для ScreenUpdating значение True, как упоминалось в статье базы знаний?
Вы можете фактически переключить его на True, чтобы принудительно перерисовать экран. Похоже, что вычисление разрывов страниц - это побочный эффект фактического рендеринга страницы, а не то, что Excel делает по запросу, поэтому вы должны запускать рендеринг страницы на экране.
Экспериментируя с Excel 2007 из Visual Basic, я обнаружил, что разрыв страницы неизвестен, если он не отображался на экране хотя бы один раз.
Лучшее обходное решение, которое я смог найти, - это перейти на страницу вниз, от верха листа до последней строки, содержащей данные. Затем вы можете перечислить все разрывы страниц.
Вот код 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
Этот код сделал одно упрощающее предположение:
В дополнение к этому, я обнаружил, что Application.ActiveWindow.View должен быть установлен на xlNormalView (а не на xlPageBreakPreview). Я все равно получаю ту же ошибку 8002000b, если у меня нет представления, установленного на xlNormalView. Спасибо за помощь!