Страницы: 1 2 3 След.
RSS
Подсчет длин серий в последовательности формулой
 
Подскажите, плиз, формулу для решения такой задачки.
В ячейке - последовательность А и Б, например, АББААББАБББААААА.
Нужно получить на выходе формулы длины серий А, разделенные 1 пробелом, т.е. 1 2 1 5.
Dum spiro spero
 
По-моему, это адекватнее всего будет сделать через пользовательскую функцию (VBA).
 
Код
Function CharSeriesCount(s$, ch$)
  Dim re, m, i&
  If s = "" Or ch = "" Then Exit Function Else Set re = CreateObject("VBScript.RegExp")
  re.Global = True: re.Pattern = ch & "+": Set m = re.Execute(s)
  If m.Count > 0 Then
    For i = 0 To m.Count - 1: CharSeriesCount = CharSeriesCount & " " & m(i).Length: Next
  End If
  CharSeriesCount = Right(CharSeriesCount, Len(CharSeriesCount) - 1)
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо, но вопрос звучит так: "Подсчет длин серий в последовательности формулой"
Dum spiro spero
 
получить формулой максимальную длину - довольно просто, получить длины серий в отдельные ячейки - довольно просто. а вот получить ФОРМУЛОЙ список с неопределенным количеством длин разделенных пробелами... не знаю
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Mypostmail написал: Спасибо, но
Есть стол заказов - раздел "Работа", в котором все свои "фи" вы можете свободно размещать...
Еще есть поиск по форуму, есть раздел "Приемы", есть блок создателя-владельца сайта - почему избегаете?
Бейте в поиск - "Самая длинная победная серия" и пользуйтесь, доворачивайте под свою хотелку... ;)
Изменено: Z - 10.06.2018 18:03:06
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Игорь, Кузи на тебя нет.  :D
Код
Function www(s$)
    With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "[^А]": www = Application.Trim(.Replace(s, " ")): End With
End Function
 
Цитата
Ігор Гончаренко написал:
не знаю
Вот и я не знаю, потому и спросил.
Dum spiro spero
 
Цитата
Z написал: Есть
Да, спасибо, про это я знаю.
Однако это не ответ на вопрос.
Dum spiro spero
 
Цитата
Mypostmail написал: Однако это не ответ на вопрос.
1 - "2.7. Если вам нужен не совет по самостоятельному решению задачи, а чтобы все сделали за вас - добро пожаловать в ветку Работа. Там, скорее всего, найдутся специалисты, которые разберутся с вашей проблемой быстро, качественно и за разумную плату."
2 - https://www.planetaexcel.ru/techniques/2/4033/
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Спасибо! Я уже написал, что альтернативы мне известны.
Прошу вас комментировать по теме поста или... не комментировать.
Dum spiro spero
 
Mypostmail,
давайте рассмотрим задачу по-проще:
в А1 написано 1
в А2 - 2
а А3 - 3
и т.д. ...
а А1000 - 1000

так вот, задача: написать формулу, которая в В1 напишет "1 2 3 4 ... 1000", понятно без начальной и конечной кавычек
понимаете, вопрос не в том как получить значения {1;2;1;5} а вопрос в том, как из них получить "1 2 1 5" с учетом что неизвестно сколько групп в исходной строке и сколько чисел их длин будет получено в итоге
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Похоже человек просто не понял. что UDF - это не макрос и не знает, как ей воспользоваться.
Ждет файлика, где в строке формул увидит что-то со ссылкой на ячейку.
Изменено: Eco - 10.06.2018 19:26:03
 
UDF (функция пользователя) - это макрос. Может применяться как функция в формуле листа, но может быть и вспомогательным вычислением для других процедур.
 
Цитата
Ігор Гончаренко написал: неизвестно
Да, неизвестны позиция начала считывания и сколько считывать.
Потому и вопрос.
Dum spiro spero
 
Цитата
Mypostmail написал: ...позиция начала считывания и сколько считывать.
По первому сообщению можно понять, что в ОДНОЙ ячейке текстовая строка. Сейчас Вы пишете о количестве и начале считывания... Это что?
 
Цитата
Ігор Гончаренко написал: получить ФОРМУЛОЙ
Ваши комменты - по теме, хочется отвечать :-)
Проблема в том, кмк, какой функционал Excel предоставляет юзеру при работе с массивами.
Возможно, удивлю вас, но в Таблицах Google эта задачка решается элементарно:
Код
ARRAYFORMULA(JOIN(" ",LEN(SPLIT(A1;"Б"))))
Изменено: Mypostmail - 10.06.2018 19:43:08
Dum spiro spero
 
Делите значение по "Б" и объединяете с пробелом?
Возможно, и я Вас удивлю, но в Excel такое решается простой формулой:
=ПОДСТАВИТЬ(A1;"А";"А ")
Возможно, еще добавить удаление "Б" (такая же функция)
Но вопрос был не об этом.
При обработке строки должен получиться массив чисел. И вот в этом массиве (не в ячейке!) между значениями нужно вставить пробелы. значения с пробелами - текст. Текстовые функции не смогут так сработать.
 
Цитата
vikttur написал:
Это что?
Ну, самый очевидный путь хоть какого-то решения этой задачки без кодирования и Текст по столбцам такой:
1. Сжимаю разделители до одного между сериями.
2. Нахожу их позиции.
3. Считываю серии.
Это несложно, сложно всё это объединить в 1 формулу.
Dum spiro spero
 
