2013-06-03 4 views
9

Я делаю много изменений в документе Word, используя автоматизацию, а затем запускаю макрос VBA, который, помимо прочего, проверяет, что документ не превышает определенное количество страниц.Как я могу надежно получить количество страниц в документе Word?

Я использую ActiveDocument.Information(wdNumberOfPagesInDocument), чтобы получить количество страниц, но этот метод возвращает неверный результат. Я думаю, это потому, что Word еще не обновил разбиение на страницы документа, чтобы отразить изменения, которые я сделал.

ActiveDocument.ComputeStatistics(wdStatisticPages) также страдает от той же проблемы.

Я пробовал придерживаться звонка ActiveDocument.Repaginate, но это не имеет значения.

Мне посчастливилось добавить абзац в конец документа, а затем удалить его снова - но этот хак, похоже, больше не работает (я недавно перешел из Word 2003 в Word 2010).

Есть ли способ заставить Word на самом деле репатрировать и/или дождаться завершения полного заполнения?

+0

оба метода, которые вы используете, являются правильными. возможно, вы должны дать ему время для пересчета/репаализации перед тестированием количества страниц? какие изменения вы делаете, что приводит к этой проблеме? –

+0

У меня была аналогичная проблема (я не помню, какой тип, а не номера страниц, но что-то подобное), и я решил это, показывая окно приложения Word (оно было скрыто). – Voitcus

+0

@KazJaw: Сколько времени, тем не менее :-) Изменения, которые я делаю, в основном добавляют/удаляют текст и удаляют строки таблицы. Однако документ имеет сложный макет. –

ответ

2

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

Application.OnTime When:=Now + TimeValue("00:00:02"), _ 
     Name:="UpdateStats" 

Я хотел бы также обновить все поля до этого OnTime заявления:

ActiveDocument.Range.Fields.Update 
0

Я нашел возможный обходной путь ниже, если не реальный ответ на вопрос темы. Вчера, первая линия ComputeStatistics ниже возвращалась правильные общей сложности 31 страниц, но сегодня он возвращает только 1.

Решения избавиться от Content объекта и правильное число страниц возвращаются.

Dim docMultiple As Document 
Set docMultiple = ActiveDocument 
lPageCount = docMultiple.Content.ComputeStatistics(wdStatisticPages) ' Returns 1 
lPageCount = docMultiple.ComputeStatistics(wdStatisticPages) ' Returns correct count, 31 
+0

Я думаю, что вы видите, это просто удача - или, скорее, вопрос времени. ComputeStatistics вернет правильный результат * в конечном итоге *, поэтому вызов его в цикле или после задержки - или даже вызов его дважды в некоторых случаях - приведет к правильному результату. Беда в том, что это недостаточно предсказуемо, чтобы сделать это полезным. Если вы снова прочитаете вопрос, вы увидите, что я уже использовал ActiveDocument.ComputeStatistics, который не работал надежно для меня. –

5

Try (возможно после ActiveDocument.Repaginate)

ActiveDocument.BuiltinDocumentProperties(wdPropertyPages) 

Это вызывает мое Word 2010, чтобы провести полсекунды с «счетные слова» статус в строке состояния, а ActiveDocument.ComputeStatistics(wdStatisticPages) немедленно возвращает результат.

Источник: https://support.microsoft.com/en-us/kb/185509

+0

Хороший крик - не могу попробовать сейчас (эта проблема была 2 работы назад), но это звучит стоит попробовать. –

+0

@GaryMcGill Спасибо, надеюсь, что кто-то еще будет :) – alexkovelsky

+0

@alexkovelsky Отлично работает! Спасибо – Tejas

-1

ActiveDocument.Range.Information(wdNumberOfPagesInDocument)

Это работает каждый раз для меня. Он возвращает полные физические страницы в слове.

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/17740546) – Ahmad

+0

Вот что я сказал, что уже делал в этом вопросе. 'ActiveDocument.Information (wdNumberOfPagesInDocument)' такой же, как 'ActiveDocument.Range.Information (wdNumberOfPagesInDocument)', потому что 'Range' является свойством по умолчанию' Document'. Он работает большую часть времени, но не надежно во время автоматизации, включающей множество сложных документов. –

1

Я просто потратил 2 часа на то, чтобы решить эту проблему, и мне еще предстоит увидеть этот ответ на любом форуме, поэтому я решил поделиться им.

https://msdn.microsoft.com/en-us/vba/word-vba/articles/pages-object-word?f=255&MSPPError=-2147217396

Это дало мне мое решение в сочетании с прочесывать статьи, чтобы найти, что большинство решений людей ссылаются не поддерживается в новейших версиях Word.Я не знаю, какую версию она изменилась, но мое предположение, что 2013 и более поздние версии могут использовать этот код для подсчета страниц:

ActiveDocument.ActiveWindow.Panes(1).Pages.Count. 

Я считаю, что путь это работает ActiveDocument выбирает файл, ActiveWindow подтверждает, что файл, который будет использоваться, находится в текущем окне (в случае, если файл открыт в нескольких окнах со вкладки просмотра), Panes определяет, что если есть несколько окон/разделенных панелей/любой другой ерунды, вы хотите, чтобы «первая» была оценена , pages.count обозначает объект страницы, который будет оцениваться, подсчитывая количество элементов в коллекции.

Любой более осведомленный, не стесняйтесь меня исправить, но это первый метод, который дал мне правильное количество страниц на любом документе, который я пробовал!

Также извиняюсь, но я не могу понять, как отформатировать эту строку в блок кода. Если моды хотят отредактировать мой комментарий, чтобы это было моим гостем.

+0

Это интересно. Я не в состоянии подчеркнуть это так, как у меня с другими решениями (другие решения работают в 90% случаев), но после быстрого теста он выглядит многообещающим. Тот факт, что доступ к коллекции 'Pages' можно получить только в том случае, если в представлении« Макет печати »предполагается, что он действительно учитывает макет страницы. (Я также задаюсь вопросом, работает ли это, когда «ScreenUpdating» выключен и/или документ не виден - обе вещи уменьшат его полезность в сценариях автоматизации). –

Смежные вопросы