Если возможно: Как написать макрос Word, который поменяет местами содержимое двух текстовых полей на активной странице? - PullRequest
0 голосов
/ 17 января 2020

У меня есть документ Word, который создает индексные карточки для книг по сериям. На каждой странице информация об одной книге. Иногда два поля необходимо поменять местами для определенного элемента c. Так что для моего коллеги это сэкономило бы много работы, если бы это было возможно одним щелчком мыши. У меня есть опыт программирования, но не так много Office и нет VBA. Можно ли сделать что-то вроде ниже? :

Pseudo code:
dim temp as string
dim temp2 as string
select first textbox on active page
temp = select.Text
select second textbox on active page
temp2 = select.Text
select.Text = temp
select first textbox on active page
select.Text = temp2

Любые идеи о том, какие функции нужно искать, приветствуются. Особенно, если можно выбрать первое и второе текстовые поля одной (активной) страницы.

1 Ответ

0 голосов
/ 17 января 2020

Вероятно, есть лучший способ сделать это, но текстовые поля в слове я нахожу настоящей болью.

Здесь мы устанавливаем названия коробок, как вы определяете порядок, в котором я не уверен, может быть проверка с использованием заголовков или точка привязки. Свойство ID не является индексом, поэтому мы не можем его использовать.

Sub Rename()
    Dim textbox As Object
    Dim iter As Long
    iter = 1
    For Each textbox In ActiveDocument.Shapes 'I'm not sure how to set names manually
        textbox.Name = "TextBox " & iter
        iter = iter + 1
    Next
End Sub

При условии, что у вас есть поля, названные в порядке их появления:

Sub TextSwap()
    Dim targetbox As Long
    Dim val1 As String
    Dim val2 As String

    targetbox = InputBox("Enter an Integer relating to the position of the textbox")

    val1 = ActiveDocument.Shapes("TextBox " & targetbox).TextFrame.TextRange.Text
    val2 = ActiveDocument.Shapes("TextBox " & (targetbox + 1)).TextFrame.TextRange.Text

    ActiveDocument.Shapes("TextBox " & targetbox).TextFrame.TextRange.Text = val2
    ActiveDocument.Shapes("TextBox " & (targetbox + 1)).TextFrame.TextRange.Text = val1
End Sub

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

...