Цитата
Mypostmail написал:
Да, неизвестны позиция начала считывания и сколько считывать
эти неизвестные легко вычисляются ОДНОЙ формулой в массив (в Вашем примере в массив) {1;2;1;5}
приведу пред. (мою) задачу ближе к Вашим данным
допустите, что УЖЕ есть формула, которая написала в ячейки:
в А1 1
в А2 2
в А3 1
в А4 5
напишите формулу, которая вернет из А1:А4 строку 1 2 1 5

ВНИМАНИЕ! усложняем...
допустим, та же формула в ячейки А1, А2, А3... Ахзсколько написала длинны групп (закончилось это ячейкой хзсколько, потому что ХЗ сколько групп будей в исходной строке)
напишите ФОРМУЛУ, которая из А1:Ахзсколько получит строку значений из колонки А, разделенных пробелами???
еще раз:
дело не в том сколько групп с А есть в исходной строке и какой длины каждая из них, а том как полученные значения длин групп собрать в строку с разделителем пробел.

понимаете проблема не в КАК ПОСЧИТАТЬ сколько букв А в группах, а проблема в КАК СОБРАТЬ В СТРОКУ полученные значения
Изменено: Ігор Гончаренко - 10.06.2018 20:02:27
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Давайте сначала.

Нужна формула.
Функция пользователя (UDF) пишется в VBA, но работает в формуле на листе. Работа макросов должна быть разрешена. Если подходит такое решение - оно уже предложено.
Не подходит? Идем дальше.

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

Решение с помощью других инструментов подходит?
Если формул несколько - подходит?
 
Цитата
vikttur написал:
Возможно, и я Вас удивлю
Удивить не получилось.
Я сжимаю разделители так:
ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ПОДСТАВИТЬ(A2;"Б";" "));" ";"Б").
Это не проблема, проблема в дальнейшей обработке.
Dum spiro spero
 
Да не о сжимании пробелов я Вам писал. Где в Вашем примере в первом сообщении хоть один разделитель между группами?
Вы можете последовательно и четко описать задачу, показать пример данных в файле?
 
и еще одна иллюстрация:
допустим в А1 пишете любое число, например 3, 7, 100, 125487
написшите в ячейку В1 ФОРМУЛУ, которая отобразит числа от 1 до указанного в А1, разделенные пробелами: т.е
1 2 3
1 2 3 4 5 6 7
1 2 3 4 ... 100
1 2 3 ... 125487

я 30 лет работаю c Excel'ем. я не знаю ответа на этот вопрос...
дополнительный столбец и много одинаковых формул и взять  нужное значение - легко, а вот одной формулой... Ваша задача не решается (по моему скромному мнению)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
я 30 лет работаю c Excel
Игорь, получается, ты застал ещё Excel 2 :)
 
Цитата
vikttur написал:
Где в Вашем примере в первом сообщении хоть один разделитель между группами?
Есть входная последовательность:
АББААББАБББААААА,
есть выходная:
1 2 1 5.
Очевидно, что разделителем в данном случае являются группы Б.
Как группы Б превратить в единичный символ Б, я уже показал выше.
Dum spiro spero
 
Цитата
vikttur написал:
Вы можете последовательно и четко описать задачу, показать пример данных в файле?
Задача и мой ход решения (с использованием ячеек) уже описаны.
Посмотрите здесь, плиз:
Excel vs Google Sheets
Dum spiro spero
 
Цитата
Юрий М написал:
Игорь, получается, ты застал ещё Excel 2
Юра, я застал Excel, когда он назывался SuperCalc!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вот оно что...
Цитата
Mypostmail написал: Очевидно, что разделителем в данном случае являются группы Б.
Очевидно, что в примере есть группы А и группы Б. То, что Б - разделитель, нужно был написать.
Если бы это был одиночный символ, то еще можно как-то понять, а так...

Т.к. обычно пробел разделяет слова, значения, и в тексте первого сообщения:
Цитата
...разделенные 1 пробелом...
то далее в сообщениях упоминания о разделителях воспринималось как упоминание о пробелах. Получилась каша :)

Есть решение, формула массива (вводится тремя клавишами):
=СЖПРОБЕЛЫ(ПОДСТАВИТЬ(ПСТР(
СУММ(ЕСЛИОШИБКА((ЧАСТОТА(СТРОКА(1:50);ЕСЛИ(ПСТР(A1;СТРОКА(1:50);1)<>"А";СТРОКА(1:50)))-1)/10^СТРОКА(1:50);));3;20);0;" "))

Для показанного текста ЧАСТОТА выдаст массив {1:0:2:0:1:0:0:5:0:0...}. Каждое из чисел массива делим на 10^n и  суммируем полученные числа.
Осталось удалить 0, и нули заменить на пробелы

Ограничение: если в результате суммирования получится число более 15 разрядов (т.е более 15 групп А и Б), младшие разряды обнулятся и количества этих групп "А" формула не покажет
 
Вы таки над нами издеваетесь, не иначе :)

Почему сразу не показать числовые данные? Зачем эти "АБ"?!
Ведь решение, похоже, проще...
Страницы: 1 2 3 След.
Наверх