excel vba HPageBreak.Count не работает при вызове макроса из Auto_Open

Я работаю над проектом, в котором я читаю файл CSV, форматирую данные во временном листе (OutputSheet), копирую-вставляю форматированные данные на лист для печати (PrintSheet), сохраняю PrintSheet как PDF после вставки разрывов страниц вручную, чтобы что блок данных не разбивается по страницам. Я делаю это в функции макроса Excel VBA. Вот соответствующая часть кода:

PrevPageNum = PrintSheet.HPageBreaks.Count

OutputSheet.Rows("6:" & (CurrHistoryRows + 14)).Copy

PrintSheet.Cells(PrtPstStRow, 1).PasteSpecial Paste:=xlPasteFormats
PrintSheet.Cells(PrtPstStRow, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False

PageNum = PrintSheet.HPageBreaks.Count

If PrevPageNum < PageNum Then
    PrintSheet.Rows(PrtPstStRow).PageBreak = xlPageBreakManual
End If

Когда я вызываю макрос непосредственно из кода или с помощью назначенной кнопки на панели инструментов быстрого доступа, разрывы страниц вручную назначаются правильно. Но когда я вызываю этот макрос из Auto_Open, они вообще не назначаются (все остальное остается прежним!). После отладки кода я заметил, что PrevPageNum и PageNum всегда равны нулю, когда макрос вызывается из Auto_Open. В двух других случаях значения меняются.

Также хотелось бы отметить, что ширина PrintSheet в макете страницы увеличена до 1 Page.

Любые идеи, пожалуйста! Спасибо.

Update: Я добавил эти операторы незадолго до PrintSheet.HPageBreaks.Count, и разрывы страниц также начали работать с Auto_Open.

OutputSheet.Activate
PrintSheet.Activate

FINAL Update: Когда я запускал это на "медленном" компьютере (процессор - i3 с 3 ГБ оперативной памяти DDR2), я снова столкнулся с той же проблемой пропуска разрывов страниц. После долгих поисков я наконец нашел решение (или обходной путь) со 100% успехом. Вам нужно прокрутить вертикально до последней использованной строки, чтобы HPageBreaks Collection обновился с помощью Count. Окончательный код выглядит следующим образом:

PrintSheet.Activate
CurrentRowNum = ActiveWindow.ScrollRow
ActiveWindow.ScrollRow = 5000 'or the last used row
PageNum = PrintSheet.HPageBreaks.Count
ActiveWindow.ScrollRow = CurrentRowNum

person NP3    schedule 26.10.2014    source источник
comment
К сожалению, это похоже на Excel-2013. Я тестировал этот сценарий в Excel-2010, и страницы отчетов Auto_Open разрываются правильно. Держась за соломинку, возможно, стоит создать тестовый пример с только разрывами страницы на случай, если какая-то другая часть вашего кода взаимодействует с этим.   -  person chris neilsen    schedule 26.10.2014
comment
Я протестировал весь проект в Excel 2010 на другом компьютере, и все прошло отлично. Затем я создал еще одну книгу с поддержкой макросов, используя только соответствующую часть кода, и протестировал ее в Excel 2013 и 2010, и это тоже было успешным. Так что в коде было что-то, что не понравилось Excel 2013. Затем я последовал подходу П. Дж. Розенбурга (ниже) и вуаля! Это сработало!   -  person NP3    schedule 26.10.2014


Ответы (1)


Когда вы используете Auto_Open, значение отсутствует, потому что вы не переходили с другой страницы или даже имели страницу к тому времени, когда эти переменные были назначены.

У вас может быть встроенный оператор if для обработки случая, когда оба они равны нулю. В основном, обработка случая, когда вы используете Auto_Open. Потому что в любом другом случае там будет ценность.

person peege    schedule 26.10.2014
comment
То есть вы говорите, что в случае Auto_Open я не могу использовать PrintSheet.HPageBreaks.Count? Если да, то каковы альтернативы (в утверждении IF)? Я попытался (безуспешно) использовать DoEvents. Я также пробовал использовать PrintSheet.Activate непосредственно перед оператором PrintSheet.HPageBreaks.Count. - person NP3; 26.10.2014
comment
Возможно, вы могли бы смоделировать открытие страницы, а затем переключиться обратно на другую страницу / лист, просто чтобы получить для этого значение. Или, если вы знаете, какие переменные должны быть установлены, просто установите их. У меня нет возможности проверить это прямо сейчас. - person peege; 26.10.2014
comment
Спасибо за предложение. Я активировал лист вывода, затем активировал лист печати непосредственно перед вызовом PrintSheet.HPageBreaks.Count, и вот оно! Теперь он работает и из Auto_Open! Я тоже обновил свой вопрос. - person NP3; 26.10.2014
comment
Большой. Рад это слышать. Для этого могут быть более практичные способы, но рабочее решение ›нерабочее. - person peege; 26.10.2014
comment
К вашему сведению: проверьте мое решение в обновленном вопросе. - person NP3; 21.11.2014