Как узнать количество страниц в документе Word с помощью VBA

Vba word количество страниц в документе

I am making lots of changes to a Word document using automation, and then running a VBA macro which — among other things — checks that the document is no more than a certain number of pages.

I’m using ActiveDocument.Information(wdNumberOfPagesInDocument) to get the number of pages, but this method is returning an incorrect result. I think this is because Word has not yet updated the pagination of the document to reflect the changes that I’ve made.

ActiveDocument.ComputeStatistics(wdStatisticPages) also suffers from the same issue.

I’ve tried sticking in a call to ActiveDocument.Repaginate , but that makes no difference.

I did have some luck with adding a paragraph to the end of the document and then deleting it again — but that hack seems to no longer work (I’ve recently moved from Word 2003 to Word 2010).

Is there any way I can force Word to actually repaginate, and/or wait until the repagination is complete?

11.5k 5 gold badges 20 silver badges 33 bronze badges

asked Jun 3, 2013 at 10:03

Gary McGill Gary McGill

26k 25 gold badges 117 silver badges 200 bronze badges

I just spent a good 2 hours trying to solve this, and I have yet to see this answer on any forum so I thought I would share it.

That gave me my solution combined with combing through the articles to find that most of the solutions people reference are not supported in the newest versions of Word. I don’t know what version it changed in, but my assumption is that 2013 and newer can use this code to count pages:

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

I believe the way this works is ActiveDocument selects the file, ActiveWindow confirms that the file to be used is in the current window (in case the file is open in multiple windows from the view tab), Panes determines that if there is multiple windows/split panes/any other nonsense you want the «first» one to be evaluated, pages.count designates the pages object to be evaluated by counting the number of items in the collection.

Anyone more knowledgeable feel free to correct me, but this is the first method that gave me the correct page count on any document I tried!

Also I apologize but I cant figure out how to format that line into a code block. If the mods want to edit my comment to do that be my guest.

26k 25 gold badges 117 silver badges 200 bronze badges

answered Jan 30, 2018 at 22:19

Try (maybe after ActiveDocument.Repaginate )

ActiveDocument.BuiltinDocumentProperties(wdPropertyPages) 

It is causing my Word 2010 to spend half-second with «Counting words» status in status bar, while ActiveDocument.ComputeStatistics(wdStatisticPages) returns the result immediately.

answered Jul 15, 2015 at 8:41

3,791 1 gold badge 27 silver badges 21 bronze badges

After you’ve made all your changes, you can use OnTime to force a slight delay before reading the page statistics.

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

I would also update all the fields before this OnTime statement:

ActiveDocument.Range.Fields.Update 

answered Jun 15, 2013 at 11:19

19.1k 5 gold badges 49 silver badges 69 bronze badges

I found a possible workaround below, if not a real answer to the topic question. Yesterday, the first ComputeStatistics line below was returning the correct total of 31 pages, but today it returns only 1.

The solution is to get rid of the Content object and the correct number of pages is returned.

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

7,064 7 gold badges 36 silver badges 62 bronze badges

answered Jul 17, 2014 at 15:21

This works every time for me. It returns total physical pages in the word.

21.7k 30 gold badges 95 silver badges 140 bronze badges

answered Oct 26, 2017 at 4:11

I used this from within Excel it worked reliably on about 20 documents none were longer than 20 pages but some were quite complex with images and page breaks etc.

answered Mar 23, 2020 at 7:36

One problem I had in getting «ComputeStatistics» to return a correct page count was that I often work in «Web Layout» view in Word. Whenever you start Word it reverts to the last view mode used. If Word was left in «Web Layout» mode «ComputeStatistics» returned a page count of «1» page for all files processed by the script. Once I specifically set «Print Layout» view I got the correct page counts.

$MSWord.activewindow.view.type = 3 # 3 is 'wdPrintView', 6 is 'wdWebView' $Pages = $mydoc.ComputeStatistics(2) # 2 is 'wdStatisticPages' 

answered Feb 17, 2022 at 1:48

You can use Pages-Object and its properties such as Count. It works perfect;)

Dim objPages As Pages Set objPage = ActiveDocument.ActiveWindow.Panes(1).Pages

