Как перебирать все разрывы страниц на листе Excel 2003 через COM

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 625
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы установили для 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

Этот код сделал одно упрощающее предположение:

  • Я использовал метод .End (xlDown), чтобы выяснить, как далеко идут данные ... это предполагает, что у вас есть непрерывные данные от A1 до нижней части листа. Если вы этого не сделаете, вам нужно использовать другой метод, чтобы выяснить, как далеко продолжать прокрутку.

В дополнение к этому, я обнаружил, что Application.ActiveWindow.View должен быть установлен на xlNormalView (а не на xlPageBreakPreview). Я все равно получаю ту же ошибку 8002000b, если у меня нет представления, установленного на xlNormalView. Спасибо за помощь!

Martin 18.09.2008 00:30

Другие вопросы по теме