0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 54
|
|
1 | |
Поиск и выделение в таблице по нескольким параметрам03.04.2013, 01:53. Показов 28970. Ответов 75
Метки нет (Все метки)
Ночи доброй форумчане!
возник следующий вопрос: есть таблица(размерность может быть как увеличена, так и уменьшена) можно ли вывести на экран менюшку в котороый можно будет задавать несколько параметров поиска? к примеру в таблице надо найти все ячейки в которых встречаются сразу все эти критерии( П, Г, 234, МЗН) кол-во параметров может варьироваться от 1го до ++ вбивать параметры нужно ручками в специальном окошке(менюшке), (и в любом порядке) нужные ячейки будут подсвечиваться цветом к примеру "vbGreen"
0
|
03.04.2013, 01:53 | |
Ответы с готовыми решениями:
75
Как можно найти строки в таблице по нескольким параметрам одного столбца? Поиск по нескольким параметрам? Поиск по нескольким параметрам поиск по нескольким параметрам |
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
03.04.2013, 23:43 | 41 |
To Hugo. Теперь самая большая проблема для RewCrew - сохранить возможность сравнения в ТАЙНЕ!!! от того человека, который в эту таблицу заносит данные. Нет, я ему не завидую.
1
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 54
|
|
03.04.2013, 23:48 [ТС] | 42 |
Igor_Tr, теперь все стало понятно)
Hugo121, ну здесь проблем не будет, т.к. условия только кириллицей и только в верхнем регистре будут записаны. Но на всякий случай возьму на заметку. Добавлено через 3 минуты полностью согласен с вами
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
03.04.2013, 23:49 | 43 |
Если в верхнем - UCase()
В любом случае если запрашиваете в inputbox - не лишним будет привести к одному регистру, да и транслитерировать тоже. И откинуть лишние пробелы application.trim'ом (обязательно!) Добавлено через 57 секунд Если будете заводить сами - тогда можно этого не делать
2
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 54
|
|
03.04.2013, 23:51 [ТС] | 44 |
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
03.04.2013, 23:58 | 45 |
Нет, если проверяете работу другого - тогда эти трансформации как раз не нужны. Сами ввели как нужно - нашли правильно введённые. Если там напутано - значит напутано...
1
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
||||||
04.04.2013, 12:34 | 46 | |||||
To_RewCrew. Здравствуйте. Решил сохранить для себя - на всякий случай. Просмотрел. Обратите внимание на ячейку "c13" ("П,234, МЗН"). Пропущен пробел! Работа не корректна! Нужно учитывать. Я рекомендую, с учетом подсказок Hugo121, заменить вверху mstr = StrConv(mstr, vbUpperCase) на mstr = LCase(mstr), и ниже, многострадальный фрагмент
1
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 54
|
|
05.04.2013, 00:21 [ТС] | 47 |
Igor_Tr, вот это да)
спасибо)
0
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
05.04.2013, 00:56 | 48 |
Здрасьте! Не совсем. Не знаю структуру Вашего листа и размеры. Судя по примеру - куча пустых ячеек в разбросе. И листинг их тоже проверяет, хоть и на лету. Будет время для себя - посижу над этим примером. Интересный. Но когда это будет - не знаю. Поэтому Вам подскажу. Вместо Set mRng = .usedrange.value нужно применить Set mRng = .UsedRange.SpecialCells(xlCellTypeConstants). Тогда будут проверяться только ячейки с значениями. И тут еще можно конкретизировать, но нужно точно знать Ваши условия, например, могут быть ячейки только с числами, или нет? Если есть, тогда нужно проверять, или нет. Другими словами - все это еще можна оптимизировать, ведь все было на лету. Пробуйте. У меня теперь руки не доходять. Только не подумайте - не бокалами заняты! Удачи.
0
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
07.04.2013, 22:05 | 49 |
Здравствуйте. Было сегодня время. Ну вот, такой результат. Я размножил Ваш пример до 2496 строк. Запустил - время до последних изменений - 36 секунд. Это много. С последними изменениями, время - 20 секунд. Как сделать быстрее - уже не знаю. Может здесь кто-то подправит, или подскажет, что применить. Но тем не меньше, если у Вас очень много данных, то эфект, конечно, будет. Все удачи.
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
||||||
07.04.2013, 22:51 | 50 | |||||
Может я не вполне понял задачу... Но так быстрее - у меня в чуть более секунды укладывается:
Добавлено через 4 минуты Извиняюсь, не прочитал сворованный текст - у меня на запятые не рассчитано (исправил) Но можно добавить. И ещё нужно добавить выход из макроса, если инпутбокс закрыли отменой или крестом. Или ничего не завели.
1
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
07.04.2013, 23:34 | 51 |
To Hugo. Здравствуйте. Там, кратко, история такая. Человеку нужно найти набор (не комбинацию!!!) критериев. Тоесть, в ячейках раскидано всякое, по разному и много, и задаются для поиска критерии тоже наобум. В ячейке С100 может быть " А, П, 789, ввф, ...., Весна красивая". Он задает критерии "ввф, А, Весна". Нужно найти все ячейки и закрасить, где эти все критерии живут, не зависимо от наличия в тех ячейках других значений. Логики занесения данных нет, соответсвенно логики в задании параметров для поиска быть не может.
У меня есть что-то подобное (слава Богу, больше упорядоченное), только руки не доходили. Например, шифры расценок иногда записываються с определенными идентификаторами, такими как & ("применительно"). Вот меня и заинтересовало. Добавлено через 10 минут To Hugo. Вы меня убили. Наповал. Я НЕДОДУМАЛСЯ!!! ПРИМЕНИТЬ!!! СЛОВАРЬ!!! для содержимого ячейки!!! Время - 3 секунды!!!. Спасибо. Все равно время не даром. Лучьше ошибаться, чем ничего...
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
07.04.2013, 23:53 | 52 |
Перечитал код Поиск и выделение в таблице по нескольким параметрам (всёж 4 дня прошло, забылось) - там запятые тоже обрабатываются, т.е. они могут быть как разделители слов.
Ну а словарь не обязательно использовать, главное это флаг! Просто со словарём меньше кода. А задачу значит я понял правильно, так и делаю - проверяю каждую ячейку на наличие всех слов-критериев.
0
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
08.04.2013, 00:04 | 53 |
И раз уже такое. Где-то у нас в разговоре проскакивало насчет применения в качестве Item словаря - 0&. Прогнал на этом примере - хоть немного, но действительно быстрее
Еще раз спасибо. Добавлено через 8 минут
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
08.04.2013, 00:16 | 54 |
0& - это 0 типа Long, что вроде как быстрее обрабатывается.
А вместо словаря можно каждое слово-критерий сравнить с каждым словом из очередной ячейки. т.е. split в массив, и цикл в цикле перебираем. С регулярками я пока не дружу... хотя нужно бы освоить... Так иногда по примерам использую, но все их "вкусности" пока не прочувствовал.
0
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
08.04.2013, 00:49 | 55 |
Добавлено через 8 минут
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
||||||
08.04.2013, 09:10 | 56 | |||||
Попробовал на массиве и с union - как ни странно, 8 секунд.
Вероятно, на каждый union происходит обращение к ячейке, что в итоге только тормозит процесс... Как-то не понятно, не логично... А этот последний код, если ещё добавить If Len(cc.Value) Then - то 0,6 сек. Лучший вариант - анализ массива, покраска сразу на листе - менее полсекунды:
1
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
|
08.04.2013, 10:54 | 57 |
Не совсем. Какой смысл в покрасте? В тех, старых кодах, я менял форматирование текста не просто так - как намек ТС, что можно с AllCells сразу делать все что хочешь. Ну а все страховки, сообщения например, что ничего не найдено, сколько найдено и т.п., думаю, ему самому это под силу. Если нужно. В любом случае - 8 секунд - это даааалекооо не 36. Наверное, специальность сказывается. Психологически, для меня запускать словарь для проверки содержимого ячейки - это было как запустить большой, мощный бульдозер Kamatsu вместо маленького и шустрого VJC для вертикальной планировки в здоровом и густом саду. Мое личное Вам спасибо за подсказку, помогли барьер сломать.
Добавлено через 13 минут А! Еще у меня вопрос, если можно. Почему, все-таки, 0&, а не, например, 0%? Нуль - он и есть нуль, но как-будто Integer чуть ли не в два раза меньше места занимает, не помню точно. И в данном случае, он не будет играть роль в "соответствии типов данных". И верхняя граница значения не имеет. Почему не Byte - понятно, а вот почему не Integer - не понятно. Или это какие-то внутренние болезни железячки?
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
08.04.2013, 11:23 | 58 |
На MSDN писалось, что внутри VBA все Integer всё равно переводит в Long, так что Integer смысла не имеет, только тормозит процесс:
http://msdn.microsoft.com/en-u... e.10).aspx Traditionally, VBA programmers have used integers to hold small numbers, because they required less memory. In recent versions, however, VBA converts all integer values to type Long, even if they are declared as type Integer. Therefore, there is no longer a performance advantage to using Integer variables; in fact, Long variables might be slightly faster because VBA does not have to convert them.
1
|
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
|
||||||
08.04.2013, 14:24 | 59 | |||||
Нет, ну нормально. А я каждый раз за каждый байт войну веду сам с собой в этих типах!!! Спасибо! Поставлю как заставку при включении Windows.
Добавлено через 2 часа 54 минуты To Hugo121. Зацепило. Сильно, потому-что с собирательным диапазоном (здесь - AllCells) мне много работать приходится. Поэтому покрутил на перекурах. Что я сделал? Скомбинировал мое, что раньше, с Вашими последними подсказками. Для общего диапазона - SpecialCells, для собирательного - отдельную коллекцию адресов. Для преобразования строки накидал простенькую функцию func_ProcessPhrase(fStr As String) (жаль было времени искать в сети). Собрал "гибрид". Время, полное, в т.ч. на форматирование - 1.07 секунды! Все! Диапазоны типа AllCells на полку!!! И подальше!!!
Hugo! Еще раз спасибо! Я Ваш должник! Можна идти действительно на перекур!
0
|
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
|
|
08.04.2013, 14:47 | 60 |
Я только не понимаю, зачем собирать в коллекцию адреса, почему сразу не отмечать? Лишний код и цикл... хотя времени особо не займёт.
А идея собрать в один массив адреса и значения интересная, хотя думаю тоже лишнее в данном случае - можно ведь взять в массив только значения (одним движением), а на лист идти по номеру (только specialcells тогда кажется не прикрутить...) Т.к. тут всё равно получается цикл по ячейкам, чтоб взять в массив - так сразу эти ячейки и анализируйте, и сразу помечайте. Думаю получится чуть быстрее, если как у Вас смотреть только specialcells. В общем, вариантов решения уже не счесть И по большому счёту разница даже в пару секунд роли не играет, вот если объёмы больше и уже десятки секунд разница - тогда есть смысл оптимизировать до мелочей. Или если работа выполняется в процессе и часто.
0
|
08.04.2013, 14:47 | |
08.04.2013, 14:47 | |
Помогаю со студенческими работами здесь
60
Поиск в DbGrid по нескольким параметрам Сделать поиск по нескольким параметрам Поиск по нескольким критериям (параметрам) Одновременный поиск по нескольким параметрам Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |