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




