#vba #ms-word
#vba #ms-word
Вопрос:
С помощью InsertParagraphBefore
или InsertParagraphAfter
абзац может быть вставлен в документ Word в любой момент. Однако, если в документе есть таблицы, инструкция будет выполняться по-другому, если точка вставки находится перед или после таблицы, и снова по-другому, если она находится в конце документа. Я потратил долгий воскресный день на изучение этой темы и создал функцию, которая вставляет абзац там, где он ожидается. Я приглашаю предложения по его улучшению или, возможно, даже сделать его неактуальным, как я считаю, на самом деле, должно быть.
Ответ №1:
Function InsertBlankPara(Rng As Range, _
Optional ByVal Before As Boolean) As Range
' SSY 001 01 Nov 2020
' ======================================================
' Rng may be a single paragraph or part thereof
' or a table or part thereof
' Before Insert the paragraph before Rng if True
' [False by default, appending the paragraph]
' ======================================================
' Return value the inserted paragraph
' Return object Rng will expand the original Rng to include the
' entire table or paragraph it comprised originally
' plus the paragraph that was added
' ======================================================
Dim Pstart As Long
Dim Pend As Long
Dim IsTbl As Boolean
With Rng
IsTbl = .Information(wdWithInTable)
.Expand IIf(IsTbl, wdTable, wdParagraph)
Pstart = .Start
Pend = .End 1
.Collapse IIf(Before, wdCollapseStart, wdCollapseEnd)
If IsTbl Then .Move wdCharacter, IIf(Before, -1, _
IIf(.Document.Range.End <= Pend, 2, 0))
If IsTbl Or Before Then
.InsertParagraphBefore
Else
.Move wdCharacter, IIf(.Document.Range.End < Pend, 0, -1)
.InsertParagraphAfter
End If
Set Rng = .Document.Range(Pstart, Pend)
If Before Then
Pend = Pstart 1
Else
Pstart = Pend - 1
End If
Set InsertBlankPara = .Document.Range(Pstart, Pend)
End With
End Function