Нужно чтобы текст обрезался по словам с знаком препинания до обрезаемого слова и после, обязательное условие: при обрезании текста должно учитываться только количество букв (т. е. количество знаков препинания не должно учитываться во всей строке)
ПРИМЕР: Исходник 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 1111111111, 90 ОШИБКА! Проблема 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 69 ОК Нужный результат 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111 79 ОК ОБРЕЗАНО: (, 1111111111,) Подсчет количества символов произведен без учета запятых, а обрезка происходи с учетом запятых, а нужно без учета запятых
Приветствую ребят, запарился с проблемой, не могу сформировать формулу, мож кто поможет Есть формула:
Нужно чтобы текст обрезался по словам с знаком препинания до обрезаемого слова и после, обязательное условие: при обрезании текста должно учитываться только количество букв (т. е. количество знаков препинания не должно учитываться во всей строке)
ПРИМЕР: Исходник 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 1111111111, 90 ОШИБКА! Проблема 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 69 ОК Нужный результат 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111, 111111111 79 ОК ОБРЕЗАНО: (, 1111111111,) Подсчет количества символов произведен без учета запятых, а обрезка происходи с учетом запятых, а нужно без учета запятыхmult
Не то получается, по сути удалилась только последняя запятая, это легко можно сделать в моей формуле, а кроме всего, после каждого слова появилась запятая, где ее не было )
Мне требуется, чтобы обрезание происходило исходя из количества символов (букв или цифр), но при этом, в предложении есть знаки препинания, которые не должны учитываться при расчете символов при обрезании по словам Кроме этого, нужно, чтобы обрезаемое слово (-ва), обрезалось с запятой до слова и после его, т.е. в конце предложения не висела запятая
ОБРЕЗАНО: , 1111111111, в примере указал, что должно быть обрезано от исходника
Алгоритм должен понимать, что 1111111111, тут не 11 символов, а 10, без учета запятой
Не то получается, по сути удалилась только последняя запятая, это легко можно сделать в моей формуле, а кроме всего, после каждого слова появилась запятая, где ее не было )
Мне требуется, чтобы обрезание происходило исходя из количества символов (букв или цифр), но при этом, в предложении есть знаки препинания, которые не должны учитываться при расчете символов при обрезании по словам Кроме этого, нужно, чтобы обрезаемое слово (-ва), обрезалось с запятой до слова и после его, т.е. в конце предложения не висела запятая
ОБРЕЗАНО: , 1111111111, в примере указал, что должно быть обрезано от исходника
Алгоритм должен понимать, что 1111111111, тут не 11 символов, а 10, без учета запятойmult
Сообщение отредактировал mult - Воскресенье, 10.01.2021, 17:52
Приведу еще пример 111111111,,,,,_222222222,,,,,,,,_3333333333, (_ - это я отметил пробел) Алгоритм должен посчитать выделенное красным, пробелы учитываются как символ Обрезка должна произойти до 19 символов 111111111_222222222 Итог должен быть 111111111,,,,,_222222222 - т.е. знаки препинания в алгоритме не учитываются
Приведу еще пример 111111111,,,,,_222222222,,,,,,,,_3333333333, (_ - это я отметил пробел) Алгоритм должен посчитать выделенное красным, пробелы учитываются как символ Обрезка должна произойти до 19 символов 111111111_222222222 Итог должен быть 111111111,,,,,_222222222 - т.е. знаки препинания в алгоритме не учитываютсяmult
Похоже, что пользовательская функция (UDF) здесь лучший выход, без лишней головной боли: [vba]
Код
Function NOPREPINAKI(str, maxLen) Dim ar, i, sm, smp, smz, smzp, result ar = Split(str, " ") For i = LBound(ar) To UBound(ar) sm = sm + Len(Replace(Replace(Replace(Replace(Replace(Replace(ar(i), _ ":", ""), ";", ""), ",", ""), ".", ""), "!", ""), "?", "")) _ + IIf(i > LBound(ar), 1, 0) smz = smz + Len(ar(i)) + IIf(i > LBound(ar), 1, 0) If sm > maxLen Then Exit For smp = sm: smzp = smz Next i result = StrReverse(Left(str, smzp)) For i = 1 To Len(result) If InStr(":;,.!?", Mid(result, i, 1)) = 0 Then result = StrReverse(Mid(result, i)) Exit For End If Next i NOPREPINAKI = result End Function
[/vba]
Похоже, что пользовательская функция (UDF) здесь лучший выход, без лишней головной боли: [vba]
Код
Function NOPREPINAKI(str, maxLen) Dim ar, i, sm, smp, smz, smzp, result ar = Split(str, " ") For i = LBound(ar) To UBound(ar) sm = sm + Len(Replace(Replace(Replace(Replace(Replace(Replace(ar(i), _ ":", ""), ";", ""), ",", ""), ".", ""), "!", ""), "?", "")) _ + IIf(i > LBound(ar), 1, 0) smz = smz + Len(ar(i)) + IIf(i > LBound(ar), 1, 0) If sm > maxLen Then Exit For smp = sm: smzp = smz Next i result = StrReverse(Left(str, smzp)) For i = 1 To Len(result) If InStr(":;,.!?", Mid(result, i, 1)) = 0 Then result = StrReverse(Mid(result, i)) Exit For End If Next i NOPREPINAKI = result End Function
В моем приложенном файле в сообщении № 6 всё же настроено и показано...
Либо вы его сохранили как XLSX и макрос исчез при этом (у меня-то см. - XLSM расширение у файла), либо у вас макросы вообще отключены... Надо включить через Параметры \ Центр управления безопасностью (если возникнут вопросы с включением - погуглите самостоятельно).
В моем приложенном файле в сообщении № 6 всё же настроено и показано...
Либо вы его сохранили как XLSX и макрос исчез при этом (у меня-то см. - XLSM расширение у файла), либо у вас макросы вообще отключены... Надо включить через Параметры \ Центр управления безопасностью (если возникнут вопросы с включением - погуглите самостоятельно).Gustav