Следующий код работает для меня.
Единственный способ сделать это (кроме воссоздания текстового поля с нуля), это скопировать / вставить.Это будет охватывать все форматирование.
Ключевые аспекты этого подхода:
Установка целевой страницы : 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