Vba word перебор страниц

Результат обработки файла 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&, pos2&
    pc& = doc.Range.Information(4)
    ReDim arr(1 To pc&, 1 To 3)
 
    For n = 1 To pc&
        pos1& = doc.Range.GoTo(1, 2, , n).Start   ' wdGoToPage = 1, wdGoToNext = 2
        If n = pc& Then
            pos2& = doc.Range.End
        Else
            pos2& = doc.Range.GoTo(1, 2, , n + 1).Start
        End If
 
        Set oRng = Nothing: Set oRng = doc.Range(pos1&, pos2& - 1)
 
        arr(n, 1) = "Страница: " & n & vbLf & _
                    "  абзацев: " & oRng.Paragraphs.Count& & vbLf & _
                    "  символов: " & (pos2& - pos1& - 1)
 
        txt = "": txt = Replace(oRng.Text, vbNewLine, " ")
        txt1$ = Left(txt, 50): sp& = 0: sp& = InStrRev(txt1, " ")
        If sp& > 1 Then txt1 = Left(txt1, sp& - 1)
        txt2$ = Right(txt, 50): sp& = 0: sp& = InStr(1, txt2, " ")
        If sp& > 1 Then txt2 = Mid(txt2, sp& + 1)
        arr(n, 2) = Trim(Application.Trim(Application.Clean(txt1)))
        arr(n, 3) = Trim(Application.Trim(Application.Clean(txt2))) 'Replace(txt2, Chr(13), vbLf)
    Next
    DocumentProperties = arr
End Function

Пример вызова функции из другого макроса:

        ' загружаем данные из файла Word
        Set doc = Nothing
        Set doc = WA.Documents.Open(filename$, , True)
 
        If doc Is Nothing Then ' если документ не открылся
            cell.Resize(, 5).Value = Array(index&, ShortFilename$, subfolder$, DateCreated, FileSize&)
            cell.Offset(, 5) = "Не удалось открыть файл DOC"
 
        Else ' документ успешно открыт
            arr = "": arr = DocumentProperties(doc)
 
            If IsArray(arr) Then ' если удалось загрузить данные из документа Word
                cell.Resize(UBound(arr), 5).Value = Array(index&, ShortFilename$, subfolder$, DateCreated, FileSize&)
                cell.Offset(, 5).Resize(UBound(arr), 3).Value = arr ' выводим результаты на лист
            
            Else
                cell.Resize(, 5).Value = Array(index&, ShortFilename$, subfolder$, DateCreated, FileSize&)
                cell.Offset(, 5) = "Не удалось загрузить данные из файла"
            End If
            doc.Close False ' закрываем файл DOC
        End If

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

Здравствуйте, не могу найти функцию или что-то подобное для перебора цикла по страницам. Задание: Если в первом параграфе (абзаце) есть прописное слово, то необходимо выровнять его по центру и перейти на следующую страницу. Знает кто-нибудь?

Код к задаче: «Работа со страницами документа»

textual

For i = 2 To ActiveDocument.ComputeStatistics(wdStatisticPages)
  Selection.GoTo What:=wdGoToPage, Which:=2, Name:=CStr(i)
Next i

Полезно ли:

9   голосов , оценка 4.444 из 5

  • Remove From My Forums
  • Question

  • Hello,

    I am not sure if this is the correct place to post this, but I am looking to create a macro which will grab specific page ranges and form a new document. what I would like are these specific pages to go to into a new document called newdoc.doc

    65-75,143-160,235-251,254-263

    I have found the following code from
    http://vbcity.com/forums/t/163889.aspx but I am unsure how to adapt it to my needs. can anyone help me?

    Sub PageCopy()   
        ' moves cursor to page 2   
        Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=2   
        ' selects content of page 2   
        Selection.Extend   
        Application.Browser.Next  
        ' copies selected page   
        Selection.Copy   
        ' creates a new document and saves it   
        Documents.Add DocumentType:=wdNewBlankDocument   
        Selection.PasteAndFormat (wdPasteDefault)   
        ActiveDocument.SaveAs FileName:="NewDoc.doc"  
        ActiveWindow.Close   
    End Sub  
    

    Thank you

    Steve

    • Moved by

      Friday, March 8, 2013 3:16 PM
      Move to more appropriate forum

