Страницы: 1
RSS
Разделение длинного текста на несколько коротких частей, Как автоматически разделить текст с учетом количества символов в результирующих ячейках
 
Вопрос конечно не новый. Однако красивого решения так и не смог найти.
При заполнении анкет на сайтах часто возникает необходимость вбить длинный текст в несколько полей.
То есть имеется определенная ячейка с текстовой строкой (в данном случае адрес отеля) с количеством символов от 10 до 105.
Нужно разбить этот текст на три части длиною не более 35 символов и вставить в 3 ячейки.
Слова конечно же отделены пробелом и их нельзя дробить.
Например исходная строка: VAMANA TRAVELS INDIA PVT LTD FF10, ANSAL FORTUNE ARCADE, SECTOR 18, NOIDA 201301
А необходимо получить:
VAMANA TRAVELS INDIA PVT LTD FF10,
ANSAL FORTUNE ARCADE, SECTOR 18,
NOIDA 201301

Задача казалось бы простая, но на практике так и не смог получить эффективное решение несколькими формулами.
Приходится проводить множество операций. Сначала разбивать текст на слова.
Потом вычислять их длину. Потом "склеивать" их по признаку чтобы в строке было не более 35 символов.
Может есть какое то простое решение...
Заранее спасибо!
Изменено: Vrajadas - 08.10.2015 09:25:25
 
На форуме много тем разделения на строки по 33 символа, поищите. Правда решения там все больше макросами
Согласие есть продукт при полном непротивлении сторон
 
а если разбить формулой?... но и на макрос в принципе тоже согласен :)
Изменено: Vrajadas - 08.10.2015 09:31:55
 
Решение на одной из веток форума, подкорректировал. Для первой результирующей ячейки:
=ПСТР(N6;1;ПРОСМОТР(2;1/(ПСТР((N6)&" ";СТРОКА($1:$36);1)=" ");СТРОКА($1:$36)))
Но все равно вопросы остались.
Думаю, что в этой формуле есть лишние функции
Не понимаю что делает функция СТРОКА($1:$36);1)=" "
и как затем получить строчку номер 2 и 3?

Спасибо Sanja за правильное направление поиска
Изменено: Vrajadas - 08.10.2015 10:08:27
 
Вариант с доп столбцом.
35 можно параметром вывести.
Интервал поиска пробелов тоже.
Будет универсальная и настраиваемая  
Изменено: Grr - 08.10.2015 10:07:57
 
Огромное спасибо! А в чем назначение функции подставить()?
Удаление пробела в начале строки? Можно же наверное объединить в одну формулу
Изменено: Vrajadas - 08.10.2015 10:14:07
 
Vrajadas,Обратите внимание что пробел ищется в интервале 30-36. Если последнее слово будет длиннее, то будут проблемы, наверно. Не тестировал.

UPD Да, проблемы будут. Подумаю сейчас как обойти.
Изменено: Grr - 08.10.2015 10:14:18
 
.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
... пробел действительно может быть в любом диапазоне - это точно подмечено формула даст ошибочку
 
Спасибо за ответ!
Цитата
JayBhagavan написал:
Прикрепленные файлы
_разбивка_фразы_пословная.xlsx (9.51 КБ)
Хотелось бы получить совместимость формул со всеми версиями Excel
Данное действие _xlfn.AGGREGATE думаю не может быть выполнено
 
Vrajadas, не хотелось городить монстра из формулы, но пришлось. Во вложении версия с двумя порогами поиска пробела. Не нашел в первом куске, ищет во втором отрезке. Получилось масштабируемо. Попробовал протянуть монстра от JayBhagavan вроде как слетает алгоритм (могу ошибаться)
 
к сожалению в версии 2003 не работает
Думаю проблема здесь _xlfn.IFERROR
Изменено: Vrajadas - 08.10.2015 10:50:55
 
Да, он не знает "ЕСЛИОШИБКА". Если мне память не изменяет тогда была функция "ЕОШ"
 
Проверил сейчас.
К сожалению замена на ЕОШ и тп не сработала
Но все равно О-огромное спасибо за помощь!
Пытаюсь сделать:
=ЕСЛИ(ДЛСТР(B5)<$B$1;B5;ПСТР(B5;1;$B$1-$C$1+НАЙТИ(" ";ПСТР(B5;$B$1-$C$1+1;$C$1))));ЕСЛИ(ДЛСТР(B5)<$B$1;B5;ПСТР(B5;1;$B$1-$D$1+НАЙТИ(" ";ПСТР(B5;$B$1-$D$1+1;$D$1))))
но выдает #знач!
Изменено: Vrajadas - 08.10.2015 11:00:46
 
Вариант для 2003.
Изменено: JayBhagavan - 08.10.2015 16:31:06

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Вариант, с ЕОШ. Можно тестировать. Но играться с параметрами все же придется.  
Изменено: Grr - 08.10.2015 11:08:15
 
В принципе все теперь понятно. Все работает если убрать проверку ошибки
Пытаюсь переделать Ваши решения под старый Excel
Отпишусь если получится...
Всем спасибо!
Изменено: Vrajadas - 08.10.2015 11:15:52
 
Если ваши длинные тексты в столбце А, то макрос разделит этот текст по столбцам правее (естественно ячейки должны быть очищены)
Для Excel 2003 подходит, удачи!
Код
Sub Razdelenie()
Dim i As Long
Dim j As Integer
Dim n As Integer
Dim iLen As Integer
Dim iLastRow As Long
Dim r As Object
Dim submatches As Object
  Set r = CreateObject("vbscript.regexp")
     r.Global = True                 'проверять по всему тексту
     r.MultiLine = True              'многострочный объект
     r.Pattern = "\b\w+?\b,?"        'шаблон, маска
    iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
  For i = 1 To iLastRow
    Set submatches = r.Execute(Cells(i, 1))
    n = 2
    iLen = 0
    For j = 0 To submatches.Count - 2
      If iLen + submatches(j + 1).Length < 35 * (n - 1) Then
        Cells(i, n) = Cells(i, n) + submatches(j) + " "
        iLen = iLen + submatches(j).Length + 1
      Else
        n = n + 1
        j = j - 1
      End If
    Next
       Cells(i, n) = Cells(i, n) + submatches(j)
  Next
End Sub
 
Исправил ошибку в логике, файл перезалил.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Читают тему
Наверх