Excel VBA в Word: Как записать номер страницы в текстовый кадр? - PullRequest
0 голосов
/ 14 мая 2018

Я пишу макрос VBA для Excel, который копирует текст в файл Word для Windows и добавляет к нему форматирование позже.

В нем используется шаблон .dotx, содержащий логотип.В левом нижнем углу текстовое поле с серийным номером.Текст серийного номера написан вертикально (снизу вверх).

Используя метод проб и ошибок, мне удалось записать один серийный номер в текстовое поле, используя:

serialnumber = "abc1x"
wdoc.Sections(1).Headers(wdHeaderFooterEvenPages).Shapes(2).TextFrame.TextRange.text 
= serialnumber

ТакЯ нашел правильный объект для записи.Теперь я получаю один и тот же серийный номер на каждой странице.

Моя цель - получить увеличивающийся серийный номер на страницах: серийный номер имеет форму:

  • На странице 1: abc1x
  • на странице 2: abc2x
  • на странице 3: abc3x
  • ...
  • на странице 10: abc10x

Это номер страницы, окруженный 2 строками.

В другом проекте я сделал нечто подобное.Я написал «Страница 1 из 10» и т. Д. С помощью следующего сценария:

    Dim uRange As Object
    Dim uneven As Object

    Set uneven = wdoc.Sections(1).Footers(wdHeaderFooterPrimary)
    Set uRange = wdoc.Sections(1).Footers(wdHeaderFooterPrimary).Range
    uRange.Delete

    uneven.Range.InsertAfter "Page "
    uRange.SetRange Start:=uneven.Range.End + 1, End:=uneven.Range.End + 1
    wdoc.Sections(1).Footers(wdHeaderFooterPrimary).Range.Fields.Add 
Range:=uRange, Type:=wdFieldEmpty, text:= _
    "PAGE  \* Arabic ", PreserveFormatting:=True

    uRange.SetRange Start:=uneven.Range.End + 1, End:=uneven.Range.End + 1
    uneven.Range.InsertAfter " of "
    uRange.SetRange Start:=uneven.Range.End + 1, End:=uneven.Range.End + 1

    wdoc.Sections(1).Footers(wdHeaderFooterPrimary).Range.Fields.Add 
Range:=uRange, Type:=wdFieldEmpty, text:= _
     "NUMPAGES  \* Arabic ", PreserveFormatting:=True

Как вставить текст вокруг поля страницы в TextBox?

(Примечание: что такоеразница между объектом range и rangetext?)

Замечания: мне придется применять решение к четным и неровным страницам отдельно.Это не представляет проблемы.Чтобы усложнить ситуацию: я обязан сохранить текстовое поле, потому что оно принадлежит специалистам по фирменному стилю.

1 Ответ

0 голосов
/ 14 мая 2018

Есть несколько способов сделать это. Все они включают «свертывание» цели Range перед вставкой следующей вещи (код текста или поля).

Некоторое время назад я написал набор обобщенных функций, чтобы можно было удобно вставлять любую комбинацию кодов текста и полей без необходимости «подправлять» каждую комбинацию.

Сначала определите объект Range. Если вы хотите сохранить какой-либо контент, сверните его. Процедуры InsertNewText и InsertNewField берут цель Range и текст для вставки, соответственно код поля для вставляемого поля. Свертывание Range выполняется в этих процедурах и передается обратно в вызывающую процедуру для следующего шага.

Sub InsertTextAndFields()
    Dim rngContent As Word.Range

    Set rngContent = wdoc.Sections(1).Headers( _
        wdHeaderFooterEvenPages).Shapes(2).TextFrame.TextRange
    rngContent.Collapse wdCollapseEnd

    Set rngContent = InsertNewText(rngContent, "abc")
    Set rngContent = InsertAField(rngContent, "Page")
    Set rngContent = InsertNewText(rngContent, "x")

End Sub

Function InsertNewText(rng As word.Range, newText As String) As word.Range
    rng.Text = newText
    rng.Collapse wdCollapseEnd
    Set InsertNewText = rng
End Function

Function InsertAField(rng As word.Range, _
                      fieldText As String) As word.Range

    Dim fld As word.Field
    Dim rngField As word.Range

    Set fld = rng.Document.Fields.Add(Range:=rng, _
              Text:=fieldText, PreserveFormatting:=False)

    Set rngField = fld.result
    rngField.Collapse wdCollapseEnd
    rngField.MoveStart wdCharacter, 1
    Set InsertAField = rngField
End Function
...