answered Sep 27, 2022 at 20:01

Dim wordapp As Object Set wordapp = CreateObject("Word.Application") Dim doc As Object Set doc = wordapp.Documents.Open(oFile.Path) Dim pagesCount As Integer pagesCount = doc.Content.Information(4) 'wdNumberOfPagesInDocument doc.Close False Set doc = Nothing 

answered May 30, 2019 at 5:42

1 1 bronze badge

16.09.2020, 13:10. Показов 8066. Ответов 7

Метки нет (Все метки)

Всем добрый день! Пытаюсь посчитать количество страниц в Word-документе, код следующий:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 objWord As  Dim MyRange  Excel.Range Dim FileStart  intWords As  Dim i, enПуть"  Set objDoc = objWord.Documents.(FileSt) objWord.Visible = True objDoc.Activate NumPages = objWord.ActiveDocument.Content.ComputeStatistics(wdStatisticPages)  'NumPages = objWord.ActiveDocument.BuiltinDocumentProperties("Number of pages") MsgBox (NumPages)

Пробую 3 разных варианта — первый почему-то возвращает число слов Второй возвращает ошибку А третий всегда возвращает цифру 6, хотя, количество страниц в документе всегда разное (это документ накопительного типа, то есть сегодня 10, завтра 15, послезавтра 20). Вопрос в том — почему может возвращать всегда одинаковое число? Может, в настройках самого документа, а не кода что-то посмотреть?

кажется это сочетание objWord.ActiveDocument — ни к чему, что-то одно … пока проекспериементируйте на активном документе, а уж потом изошряйтесь

Ципихович Эндрю, разницы-то никакой нет, меняю NumPages = objWord.ActiveDocument.BuiltinDocumentProperties(» Number of pages»)

На NumPages = objDoc.BuiltInDocumentProperties(«Number of pages») — ничего не меняется, вывод неверный что там, что там. Вопрос в том, откуда он берет именно конкретную цифру 6, когда в документе больше страниц. И почему по wdStatisticPages выводит не страницы, а количество слов…

2630 / 1636 / 744

Сообщение было отмечено Exclsius как решение

Решение

Exclsius, Используйте константы:

Добавлено через 3 минуты Exclsius, Используйте константы. В вашем примере NumPages = objWord.ActiveDocument. Content.ComputeStatistics(wdStatisticPages) замените на NumPages = objDoc .ComputeStatistics(2)

1 2 3 4 5 6 7 8 9 10
 MMM() FileSt = "Путь"  Set objWord = ("Word.Application")  objDoc = objWord.Documents.Open(FileSt) objWord.Visible =  MsgBox (objDoc.ComputeStatistics(2)) objDoc.Close objWord.Quit  Sub

3069 / 1735 / 361

Записей в блоге: 4

Exclsius, такое поле в любом месте документа покажет количество страниц

Narimanych, спасибо большое! Действительно, сработало. А сможете подсказать, почему константы использовать лучше? И как узнать соответствие константы конкретному методу?

Записей в блоге: 4

почему константы использовать лучше?

если константа с префиксом wd — это константа из библиотеки ворда. В экселе или vbs, например, по имени она будет не доступна. Но её значение можно использовать. Но в таком случае лучше объявить её вручную:

Const wdStatisticPages = 2

Тогда в будущем будет проще понять, что это за константа. Лучше, чем магическое число 2

87844 / 49110 / 22898

Формулировка задачи:

Всем Для определения количества страниц активного документа Word, использовал такой код:

количество страниц определялось корректно, до тех пор пока мне не попался файл, который лежит в приложении. Объясните пожалуйста, почему в этом файле количество страниц определяется неверно?

Код к задаче: «VBA Word: Количество страниц документа»

NumPages = ActiveDocument.ComputeStatistics(wdStatisticPages)

11 голосов , оценка 3.727 из 5

Уважаемые форумчане!Подскажите пожалуйста, как определить количество страниц word файла?В excel таблице есть список с именами файлов. В папке word файлы. Необходимо узнать количество страниц каждого word файла.

Изменено: ac1-caesar — 01.02.2015 20:47:10

Сообщений: 9709 Регистрация: 22.12.2012

