Прошу помощи в написании формулы. Не смог полностью решить задачу. Направьте меня если же есть решение. Найти на форуме не смог.
Задача: есть произвольный текст в ячейке А1. Например: "В лингвистике термин «текст» используется в широком значении, включая и образцы устной речи. Восприятие текста изучается в рамках лингвистики текста и психолингвистики. Так, например, И. Р. Гальперин определяет текст следующим образом: «это письменное сообщение, объективированное в виде письменного документа, состоящее из ряда высказываний, объединённых разными типами лексической, грамматической и логической связи, имеющее определённый моральный характер, прагматическую установку и соответственно литературно обработанное"
Необходимо разбить текст на строки, не более 69 символов в 1 строке, не разделяя слова (без переноса).
Печалька в том, что вы ограничили способ решения одной единственной формулой. Макросы и Power Query для вас по боку. А формулистам вполне возможно и не интересно. Для остальных участников он более чем живой - не стоит всё своим аршином мерять.
Function SplitByLen$(s$, n%, i%)
With CreateObject("vbscript.regexp")
.Pattern = "(?:\s*|^)(.{0," & n & "})(?=\s|$)"
.Global = True
If .test(s) Then
SplitByLen = .Execute(s)(i - 1).submatches(0)
End If
End With
End Function
также как и предыдущая массивная и одна для всех строк =TRIM(MID(TRIM($A$1)&" ";SUM(LEN(K$3:K3)+1);MAX(ROW(INDEX($A:$A;SUM(LEN(K$3:K3)+1)):INDEX($A:$A;SUM(LEN($K$3:K3)+1)+69))*(MID(TRIM($A$1)&" ";ROW(INDEX($A:$A;SUM(LEN($K$3:K3)+1)):INDEX($A:$A;SUM(LEN($K$3:K3)+1)+69));1)=" "))-SUM(LEN(K$3:K3)+1)))
Вариант функции на PQ. Была такая в моем конвертере таблиц в автокадовские спецификации по ГОСТ (кто знает тот поймет какой это трэш).
Алгоритм тупой так как надо разбивать не по числу символов, а по суммарным их весам (ввиду того что не для моноширинных шрифтов разные символы имеют разный размер). В связи с тем что уже давно не работаю с ACad, новая версия генератора спецификаций по ГОСТ осталась недопиленной.
Код
Text.CrLfSymbols = {" ",",",":",";","-","/","*","\","!","?","[","]","{","}","~","'","|"},
Text.SplitSmart =
(
InputText as nullable text, // Входной текст
SegmentMin as number, // Минимальное число символов, функция не разбивает строку до этого числа символов
SegmentMax as number // Максимальное число символов. Если функция не найдет символа для переноса от SegmentMin до SegMentMax, перенос будет произведен по SegmentMax.
) as list =>
let
Len = if InputText = null then 0 else Text.Length(InputText),
Out = if Len > SegmentMax then
let
Pos_A = Text.PositionOfAny(Text.Range(InputText, SegmentMin, SegmentMax - SegmentMin), Text.CrLfSymbols, Occurrence.Last),
Pos_B = if Pos_A < 0 then SegmentMax else SegmentMin + Pos_A + 1,
Txt_A = Text.Start(InputText, Pos_B),
Txt_B = Text.End(InputText, Len - Pos_B)
in List.Combine({{Txt_A}, @Text.SplitSmart(Txt_B, SegmentMin, SegmentMax)})
else
{InputText}
in Out,
И Еще вариант =MID(" "&TRIM($A$1);SUM(LEN($S$3:S3)+1)+1;LOOKUP(69;SMALL(IF(MID(" " & TRIM($A$1)&" ";ROW(INDEX(A:A;SUM(LEN($S$3:S3)+1)+1):$A$999);1)=" ";ROW(INDEX(A:A;SUM(LEN($S$3:S3)+1)+1):$A$999)-(SUM(LEN($S$3:S3)+1)));TRANSPOSE(ROW($A$1:$A$999)))-1))