Помогите придумать формулу, которая бы подсчитывала количества вхождений подстроки сразу в нескольких строках (т.е. ячейках). Пример прикрепляю. Ситуация осложняется тем, что например подстрока "AGA" в строке "KAGAGAL" встречается ДВА раза.
Подсчитать количество вхождений подстроки в массиве строк
27.05.2024 18:23:23
|
|
|
|
27.05.2024 18:32:40
dim284, VBA разрешено?
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||
|
|
27.05.2024 18:57:20
Да, перекрывается только одна буква. Но универсальность приветствуется. |
|||
|
|
27.05.2024 20:27:24
|
|
|
|
27.05.2024 20:43:18
UDF
|
|||
|
|
27.05.2024 21:25:12
Отличная функция, спасибо! Но получается, что можно считать только по одной ячейке. А можно ли сделать массив входных данных? Немного переделал.
Так-то можно считать и формулой:=СУММПРОИЗВ(--("AGA"=ПСТР(A1;ПОСЛЕД(ДЛСТР(A1)-2;1;1;1);3)))
Изменено: |
|||
|
|
27.05.2024 21:33:37
Регулярка от ИИ:
|
|||
|
|
27.05.2024 22:04:09
=COUNT(1/(MID(A1:A2;SEQUENCE(1;MAX(LEN(A1:A2)));3)="AGA"))
По вопросам из тем форума, личку не читаю.
|
|
|
|
27.05.2024 22:16:19
БМВ, спасибо! Отлично работает. В русском экселе
=СЧЁТ(1/(ПСТР(A1:A3;ПОСЛЕД(1;МАКС(ДЛСТР(A1:A3)));3)="AGA")) |
|
|
|
28.05.2024 09:51:16
Начинает подбор немедленно, а не после подстроки.
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||||
|
|
28.05.2024 10:16:06
Jack Famous, мне кажется что-то у Вас всё сложно так реализовано с регуляркой,
нет рекурсии, не проснулся, всё равно сложно ) неужели нельзя просто посчитать количество подгрупп, которые вернёт выражение - просто вопрос, сам ещё не попробовал
Изменено: |
|
|
|
28.05.2024 10:31:24
If RE.Test(x) Then Get_AGA_RE = Get_AGA_RE + RE.Execute(x).Count Остальное — цикл по всем областям диапазона, получение массива и цикл по всем элементам массива. Если без диапазона, то и была бы одна строка (две, если учесть вариант с игнором регистра). Вроде, ничего сложного
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||
|
|
28.05.2024 10:59:07
Jack Famous, а зачем одновременно два объекта RE и Reci, если на самом деле всегда используется только один?
|
|
|
|
28.05.2024 11:06:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||
|
|
28.05.2024 13:48:29
Jack Famous, а, ну всё - открылись глаза
переделал, но лучше оригинала не получилось )) критика приветствуется
сразу вижу сам - сцеплять значения лучше через разделитель
Изменено: |
|||
|
|
28.05.2024 14:26:54
1. скорость будет заметно ниже на больших объёмах — я же не просто так использовал цикл по массиву вместо цикла по ячейкам. 2. идея собрать одну большую строку — хорошая . Так не нужно помещать в статику 2 объекта регулярок. Но тогда нужно собирать строки в строковый массив (Dim a$() ) и итоговую строку получить как Join(a). Так может быть выигрыш, но надо проверять с разным количеством ячеек и длин строк. Накопление строки сцепкой (как у вас) — очень плохо для большого количества строк.
Иначе можем получить совпадения там, где их нет: конец одной строки + начало другой.
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||||
|
|
28.05.2024 17:23:30
Еще вариант
=СУММПРОИЗВ(ДЛСТР(ПОДСТАВИТЬ(A1:A3;"A";"AA"))-ДЛСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1:A3;"A";"AA");"AGA"; )))/3 или (21-й офис) =LET(_а;ПОДСТАВИТЬ(A1:A3;"A";"AA");СУММ(ДЛСТР(_а)-ДЛСТР(ПОДСТАВИТЬ(_а;"AGA";11)))) |
||||
|
|
|||