справка Word предлагает следующую конструкцию

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

фрилансер Excel, VBA — контакты в профиле«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

Сообщений: 1042 Регистрация: 10.06.2013

Где-то в сети помнится вычитал про:

Selection.Information(4) 'wdNumberOfPagesInDocument

Еще вот так можно:

ActiveDocument.BuiltInDocumentProperties(14) 'wdPropertyPages

Изменено: Все_просто — 01.02.2015 21:04:48

Можно ли получить количество страниц не открывая word файла?

Сообщений: 9709 Регистрация: 22.12.2012

Цитата
ac1-caesar пишет: Можно ли получить количество страниц не открывая word файла?

очевидно — да.Win7 по правому щелчку на файле на вкладке «Подробно» такую информацию показывает.а вот как именно туда добраться из VBA — гугл в помощь.

фрилансер Excel, VBA — контакты в профиле«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

Так ищу, пока безуспешно….

Вот есть на сайте всезнающего Чипа:

DSO OLE Document Properties Reader 2.1 — надо будет отметить в References.На сайте Microsoft есть соответствующая библиотека.

Изменено: Все_просто — 01.02.2015 21:24:13

Ребят, спасибо конечно, но что то сложновато для меня. Не так силен. Попроще бы пример…

Сообщений: 14182 Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Цитата
ac1-caesar пишет: Попроще бы пример

И без открытия файла, и попроще…Вы определитесь — шашечки или ехать.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

Понимаю, что без открытия файла макрос отработает гораздо быстрее, так как word файлов более сотни.Однако глубоких познаний в программировании не имею для оперирования по предоставленным ссылкам.

Изменено: ac1-caesar — 01.02.2015 22:07:54

Сообщений: 9709 Регистрация: 22.12.2012

офф . не ожидал такой робости от человека, в чьём нике присутствует цезарь.

фрилансер Excel, VBA — контакты в профиле«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

ac1-caesar, а по другому никак. Нужно приобщаться к сложностям. Два года назад мое программирование ограничивалось вставкой в цикл записанного в макрорекодере. Благодаря расширению кругозора, задачи, казавшиеся сложными, для меня сегодня стали достаточно тривиальными. Нельзя оставаться в зоне комфорта, нужно все время осваивать что-то новое.

Сообщений: 471 Регистрация: 25.07.2013

Все_просто, согласен с Вами. Будем осваивать. С открытием word файла уже нашел, а вот с закрытыми нужно будет почитать.В любом случае, всем спасибо за участие и помощь.

Пишет ivan (sidorec.ivan[DOGGY]googlemail.com):

Особо не разбирался, но следующий несложный код на VBA, вставленный в документ Word, сработал, т.е. определил число страниц для каждого из кучи файлов, найденных на всём диске c:

Правда, я тут открывал-закрывал файлы и смотрел число страниц через ActiveDocument. Офис был версии XP, в младших версиях VBA вообще глючный.

Загрузка информации из файлов Word (перебор страниц в документе)

Функция предназначена для вывода информации (статистики) по всем листам документа Word.

В качестве параметра, функция получает ссылку на открытый документ Word.

Результат работы функции представлен на скриншоте.

Код функции WordDocumentProperties:

Function DocumentProperties(ByRef doc As Object) As Variant On Error Resume Next: Err.Clear ' формирует статистику по документу Word ' возвращает двумерный массив из 3 столбцов, ' а строк в массиве столько, сколько страниц в документе DOC. ' 1 столбец: номер страницы + статистика (количество абзацев, слов и букв) ' 2 столбец - текст, с которого начинается страница ' 3 столбец - текст, которым заканчивается страница Dim pg As Object, oRng As Object, pos1 pc, 1 To 3) For n = 1 To pc = doc.Range.GoTo(1, 2, , n).Start ' wdGoToPage = 1, wdGoToNext = 2 If n = pc = doc.Range.End Else pos2, pos2Страница: "  vbLf  абзацев: "   _ " символов: "  - pos1": txt = Replace(oRng.Text, vbNewLine, " ") txt1$ = Left(txt, 50): sp = InStrRev(txt1, " ") If sp 1 Then txt1 = Left(txt1, sp = 0: sp ") If sp 1 Then txt2 = Mid(txt2, sp, ShortFilename$, subfolder$, DateCreated, FileSizeНе удалось открыть файл DOC" Else ' документ успешно открыт arr = "": arr = DocumentProperties(doc) If IsArray(arr) Then ' если удалось загрузить данные из документа Word cell.Resize(UBound(arr), 5).Value = Array(index) cell.Offset(, 5).Resize(UBound(arr), 3).Value = arr ' выводим результаты на лист Else cell.Resize(, 5).Value = Array(index) cell.Offset(, 5) = "Не удалось загрузить данные из файла" End If doc.Close False ' закрываем файл DOC End If

