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

Function Move_SubString(Ячейка As String, Номер_подстроки As Long, Новое_место As Long, Optional Разделитель As String = " ")
'Ячейка - текст или ссылка на ячейку с текстом
'Номер_подстроки - это номер слова в строке, которое перемещаем.
'Новое_место - куда в строке перемещаем.
'Разделитель - необязательный аргумент. По умолчанию - пробел.
    Dim sStr, li As Long, lcnt As Long
    Dim sNewWord As String, sTmpStr As String
    sStr = Split(Application.Trim(Ячейка), Разделитель)
    If Номер_подстроки >= UBound(sStr) + 1 Then Номер_подстроки = UBound(sStr) + 1
    For li = LBound(sStr) To UBound(sStr)
        If li = Номер_подстроки - 1 Then sTmpStr = sStr(li): sStr(li) = ""
    Next li
 
 
    For li = LBound(sStr) To UBound(sStr)
        If sStr(li) <> "" Then
            lcnt = lcnt + 1
            If lcnt = Новое_место Then
                sNewWord = sNewWord & Разделитель & sTmpStr & Разделитель & sStr(li)
            Else
                sNewWord = sNewWord & Разделитель & sStr(li)
            End If
        End If
    Next li
    If Новое_место >= UBound(sStr) + 1 Then sNewWord = sNewWord & Разделитель & sTmpStr
    Move_SubString = Application.Trim(sNewWord)
End Function

Чтобы правильно использовать приведенный код, необходимо сначала ознакомиться со статьей Что такое функция пользователя(UDF)?. Вкратце: скопировать текст кода выше, перейти в редактор VBA(Alt+F11) -создать стандартный модуль(Insert -Module) и в него вставить скопированный текст. После чего функцию можно будет вызвать из Диспетчера функций(Ctrl+F3), отыскав её в категории Определенные пользователем (User Defined Functions).
Синтаксис:
=Move_SubString(A2;2;5)

Ячейка(A2) - текст или ссылка на ячейку с текстом, в котором необходимо переместить слово.

Номер_подстроки(2) - это номер слова в строке, которое перемещаем. Если для Номер_подстроки указать число заведомо большее, чем кол-во слов в строке(скажем 1000), то будет перемещено последнее слово на позицию, указанную аргументом Новое_место.

Новое_место(5) - номер позиции слова в строке, куда перемещаем.

Разделитель - необязательный аргумент. По умолчанию - пробел. Этим символом будет разделено перемещаемое слово.

С помощью функции можно либо переместить слово с одной позиции в предложении на другую или поменять слова в предложении местами. В файле-примере вы найдете примеры применения обоих вариантов.

Скачать пример

  Tips_Macro_MoveSubstring.xls (52,0 КиБ, 3 417 скачиваний)

Также см.:
Работа с текстом
Как перевернуть слово?
Как перевернуть адрес

4 комментария

  1. Все замечательно, но пример, который гараздо более встречающийся:
    Товар 1
    Новый товар 2
    Самый новый товар 3
    Старый товар из прошлой партии 4

    Как цифры поставить на первое место в вашей схеме?

  2. Для Вашего случая достаточно в начало кода после строки sStr = Split(Ячейка, Разделитель) добавить:

    If Номер_подстроки >= UBound(sStr) + 1 Then Номер_подстроки = UBound(sStr) + 1

    теперь если для Номер_подстроки указать число заведомо большее, чем кол-во слов в строке(скажем 100), то будет перемещено последнее слово на указанную позицию. В Вашем случае необходимо указать Новое_место - 1.
    Так же обновил файл и код в статье.

    P.S. Игорь, за все время что я программирую, почти каждый считает, что его проблема самая часто встречающаяся :-) Поэтому я бы на Вашем месте не говорил за всех, а только за себя. Т.е. это необходимость, наиболее часто встречающаяся у Вас, а не вообще.

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.