Страницы: 1
RSS
Поиск блока символов в массиве ч/з UDF, Функция работает только с блоками из одинаковых символов
 
Здравствуйте уважаемые форумчане!
Позвольте обратиться за советом.
Благодаря помощи добрых людей (спасибо Александру "ikki" ), есть в наличии UDF .
Функция помогает находить вертикальные блоки символов в массиве: указывается номер строки и она возвращает номер столбца, где заданный блок символов «сидит» в буквальном смысле сверху на строке.

Функция работает как часы, «вылавливая» блоки одинакового содержания, например, «ДДДДДД» или «НННН» (высота задаётся отдельно, в зависимости от кол-ва символов).
Однако, когда возникла необходимость поискать блоки разного наполнения – «ДДННН», «НННДДД», «вуНННННН», «ДДуНННН» - то к сожалению, функция отказалась выручать…
Думал, переменной (s) непосредственно указывать «состав» символов, чтобы Split создавал искомый массив. Всё равно не работает. Чувствую, что загвоздка находится где-то в циклах с присвоением значений переменным.
Честно скажу, что механизм этой функции до конца не понимаю – не могу «допетрить», где нужно «подкрутить»… Пусть даже переменную высоты блока (х) придётся задавать отдельно для каждого набора блока, лишь бы функция «научилась» находить блоки с разным составом символов.

Если это не сложная задачка, посоветуйте, пожалуйста, что можно отредактировать в коде?
Благодарю за внимание!
Код
Function f(r As Range, n&, Optional x = 7, Optional s = "Д;Н")
 Dim a(), b&(), j&, k&, jj&, xx, ss$, ff As Boolean
 If x > r.Rows.Count Or x > n Then f = CVErr(xlErrValue): Exit Function
 a = r.Rows(n - x).Resize(x).Value
 
 xx = Split(s, ";")
 For jj = 0 To UBound(xx)
 ss = ";" & xx(jj): xx(jj) = ""
 For j = 1 To x: xx(jj) = xx(jj) & ss: Next
 Next
 
 ReDim b(1 To Application.Caller.Columns.Count): j = 1: k = 0
 Do While j <= UBound(a, 2) And k < UBound(b)
 ss = "": ff = False
 For jj = 1 To x: ss = ss & ";" & a(jj, j): Next
 For jj = 0 To UBound(xx)
 If ss = xx(jj) Then ff = True: Exit For
 Next
 If ff Then k = k + 1: b(k) = j
 j = j + 1
 Loop
 f = b
End Function
 
Кросс
 
руки поотрывать таким помогальщикам, которые ни одного комментария не пишут
нич-чё непонятно.

Михаил, если никто другой здесь, [или на msexcel (добавлено модератором)],  или у Дмитрия на форуме не возьмётся - обещаю посмотреть-вспомнить дня через два.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Юрий М пишет: Кросс
Вынужден, как говориться, стучаться во все двери. Если публикация на разных форумах неприлична - прошу у коренных жителей форума прощения!
Цитата
ikki пишет: обещаю посмотреть-вспомнить
Просто не смею, Александр, настаивать - Вы и так здорово помогли, создав такую чудо-функцию. В любом случае, буду ждать совета на форумах - кому-то такие вещи "как семечки"!
 
Цитата
Вынужден, как говориться, стучаться во все двери
Постучитесь и сюда, п.4.1
 
Клятвенно обещаю - это было первый и последний раз!
Как говорил Миронов в "Обыкновенном чуде": "Был не прав, вспылил. Но теперь считаю свое предложение безобразной ошибкой, раскаиваюсь, прошу дать возможность загладить, искупить..."
 
Цитата
- Клятвенно обещаю - это было первый и последний раз!
Честное пионерское?
Вроди бы работает правильно.Самая длинная комбинация  символов должна быть первой.
Цитата
руки поотрывать таким помогальщикам, которые ни одного комментария не пишут
По пояснению кода к ikki,я и сам не понял как работает   :)
Изменено: Doober - 23.09.2014 15:16:27
 
изначально это была вот эта тема у Сержа
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Doober пишет:
Честное пионерское?
Как говорил Этуш в "Иван Васильевиче...": "даю Вам честное благородное слово!"

Спасибо огромное за Ваш отклик! Из-за своей некомпетентности я не могу "сходу" проанализировать Ваше решение - буду разбирать его, подставляя символы в функции.
На всякий случай, я и тут опубликую разъяснение к проблеме, чтобы точно определить необходимое.

Итак.
Имеются массивы, содержащие четыре типа символов (Д, Н, у, в).
Необходима функция, которая отыскивает вертикальные (!) блоки символов посредством ввода номера строки. Функция возвращает номер столбца массива только в том случае, когда нужный блок символов «сидит» на строке, номер которой мы задали для поиска. Причём, важно, чтобы блок именно «сидел» на строке.

Пример (из файла-исходника).
Интересует, есть ли вертикальный блок «ННННННН» (т.е. высота – 7) в диапазоне строк 18-21.
Вводим в поисковую ячейку номера строк (т.е. перебираем массив). При вводе строки 20 функция возвращает номера столбцов массива 27, 42 – тот случай, когда 7-ми этажный блок «ННННННН» сидит на строке (здесь 20-я).
Высоту искомого блока можно менять в функции (переменная х). Символы задаются переменной s.
Некомпетентность
При одинаковых символах в блоке функция работает.
Проблема проявилась, когда нужно найти блоки с разным составом символов. Например, «ДДННН», «НННДДД», «вуНННННН», «ДДуНННН» . Прошу учесть, и это важно, очерёдность символов - здесь в строке символы указаны слева-направо, а вертикально это превращается  в «снизу-вверх».  Пытался поочерёдно их указывать в переменной s, но функция отказалась их принимать.

Пусть функция потеряет свою универсальность - готов отдельно под каждый блок символов (со своей высотой) создать коды функций в макросах: столько функций, сколько уникальных блоков.
Знать бы только, где произвести корректировку!
Изменено: mick-77 - 23.09.2014 18:38:43
 
Цитата
mick-77 пишет: Если публикация на разных форумах неприлична - прошу у коренных жителей форума прощения!
Никто не запрещает создавать темы на нескольких форумах, но ИНФОРМИРУЙТЕ об этом.
 
Цитата
Юрий М пишет: ИНФОРМИРУЙТЕ об этом.
Как говориться, зарубил у себя на носу! Спасибо, что научили правильным манерам, хотя сам виноват - не прочёл досконально кодекс поведения.

Теперь о хорошем!
Doober, дай Бог Вам крепкого здоровья и удачи по жизни!!! Быть может, для Вас это было нетрудным, однако для меня, гуманитария, такие вещи сродни чудесам.
Функция прекрасно работает, находя любой блок (с любыми символами). И не обязательно, как Вы упомянули, длинная комбинация должна быть первой. Первыми должны идти те символы, которые будут вверху блока. Т.е. если мы пишем, учитывая регистр, символы блока слева-направо, то вертикально это будет сверху-вниз. Это я вывел, когда подставлял комбинации символов в строке формул, где в кавычках задаётся структура блока.
Считаю долгом также поблагодарить Александра "ikki" - с его лёгкой руки эта функция обрела жизнь!

Ещё раз прошу простить за моё мелкое хулиганство с "кроссом"!
Спасибо всем за внимание!
Тему можно закрывать.
Изменено: mick-77 - 24.09.2014 22:52:35
Страницы: 1
Наверх