Word vba количество страниц в документе

Узнать количество страниц документа MS Word

2rik: Ребят, помогите. Нужно узнать количество страниц документа МС Ворд.На одном из форумов прочитал такое:

long value;OleVariant IncludeFootnotes = True;if( SUCCEEDED(WordApp->ActiveDocument->ComputeStatistics(wdStatisticPages,IncludeFootnotes,>

Но я не могу разобраться, что за объект WordApp ))

Мой код открытия:

Как мне подстроить подсчет кол-ва страниц под свой код ?)

S0mbre: http://cbuilder.ru/index.php/topic,4422.0.htmlА Вот тебе макрос, который я писал в Экселе для подсчета статистики Вордовских документов:Код:

Dim appWD As Word.Application ‘ объект Word Dim docWD As Word.Document ‘ документ Word Dim rg_paths As Range ‘ список путей к документам Dim n_paths_row, n_paths_rows, n_paths_col, pages, chars As Integer

On Error GoTo ErrorHandler

‘ Инициализируем переменные Set appWD = New Word.Application appWD.Visible = False

Set rg_paths = ActiveSheet.Range("E1:E76")

‘ Номера строк и столбцов списка n_paths_row = rg_paths.Row n_paths_rows = rg_paths.Rows(rg_paths.Rows.Count).Row n_paths_col = rg_paths.Column

pages = chars = 0 For rw = n_paths_row To n_paths_rows ‘ по всем строкам списка ‘ открываем этот документ Word Set docWD = appWD.Documents.Open(Filename:=ActiveSheet.Cells(rw, n_paths_col).Text, ReadOnly:=True, Visible:=False) If docWD Is Nothing Then MsgBox ("Не могу открыть документ!") GoTo ErrorHandler End If ‘ Записываем данные статистики docWD.Repaginate pages = docWD.BuiltinDocumentProperties(wdPropertyPages) chars = docWD.BuiltinDocumentProperties(wdPropertyCharsWSpaces) docWD.Close (False) ‘ закрываем документ без запроса ‘ Пишем данные в Excel ActiveSheet.Cells(rw, n_paths_col + 1).Value = pages ActiveSheet.Cells(rw, n_paths_col + 2).Value = chars ‘ActiveSheet.Cells(rw, n_paths_col + 3).Text = CStr(docWD.BuiltinDocumentProperties(wdPropertyTitle))

‘ закрываем Word appWD.Quit (False) ‘ уничтожаем обьект — документ Set appWD = Nothing ‘ уничтожаем обьект — Word Set appWD = Nothing

If Not appWD Is Nothing Then appWD.Quit (False) ‘ закрываем Word Set appWD = Nothing ‘ уничтожаем обьект — Word End If

Просто переведи нужные тебе строчки на С++ OLE и все.

Ex_Soft: тынць

2rik: Спасибо, ребят) Вышло ;D

Спасибо, ребят) Вышло ;D

Рано радовался .. ))) Чет тупит снова ) При попытке прочитать количество страниц.

Когда пытаюсь так:

Копмилятор выдает мне вот что: [C++ Error] Unit1.cpp(199): E2451 Undefined symbol ‘wdPropertyPages'[C++ Error] Unit1.cpp(199): E2285 Could not find a match for ‘Variant::OlePropertyGet(char *,undefined)’

Что может быть за фигня ? )

Фухх ) Оказывается, надо было добавить библиотеку word_2k.h

Оцените статью
InternetDoc.ru
Добавить комментарий