Answers

  • I am fully aware of what’s in the link. I’m also fully aware that it overstates the case. In many situations, code like I posted is all that is required.  A slightly more sophisticated version follows:

    Sub ExtractPages()
    Application.ScreenUpdating = False
    Dim PgRngs As String, i As Long
    Dim RngHi As Range, RngLo As Range, Rng As Range
    Dim PgHi As Long, PgLo As Long
    PgRngs = «65-75,143-160,235-251,254-263»
    With ActiveDocument
      .SaveAs2 .Path & «/newdoc», .SaveFormat
      PgHi = .ComputeStatistics(wdStatisticPages) — 1
      Set RngHi = .Range.Characters.Last
      Set RngLo = .Range.Characters.Last
      For i = UBound(Split(PgRngs, «,»)) To 0 Step -1
        PgLo = Split(Split(PgRngs, «,»)(i), «-«)(1)
        If PgHi > PgLo Then
          Set RngHi = RngHi.GoTo(What:=wdGoToPage, Name:=PgHi + 1)
          Set RngHi = RngHi.GoTo(What:=wdGoToBookmark, Name:=»page»)
          Set RngLo = RngLo.GoTo(What:=wdGoToPage, Name:=PgLo + 1)
          Set RngLo = RngLo.GoTo(What:=wdGoToBookmark, Name:=»page»)
          Set Rng = .Range(RngLo.End, RngHi.End)
          With Rng
            If .Characters.First.Previous.Text = Chr(12) Then
              .Text = vbNullString
            Else
              .Text = Chr(12)
            End If
          End With
        End If
        PgHi = Split(Split(PgRngs, «,»)(i), «-«)(0) — 1
      Next
      Set RngHi = RngHi.GoTo(What:=wdGoToPage, Name:=PgHi + 1)
      Set RngHi = RngHi.GoTo(What:=wdGoToBookmark, Name:=»page»)
      Set Rng = .Range(0, RngHi.End)
      Rng.Text = vbNullString
      While .Characters.Last.Previous.Text Like «[» & vbCr & Chr(12) & «]»
        .Characters.Last.Previous.Text = vbNullString
      Wend
      .Save
    End With
    Application.ScreenUpdating = True
    End Sub

    The above code ensures there is a manual page break between any deleted pages that lacked either a manual page break or a Section break to separate them. It even splits tables that span the boundary pages.

     


    Cheers
    Paul Edstein
    [MS MVP — Word]

    • Edited by
      macropodMVP
      Sunday, March 10, 2013 12:12 AM
    • Marked as answer by
      Max Meng
      Wednesday, April 3, 2013 9:13 AM

Аннотация

Данная статья содержит Microsoft Visual Basic для приложений макроса (процедура Sub), который в цикле проходит через все листы активной книги. Этот макрос также отображается имя каждого листа.

Дополнительная информация

Корпорация Майкрософт предлагает примеры программного кода только для иллюстрации и без гарантии или подразумеваемых. Это включает, но не ограничиваясь, подразумеваемые гарантии товарной пригодности или пригодности для определенной цели. В данной статье предполагается, что вы знакомы с демонстрируемым языком программирования и средствами, которые используются для создания и отладки. Сотрудники службы поддержки Майкрософт могут объяснить возможности конкретной процедуры, но не выполнять модификации примеров для обеспечения дополнительных функциональных возможностей или создания процедур для определенных требований. Пример макроса, выполните следующие действия:

  1. Введите следующий код макроса в лист модуля.

          Sub WorksheetLoop()         Dim WS_Count As Integer         Dim I As Integer         ' Set WS_Count equal to the number of worksheets in the active         ' workbook.         WS_Count = ActiveWorkbook.Worksheets.Count         ' Begin the loop.         For I = 1 To WS_Count            ' Insert your code here.            ' The following line shows how to reference a sheet within            ' the loop by displaying the worksheet name in a dialog box.            MsgBox ActiveWorkbook.Worksheets(I).Name         Next I      End Sub

  2. Чтобы запустить макрос, поместите курсор в строку, которая считывает «Sub WorksheetLoop()» и нажмите клавишу F5.

