Страницы: 1
RSS
Разделить фразу на две части
 
Добрый день!
Второй день ломаю голову, как можно реализовать (если можно) данную штуку... Обращаюсь за помощью.
Есть фраза "разделить фразу пополам формулой excel" можно ли ее разбить пополам со звездочкой... имеется ввиду что бы не разбивать слово, которое в середине фразы пополам, а что бы это слово перенеслось либо к левой части фразы, либо к правой...

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

возможно ли сделать так?
исходная фраза "разделить фразу пополам формулой excel"
разделить на:
"разделить фразу пополам" и  "формулой excel"
или
"разделить фразу" и  "пополам формулой excel"

помогите пожалуйста!
 
Если четно, ничего не понял. Вы хотите взять начало фразы и конец фразы, а слово посередине добавить к той части, которая короче?
 
извиняюсь за не ясность

да. все так. взять начало фразы и конец фразы, а слово посередине добавить к той части, которая короче
 
НО фраза может быть и длинее:
"разделить фразу пополам формулой excel быстро и без проблем"
тогда
"разделить фразу пополам формулой" и "excel быстро и без проблем"
или
"разделить фразу пополам" и "формулой excel быстро и без проблем"

это вообще реализуемо или такая функция очень сложная и ее надо заказывать?
помогите! спасибо!
Изменено: denor81 - 02.11.2015 12:40:12
 
формула или макрос?
 
формула предпочтительнее
 
контекстная реклама, деление на 33 и истаток?
denor81,  обратите внимание на сообщение №5.
 
Формулу не могу, могу UDF
Код
Function tt(ByVal Text As String) As String
    Text = Application.WorksheetFunction.Trim(Text)
    Dim L As Long: L = Round(Len(Text) / 2)
    Dim obj As Object
    With CreateObject("VBScript.RegExp")
        .Pattern = "^(.{1," & L & "} )(.*?) (.{1," & L & "})$"
        If .test(Text) Then
            Set obj = .Execute(Text)
            If Len(obj.Item(0).SUBMATCHES(0)) > Len(obj.Item(0).SUBMATCHES(2)) Then _
                tt = obj.Item(0).SUBMATCHES(0) & " - " & obj.Item(0).SUBMATCHES(1) & " " & obj.Item(0).SUBMATCHES(2) Else _
                tt = obj.Item(0).SUBMATCHES(0) & " " & obj.Item(0).SUBMATCHES(1) & " - " & obj.Item(0).SUBMATCHES(2)
        End If
    End With
End Function

 
В B1 и C1:
1)
=ЛЕВБ(A1;ЕСЛИ(АГРЕГАТ(14;6;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))/(ПСТР(A1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)));1)=" ")/(СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))<=ДЛСТР(A1)/2);1)-1<=ДЛСТР(A1)-АГРЕГАТ(15;6;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))/(ПСТР(A1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)));1)=" ")/(СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))>=ДЛСТР(A1)/2);1);АГРЕГАТ(15;6;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))/(ПСТР(A1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)));1)=" ")/(СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))>АГРЕГАТ(14;6;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))/(ПСТР(A1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)));1)=" ")/(СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))<=ДЛСТР(A1)/2);1));1);АГРЕГАТ(15;6;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))/(ПСТР(A1;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)));1)=" ")/(СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A1)))>=ДЛСТР(A1)/2);1))-1)

2)
=СЖПРОБЕЛЫ(ПОДСТАВИТЬ(A1;B1;"";1))
Изменено: JayBhagavan - 02.11.2015 13:04:55

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Файл в аттаче. но там ничего нового.

у меня задача делить фразы пополам. т.е. предложение может очень длинное.
мне нужно его делить пополам не разделяя серединное слово
 
ой. сейчас посмотрю. буду пробовать. неожиданно так. сразу два варианта.
спасибо. сейчас попробую
 
Третий:
=ЛЕВБ(A2;ПОИСК("/";ПОДСТАВИТЬ(ЛЕВБ(A2;ДЛСТР(A2)/2);" ";"/";ДЛСТР(A2)/2-ДЛСТР(ПОДСТАВИТЬ(ЛЕВБ(A2;ДЛСТР(A2)/2);" ";))))-1)
=ПОДСТАВИТЬ(A2;B2&" ";)

