Всем добрый день. Улучшаю себе один код и уперся в то, что тут правильно использовать массив array, но не могу понять как совершать поиск в массиве и батюшка гугл за 2 часа поиска мне ничем не помог. Находил что то типа Array.FindIndex - но vba ругается и не опознает что это вообще такое, справка про FindIndex тоже молчит.
есть 2 массива b = Array(bol, glush, ivash, kov, kul, nest, shap, shitl) m = Array("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8"
выбираю значение в combobox на userform, значения аналогичны значениям в массиве! Подскажите пожалуйста, каким образом совершать поиск текста который вернул комбобокс в массиве b?
на словах звучит так: Combobox1.Text найти какой по счету в массиве b и вернуть значение с найденным индексом с массива m
я только к массивам добрался, а вы меня словарём сразу))))) И насчет перебора циклом, каким образом это делать? как пользоваться for ... next я знаю, но как по array шерстить?
Hugo, я правильно понял, что можно вернуть номер значения по счету из комбобокс?
Если правильно понимаю, то вы предлагаете вернуть этот номер и найти значение по номеру в array Вариант неплохой и судя по всему исключает перебор, но это только в том случае если сортировка комбобокса совпадает с размещением данных в array, но если этот порядок будет разным, то соответственно получим не тот результат что ожидаем.
Но все таки интересно на будущее, каким образом получить этот индекс?
Насчет файла... признаю честно, специально не стал ложить сюда, чтоб не дали готового решения! Хотелось именно пару наводок, чтоб самому дойди... мне полезно, я учусь)))))
marker_mc пишет: Насчет файла... признаю честно, специально не стал ложить сюда, чтоб не дали готового решения! Хотелось именно пару наводок, чтоб самому дойди... мне полезно, я учусь)))))
))))
Да, в КБ тоже что и в Массиве и расположение тоже такое же, но КБ формируется не с массива, а с именованного диапазона EXCEL... но я немножко забегая на будущее... по принципу "а мало ли...." во избежании ошибки. за ListIndex спасибо, запомню что такое тоже есть... и при условии когда массив и КБ идентичны это будет поудобнее чем перебор.
Ребята, поиск на листе это Вы уже не туда пошли... .find это я уже прошел и пользуюсь... стоял вопрос именно в массиве VBA array который с листом никак не связан, а вот КБ формируется именно с листа через созданное имя в диспетчере имен. Но вопрос уже был решен... я применил по наводке LVL именно перебор. ListIndex от Hugo тоже интересно, но при условии что данные КБ идентичны расположению данных в array. И эти два способа полностью подходят. Если уже крутить немного тему дальше... LVL предложил еще вариант через словарь... было бы интересно как с ним работать, потому что до него еще не добирался и пока что не знаю с чем его едят.
Да словарей тут вагон был... Ищите по scripting.dictionary Смысл такой - запоминаем в словаре слово и к нему ещё что-то (номер, массив, другой словарь... В данном случае номер). Далее в любой момент обращаемся к словарю и по слову берём номер (ну или что там запомнили...) И то, что запомнили - можно в любой момент изменить.
Хотя конечно на 8 значений нет смысла словарь привлекать (тем более что искать нужно только 1 значение при каждом запуске кода) - оставляйте перебор. Словарь нужен когда нужно найти например 10000 пар в двух несортированных списках, ну или подсчитать количество повторов уникальных.
Но дольше С ADO проще, когда есть класс от nerv или Function ADO_R_Dmitry() Но ведь есть строгие требования к данным. А с словарём простор для манёвра.
Hugo пишет: С ADO проще, когда есть класс от nerv или Function ADO_R_Dmitry()
ну, так зачем много раз одно и тоже набирать, если можно один раз сделать и потом использовать? Обычная практика. Всю лишнюю/скучную/глупую рутинную работу переложить на класс/функцию.
Цитата
Hugo пишет: А с словарём простор для манёвра.
пример маневра
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук
Я как-то сравнивал скорость работы - словарь был быстрее. Можем ещё на какой задаче проверить. Ну а пример маневра - например в столбце числа тестом, или даты не даты, или нужно отбирать только те строки, где есть определённый текст, ну или ещё другие "или"... Насчёт рутины - в общем со словарями аналогично, часто можно с небольшими коррекциями использовать один уже написанный код
marker_mc пишет: стоял вопрос именно в массиве VBAarray который с листом никак не связан, а вот КБ формируется именно с листа через созданное имя в диспетчере имен.
Может имеет смысл заполнить массив с того же листа? тогда всё будет совпадать
WorksheetFunction.Match() вам в помощь, но находит не индекс массива, а номер начиная с единицы. если индекс тоже с единицы, то все ок, иначе надо корректировать..
Hugo пишет: Я как-то сравнивал скорость работы - словарь был быстрее.
я почему то сомневаюсь )
Цитата
Hugo пишет: Ну а пример маневра - например в столбце числа тестом, или даты не даты, или нужно отбирать только те строки, где есть определённый текст, ну или ещё другие "или"...
все вышеописанное можно сделать с помощью ADO (SQL)
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук
а что мешает потестировать? я несколько раз сравнивал (для простых SQL-запрсов, без вычислений для каждой строчки) - SQL медленнее примерно в три раза.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Раз уж тема крутится дальше... мне как вариант еще понравилось предложение ambasad, внести данные в массив с листа. как записать в array именованный диапазон? вместо этого b = Array(bol, glush, ivash, kov, kul, nest, shap, shitl)