Макрос будет цикла книги и отображает окно сообщения с именем другого листа при каждом выполнении цикла. Обратите внимание, что этот макрос будет отображать только имена листов; он будет отображаться имена других типов листов в книге. Можно также использовать цикл через все листы в книге с помощью цикла «For Each».

  1. Введите следующий код макроса в лист модуля.

          Sub WorksheetLoop2()         ' Declare Current as a worksheet object variable.         Dim Current As Worksheet         ' Loop through all of the worksheets in the active workbook.         For Each Current In Worksheets            ' Insert your code here.            ' This line displays the worksheet name in a message box.            MsgBox Current.Name         Next      End Sub

  2. Чтобы запустить макрос, поместите курсор в строку, которая считывает «Sub WorksheetLoop2()» и нажмите клавишу F5.

Этот макрос работает одинаково в макрос WorksheetLoop, за исключением того, что он использует другой тип цикла для обработки все листы активной книги.

Ссылки

Дополнительные сведения о получении справки по Visual Basic для приложений обратитесь к следующей статье Microsoft Knowledge Base:

163435 VBA: программные ресурсы для Visual Basic для приложений

226118 OFF2000: программные ресурсы для Visual Basic для приложений

Нужна дополнительная помощь?

Здравствуйте Коллеги!

Казанский! Спасибо что, отозвались.

Я, не согласен с использованием цикла

For Each, данный цикл не считает объекты, он просто перебирает указанные объекты. А нам необходимо от значений полученных страниц разделов производить -1, за исключением последнего раздела. Это насколько я, понимаю возможно только при использовании Count.

В общем у меня тоже пока не получается. Но пробую использовать

For To.
Ни как не соображу как вывести переменную s.
По чему то ActiveDocument.Sections(i).Range.ComputeStatistics (wdStatisticPages) преобразует в номера разделов а, не в количество страниц. ?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub страниц_в_разделе()
    Dim c As Byte, s As Byte
    c = ActiveDocument.Sections.Count
    s = ActiveDocument.Sections(c).Range.ComputeStatistics(wdStatisticPages)
    
    For i = 1 To c
        i = i
        ActiveDocument.Sections(i).Range.ComputeStatistics (wdStatisticPages) '- 1
            'a = ActiveDocument.Sections(1).Range.ComputeStatistics(wdStatisticPages) - 1
            'b = ActiveDocument.Sections(2).Range.ComputeStatistics(wdStatisticPages) - 1
            'c = ActiveDocument.Sections(3).Range.ComputeStatistics(wdStatisticPages) '- 1
        txt = txt & "в разделе " & i & " страниц " & s & vbNewLine
    Next i
    'c = ActiveDocument.Sections(3).Range.ComputeStatistics(wdStatisticPages) '- 1
    'MsgBox c
    MsgBox txt  'a & " " & b & " " & c & " " & d
End Sub

С уважением, Аватар-С!

Добавлено через 20 минут

Здравствуйте Коллеги!

О ! На половину заработало, врет естественно количество страниц в последнем разделе. Одну строку кода не понимаю (строка № 11). Теперь необходимо разобраться со строкой № 11 и последним разделом (он должен определяться без -1).
Думаю необходимо использовать Select Case.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub страниц_в_разделе()
    Dim c As Byte, s As Byte
    c = ActiveDocument.Sections.Count
    
    For i = 1 To c
        i = i
        s = ActiveDocument.Sections(i).Range.ComputeStatistics(wdStatisticPages) - 1
        s = s
        
        'эту строку доконца не помимаю
        ActiveDocument.Sections(i).Range.ComputeStatistics (wdStatisticPages) - 1
            'a = ActiveDocument.Sections(bCount).Range.ComputeStatistics(wdStatisticPages) - 1
            'b = ActiveDocument.Sections(bCount).Range.ComputeStatistics(wdStatisticPages) - 1
            'c = ActiveDocument.Sections(bCount).Range.ComputeStatistics(wdStatisticPages) - 1
            'd = ActiveDocument.Sections(bCount).Range.ComputeStatistics(wdStatisticPages) '- 1
        txt = txt & "в разделе " & i & " - " & s & " стр." & vbNewLine
    Next i
    'd = ActiveDocument.Sections(3).Range.ComputeStatistics(wdStatisticPages) '- 1
    'MsgBox d
    MsgBox txt  'a & " " & b & " " & c & " " & d
End Sub

С уважением, Аватар-С!

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


  • Вопрос задан

    более трёх лет назад

  • 338 просмотров



1

комментарий


Решения вопроса 1

datka

C stackoverflow

