Страницы: 1
RSS
Сцепить строки с перестановкой слов в одной ячейке с переносом строки, Сцепить строки из одной ячейки с переносом строки и перестановкой строк
 
Здравствуйте, есть заполненная одна ячейка, с двумя переносами строки, итак
Пример:

Шевченко Максим Леонардович
123456 СК обл., г. Ставрополь, село Приморское, хутор. Волянский,,,,,
ул. Малиновая, д.81 кв.21, проезд 4, стр. 7, квартал 554, корпус 11, а/я 78

получиться должно так в другой ячейке
Шевченко Максим Леонардович
ул. Малиновая, д.81 кв.21, проезд 4, стр. 7, квартал 554, корпус 11, а/я 78
хутор.Волянский, село Приморское, г.Ставрополь, СК обл.

Нужно  с помощью функции UDF
соединить по такому порядку 1 строка + 3 строка (конец) + 3 строка (середина) убрать оттуда любой индекс из 6 цифр
ПРИМЕР прилагается
в ячейке будет всегда 3 строки
строку до первого переноса строки копируем как есть
строку в конце копируем как есть, только переставим выше
вторую строку переставим в конец, т. е. ставим в самый низ, оттуда убираем индекс, лишние запятые и хвосты в конце предложения, меняем текст под наш результат, то есть все до запятых, пишем предложение с конца (разделителем будет считаться запятая, только здесь точки с пробелами меняем на точки без пробелов "". "" на "".""
Изменено: Goldenito - 10.03.2018 20:16:45
 
Так UDF или стандартными формулами?
 
Dima S, UDF будет лучше, стандартными получается космический по размеру текст
 
Что то я тоже не понял. В Вашем примере задача-же решена? И именно UDF. В чём подвох?
Согласие есть продукт при полном непротивлении сторон
 
Sanja, можно сказать что так, а как сделать одной функцией
у меня вышло это только 3-мя функциями и плюс потребовалась сцепка, что усложняет задачу
Сцепка из трех
SUBSTRING(D4;СИМВОЛ(10);1)
SUBSTRING(D4;СИМВОЛ(10);3)
ExampleTextReverse(Strokanumeric(SUBSTRING(D4;СИМВОЛ(10);2)))
Изменено: Goldenito - 10.03.2018 20:36:08
 
Как вариант (для данного примера). Две функции. Можно код Private Function iReverse вставить в код основной. Можно было бы, в принципе, и Ваши вложить друг в друга.
Код
Function Goldenito(iStr$, Optional iDlm = vbLf)
    aStr = Split(iStr, iDlm)
    Goldenito = aStr(0) & iDlm & aStr(2) & iDlm & iReverse(Replace(Mid(aStr(1), 7), ". ", "."))
End Function

Private Function iReverse(iStr, Optional iDlm$ = ",")
    arrStr = Split(iStr, iDlm)
    For i = UBound(arrStr) To 0 Step -1
        If arrStr(i) <> Empty Then
            iReverse = IIf(iReverse <> Empty, iReverse & iDlm & arrStr(i), arrStr(i))
        End If
    Next
End Function
Изменено: Sanja - 10.03.2018 21:15:57
Согласие есть продукт при полном непротивлении сторон
 
Sanja, почти супер, одна небольшая проблема с последней строкой, если индекс не прописан, то некорректно режет и в начале пробел
здесь добавил замена строк с реверсом точки ". " на "."
Код
Private Function iReverse(iStr, Optional iDlm$ = ",")
    arrStr = Split(iStr, iDlm)
    For i = UBound(arrStr) To 0 Step -1
        If arrStr(i) <> Empty Then
            iReverse = IIf(iReverse <> Empty, iReverse & iDlm & arrStr(i), arrStr(i))
        End If
    Next
iReverse = Replace(iReverse, ". ", ".")
End Function

пример
Шевченко Максим Леонардович
СК обл., г. Ставрополь, село Приморское, хутор. Волянский,,,,,
ул. Малиновая, д.81 кв.21, проезд 4, стр. 7, квартал 554, корпус 11, а/я 78
в результате
Шевченко Максим Леонардович
ул. Малиновая, д.81 кв.21, проезд 4, стр. 7, квартал 554, корпус 11, а/я 78
хутор.Волянский, село Приморское, г.Ставрополь,.
пробел спереди и конец режет не цифры, а обычный текст ( хутор.Волянский, село Приморское, г.Ставрополь,.)
Изменено: Goldenito - 10.03.2018 21:31:35
 
Замену точек сразу поправил, а вот про то, что
Цитата
Goldenito написал: если индекс не прописан
впервые слышу и предполагаю, что таких 'если' будет еще немало. Поэтому и написал
Цитата
Sanja написал: для данного примера
Тогда Вам нужен
Анализ текста регулярными выражениями (RegExp) в Excel
Хотя можете и свою функцию Strokanumeric туда приспособить
Согласие есть продукт при полном непротивлении сторон
 
Sanja,
вот такое получилось
iReverse = Replace(iReverse, ",,,", ",")
iReverse = Replace(iReverse, ",,", ",")
как бороться с такими запятыми одной строкой
Код
Function Goldenito(iStr$, Optional iDlm = vbLf)
    aStr = Split(iStr, iDlm)
    Goldenito = aStr(0) & iDlm & aStr(2) & iDlm & iReverse(Strokanumeric(Replace(Mid(aStr(1), 1), ". ", ".")))
End Function

Private Function iReverse(iStr, Optional iDlm$ = ", ")
    arrStr = Split(iStr, iDlm)
    For i = UBound(arrStr) To 0 Step -1
        If arrStr(i) <> Empty Then
            iReverse = IIf(iReverse <> Empty, iReverse & iDlm & arrStr(i), arrStr(i))
        End If
    Next
iReverse = Replace(iReverse, ",,,", ",")
iReverse = Replace(iReverse, ",,", ",")
End Function

Function Strokanumeric(txt As String) As String
' убирает в начале цифры
Dim i&
For i = 1 To Len(txt)
If InStr(" 0123456789.,", Mid(txt, i, 1)) = 0 Then Exit For
Next i
Strokanumeric = Mid(txt, i, Len(txt) - i + 1)
End Function
Изменено: Goldenito - 10.03.2018 22:11:45
Страницы: 1
Наверх