Как программно переместить текстовые поля в текстовом документе на другую страницу - PullRequest
1 голос
/ 20 сентября 2019

Следующий код VBA выбирает текстовые поля в текстовом документе, которые содержат определенный текст.Как я могу программно переместить каждое текстовое поле на другую страницу (скажем, на первую страницу), сохранив его положение относительно страницы.Исходные текстовые поля расположены абсолютно на той странице, на которой они находятся.

Sub searchTexboxes()
'
' searchTexboxes Macro
'
'

Dim shp As Shape
Dim sTemp As String
Dim nrTextboxes As Integer

nrTextboxes = 0
For Each shp In ActiveDocument.Shapes
    If shp.Type = msoTextBox Then
        shp.Select
        Selection.ShapeRange.TextFrame.TextRange.Select
        sTemp = Selection.Text
        sTemp = Left(sTemp, 1)
        If sTemp = "." Then
            nrTextboxes = nrTextboxes + 1
        End If
    End If
Next
MsgBox ("Found " & nrTextboxes & " textboxes.")

End Sub

1 Ответ

2 голосов
/ 20 сентября 2019

Следующий код работает для меня.

Единственный способ сделать это (кроме воссоздания текстового поля с нуля), это скопировать / вставить.Это будет охватывать все форматирование.

Ключевые аспекты этого подхода:

Установка целевой страницы : Word не имеет объектов "page" из-за егодинамическое поведение макета.Selection.GoTo - самый простой способ получить страницу.Поскольку текстовые поля отформатированы относительно страницы, не имеет значения, где на странице прикреплен якорь.(Если не будет много последующего редактирования, которое могло бы перенести диапазон привязки на другую страницу.) Таким образом, этот код назначает диапазон первого абзаца в качестве привязки.

Идентификация текстового поля (es) для копирования : не нужно выделять текстовое поле для работы с его содержимым.Текст можно прочитать с TextFrame.TextRange.Text.

Цикл с несколькими текстовыми полями : Как только текстовое поле будет создано (вставлено) в целевой диапазон, Word скажет: «Ага! Есть еще одно текстовое поле!»и постараюсь зациклить это тоже, что не то, что нужно.Таким образом, код в вопросе был изменен, чтобы добавить текстовые поля, которые должны быть скопированы в массив (shps()).Как только все текстовые поля, которые нужно скопировать, были идентифицированы, код затем зацикливает этот массив, копирует каждое текстовое поле и вставляет его в целевой диапазон.

Sub searchTexboxes()
    Dim shp As Shape
    Dim shps() As Shape
    Dim sTemp As String
    Dim nrTextboxes As Integer
    Dim target As Word.Range
    Dim targetPage As Long, i As Long

    nrTextboxes = 0
    targetPage = 1
    Selection.GoTo What:=Word.wdGoToPage, Which:=targetPage
    Set target = Selection.Paragraphs(1).Range

    For Each shp In ActiveDocument.Shapes
        If shp.Type = msoTextBox Then
            sTemp = shp.TextFrame.TextRange.Text
            sTemp = Left(sTemp, 1)
            If sTemp = "." Then
                nrTextboxes = nrTextboxes + 1
                ReDim Preserve shps(nrTextboxes - 1)
                Set shps(nrTextboxes - 1) = shp
            End If
        End If
    Next
    For i = LBound(shps) To UBound(shps)
                shps(i).Select
                Selection.Copy
                target.Paste
    Next
    MsgBox ("Found " & nrTextboxes & " textboxes.")

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...