Selection.GoTo wdGoToPage, wdGoToAbsolute, 5 'your page number here


Комментировать

Пригласить эксперта


Похожие вопросы


  • Показать ещё
    Загружается…

14 апр. 2023, в 20:10

1500 руб./в час

14 апр. 2023, в 19:53

3500 руб./за проект

14 апр. 2023, в 19:53

10000 руб./за проект

Минуточку внимания

четверг, 4 октября 2018 г.

Макрос для перебора всех листов в книге

 Sub WorksheetLoop()
         Dim WS_Count As Integer
         Dim I As Integer
         WS_Count = ActiveWorkbook.Worksheets.Count
         For I = 1 To WS_Count
            MsgBox ActiveWorkbook.Worksheets(I).Name
         Next I
      End Sub
 
 
 
 
Sub WorksheetLoop2()
         Dim Current As Worksheet
         For Each Current In Worksheets
            MsgBox Current.Name
         Next
      End Sub 


Автор:

Владимир Усольцев




на

14:56






Ярлыки:
VBA

Комментариев нет:

Отправить комментарий

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

Выберите диапазон страниц, удерживая Shift в Word

Выберите диапазон страниц с помощью VBA

Выберите диапазон страниц с Kutools for Word


Выберите диапазон страниц, удерживая Shift в Word

Нажмите в начале страницы и удерживайте Shift, прокрутите до конца страницы и щелкните в конце содержимого этой страницы. Теперь страницы выбраны.


Выберите диапазон страниц с помощью VBA

1, нажмите Alt + F11 для открытия Microsoft Visual Basic для приложенийокно s;

2. Нажмите Модули от Вставить вкладку, скопируйте и вставьте следующий код VBA в Модули окно;

Код VBA: выберите диапазон страниц из документа Word:

Sub selectpages ()
Dim rgePages As Range
Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=2
Set rgePages = Selection.Range
Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=6
rgePages.End = Selection.Bookmarks("Page").Range.End
rgePages.Select
End Sub

3, нажмите F5 для запуска этого кода сразу выбираются страницы со страницы 2 по страницу 6.

Внимание: Здесь вы можете изменить Количество: = 2 и Количество: = 6 чтобы удовлетворить ваши потребности. В этом коде VBA мы выбираем диапазон страниц от страницы 2 до страницы 6.


Выберите диапазон страниц с Kutools for Word

Работы С Нами Kutools for WordАвтора Выбрать страницы Утилита, вы можете быстро выбрать любые диапазоны страниц в документе. Всего один щелчок мыши поможет вам завершить выбор страницы.

1. Нажмите Кутулс > Разделы > Выбрать страницы, см. снимок экрана:

2. Во всплывающем диалоговом окне вы можете указать диапазон страниц, введя число в поле под Выберите страницы в соответствии с разделом диапазона. Или вы можете выбрать определенные страницы по своему усмотрению в Выбрать страницы в соответствии с выбором список. Смотрите скриншот:

документ выберите конкретную страницу 2

3. Нажмите OK or Применить кнопку, чтобы выбрать желаемые страницы. 

Нажмите, чтобы скачать Kutools for Word и бесплатная пробная версия прямо сейчас!


Демонстрация: выбор диапазона страниц из документа Word


Относительные статьи:

  • Выбрать текущие страницы в Word
  • Выбрать определенные страницы в Word


Рекомендуемые инструменты для повышения производительности Word

выстрел kutools word kutools tab 1180x121

выстрел kutools word kutools plus tab 1180x120

Kutools For Word — Более 100 расширенных функций для Word, сэкономьте 50% времени

  • Сложные и повторяющиеся операции можно производить разово за секунды.
  • Вставляйте сразу несколько изображений из папок в документ Word.
  • Объединяйте и объединяйте несколько файлов Word из папок в одну в желаемом порядке.
  • Разделите текущий документ на отдельные документы в соответствии с заголовком, разрывом раздела или другими критериями.
  • Преобразование файлов между Doc и Docx, Docx и PDF, набор инструментов для общих преобразований и выбора и т. Д.

Комментарии (0)


Оценок пока нет. Оцените первым!

Понравилась статья? Поделить с друзьями:
  • Vba word перебор всех таблиц
  • Vba word отменить выделение
  • Vba word открыть папку
  • Vba word открытых документов
  • Vba word отключить сообщения