1

Тема: Выделение всего содержимого страницы с указанным номером

Нужна помощь!
Необходимо выделить (а затем вырезать в буфер обмена, а лучше в какую-то переменную) содержимое страницы с указанным номером.
Я пока реализовал следующий механизм.
1) если страница в документе одна, то просто выделить от начала документа до конца документа
2) если страниц больше на одну, чем номер требуемой страницы, то переход к началу страницы, следующей за требуемой, вставка там какого-нибудь символа, например знака бесконечности, потом переход к началу требуемой страницы и расширение выделения до символа бесконечности.
3) вырезание в буфер выделенного
4) переход к месту вставки
5) вставка содержимого буфера
6) очистка буфера
7) удаление знака бесконечности

Все вроде работает, но если на требуемой странице находится разрыв страницы или раздела (со следующей страницы), то он тоже копируется в буфер.

можно ли те же самые действия провести без использования Selection, или хотя бы - как провести проверку выделенной страницы, и если там есть разрыв страницы или раздела, убрать его из выделения (как я понимаю, разрыв в любом случае будет последним элементом выделения)?

2

Re: Выделение всего содержимого страницы с указанным номером

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

Sub SelectPage()
  Dim PageNum As Long
  PageNum = InputBox("Введите номер страницы")
  With Selection
    'Переход к указанной таблице
    .GoTo wdGoToPage, wdGoToAbsolute, PageNum
    'Выбор страницы, на которой выделение
    .Bookmarks("\page").Select
    'Сжимаем выделение, если последний _
    или предпоследний символ это разрыв
    If Asc(.Characters.Last) = 12 Then
      .MoveLeft wdCharacter, 1, wdExtend
    End If
    If Asc(.Characters.Last.Previous.Text) = 12 Then
      .MoveLeft wdCharacter, 2, wdExtend
    End If
    '####################################
    'Берём выделение в закладку
    .Bookmarks.Add "TempBm", .Range
    'Переход в конец документа
    .EndKey wdStory
    'Добавляем поле, ссылающееся на эту закладку
    With .Fields.Add(.Range, wdFieldRef, "TempBm", False)
      .Update 'Обновляем
      .Unlink 'Разрываем связь поля
    End With
    ActiveDocument.Bookmarks("TempBm").Delete 'Удаляем закладку
  End With
End Sub
Лучше день потерять — потом за пять минут долететь!

3

Re: Выделение всего содержимого страницы с указанным номером

Именно то, что нужно!!! Ни в жизни бы сам не догадался бы, пока не начал плотно изучать закладки, что можно нужную страницу можно выделить именно вот так:

.Bookmarks("\page").Select

Спасибо огромное! Осталось только адаптировать код под задачу, все необходимое для этого в приведенном вами примере есть! Так как мне необходимо перемещаться содержимое как миним трех страниц, то сделаю эту процедуру с праметрами - номер страницы, содержимое которой нужно "вырезать", и номер страницы, в начало которой нужно вставить "вырезанное"...
Протестировал.. Выделенный фрагмент не удаляется со своего места, а создается его клон. А нужно, чтобы удалялось sad Использую первую часть, а дальше с буфером обмена. Благо процедуры его очистки уже готовы:)

Отредактировано andrkar (28.04.2010 19:32:47)

4

Re: Выделение всего содержимого страницы с указанным номером

andrkar пишет:

Выделенный фрагмент не удаляется со своего места, а создается его клон

Изменить нужно всего лишь одну строчку:

ActiveDocument.Bookmarks("TempBm").Range.Delete
Лучше день потерять — потом за пять минут долететь!

5

Re: Выделение всего содержимого страницы с указанным номером

Вот так реализовал для своих целей:

Sub SelectAndCutPage(PageForCut, PageForPaste As Long)
  'Выделение и вырезание содержимого необходимой страницы и вставка его на указанную
  'идея viter.alex
  With Selection
    'Переход к указанной странице
    .GoTo wdGoToPage, wdGoToAbsolute, PageForCut
    'Выбор страницы, на которой выделение
    .Bookmarks("\page").Select
    'Сжимаем выделение, если последний _
    или предпоследний символ это разрыв
    If Asc(.Characters.Last) = 12 Then
        .MoveLeft wdCharacter, 1, wdExtend
    End If
    If Asc(.Characters.Last.Previous.Text) = 12 Then
        .MoveLeft wdCharacter, 2, wdExtend
    End If
    .Cut
    .MoveRight wdCharacter, 1, wdExtend
        If Asc(.Characters.Last) = 12 Then
            .Delete unit:=wdCharacter, Count:=1
        End If
    .GoTo wdGoToPage, wdGoToAbsolute, PageForPaste
    End With
End Sub

После применения данной процедуры и отладки удалил строк 50 лишнего кода! Еще раз спасибо. Можно тему считать закрытой

6

Re: Выделение всего содержимого страницы с указанным номером

А ты уверен, что после вырезания, да ещё и удаления разрыва, номера страниц не сместятся?

Лучше день потерять — потом за пять минут долететь!

7

Re: Выделение всего содержимого страницы с указанным номером

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