ДЛСТР(A2)/2 в формуле повторяется. Если вынести это в отдельную ячейку, то формула сократится и количество вычислений уменьшится.

Цитата
у меня задача делить фразы пополам. т.е. предложение может очень длинное
Не совсем понятно желание делить только на две части. А если и эти части окажутся длиннее требуемого? А если предложение меньше требуемой длины, какой смысл делить?
 
Первое, что хочу сказать - огромное спасибо! Это так неожиданно и приятно получить отклик на запрос о помощи! Вы все оч крутые!)
МВТ в силу своей не "далекости" в программировании сначала не понял, как это, что с этим делать - погуглил - разобрался и вуаля! Работает!) и после того, как разобрался сразу стало очень удобно!)
JayBhagavan - тоже работает и выполняет требуемый функционал! первым делом ваш вариант попробовал - т.к. формула просто вставил и все! Супер! Сам бы никогда, наверное, не разобрася бы!
vikttur - и так тоже работает!) в этом варианте немного смещение, как бы в левую сторону идет, но тут я так понимаю в формуле немного подствроить можно. и по поводу вашего замечания на счет длины фраз и длины уже разделенных фраз - совершенно справедливо! сейчас просто нет полной картины, как у нас это будет работать. по этому пошагово решаем...

Всем ОГРОМНОЕ спасибо! Сейчас даже не могу сказать каким вариантом буду пользоваться)) буду тестить.
Целых три варианта и все выполняют функцию и у всех свои сильные стороны)
Супер!
Изменено: denor81 - 02.11.2015 13:41:14
 
Или абсолютно асимметричная фраза, типа: вот он синхрофазотрон. Замучаешься пополам делить  :D
 
Цитата
в этом варианте немного смещение, как бы в левую сторону идет
Чем длиннее центральное слово, тем больше "в левую сторону идет"
 
Немного переделал, чтобы такие фразы, как в сообщении № 14, тоже обрабатывало
Код
Function tt(ByVal Text As String) As String
    Text = Application.WorksheetFunction.Trim(Text)
    Dim L As Long: L = Round(Len(Text) / 2)
    Dim obj As Object
    With CreateObject("VBScript.RegExp")
        .Pattern = "^(.{0," & L & "})(?= |^)(.*?)(?= |$)(.{0," & L & "})$"
        If .test(Text) Then
            Set obj = .Execute(Text)
            If Len(obj.Item(0).SUBMATCHES(0)) > Len(obj.Item(0).SUBMATCHES(2)) Then _
                tt = obj.Item(0).SUBMATCHES(0) & " - " & obj.Item(0).SUBMATCHES(1) & " " & obj.Item(0).SUBMATCHES(2) Else _
                tt = obj.Item(0).SUBMATCHES(0) & " " & obj.Item(0).SUBMATCHES(1) & " - " & obj.Item(0).SUBMATCHES(2)
        End If
    End With
    tt = Application.WorksheetFunction.Trim(tt)
End Function

 
Цитата
МВТ написал: вот он синхрофазотрон
М-да, на этой фразе составленная мной формула не работает. Спасибо за фразу. :)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Вот попробовал тоже. Алгоритм - нахождение числа пробелов и деление фразы по среднему пробелу на две части.
 
Цитата
denor81 написал: можно ли ее разбить пополам...
То есть на 2 части - просто обалдеть!!! 20 слов на 2 = 10 в одном, а 2  слова по 1 = 1 в одном. И это все в одном поле/столбце: и 10, и 1?!.
Простите, имхо, но не вижу ни малейшего намека на ЦЕЛЕСООБРАЗНОСТЬ сей заморочки. Можете пояснить: что, из чего, куда и ЗАЧЕМ?.. ;)
ps Не проще ли воспользоваться переносом строк в ячейке, а затем разогнать по столбам.
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
JayBhagavan, не за что. Хотите я Вам еще парочку напишу  :D?  
 
МВТ,

Здравствуйте скажите пожалуйста как вставить ваш код макроса? никак не получается заставить работать его
Страницы: 1
Читают тему
Наверх