Страницы: 1 2 След.
RSS
Поиск значения в массиве VBA
 
Всем добрый день.
Улучшаю себе один код и уперся в то, что тут правильно использовать массив 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

Заранее спасибо!
Изменено: marker_mc - 07.05.2013 14:58:12
 
Перебор всех значений в цикле или словарь  ;)
 
я только к массивам добрался, а вы меня словарём сразу)))))
И насчет перебора циклом, каким образом это делать? как пользоваться for ... next я знаю, но как по array шерстить?
 
вопрос снят! LVL, спасибо за наводку. Сделал перебор значений в массиве через For Next

Выглядит так:

Код
        For i = 0 To 7
            If ComboBox1.Text= m(i) Then
                iBook = b(i)
                Exit For
            End If
        Next i
 
Комбобокс? Используйте индекс (т.е. номер выбранной записи).
Был бы пример в файле... :)
 
Hugo, я правильно понял, что можно вернуть номер значения по счету из комбобокс?

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

Но все таки интересно на будущее, каким образом получить этот индекс?

Насчет файла... признаю честно, специально не стал ложить сюда, чтоб не дали готового решения! Хотелось именно пару наводок, чтоб самому дойди... мне полезно, я учусь)))))
Изменено: marker_mc - 07.05.2013 15:55:23
 
Ну Вы же сказали, что в комбобоксе то, что и в массиве. Т.е. возможно массив является источником комбобокса... А примера нет...
Код
Private Sub ComboBox1_Change()
MsgBox ComboBox1.ListIndex
End Sub


Начало нумерации с 0.
Изменено: Hugo - 07.05.2013 16:02:16
 
Цитата
Hugo пишет:
А примера нет...
Цитата
marker_mc пишет:
Насчет файла... признаю честно, специально не стал ложить сюда, чтоб не дали готового решения! Хотелось именно пару наводок, чтоб самому дойди... мне полезно, я учусь)))))
))))


Да, в КБ тоже что и в Массиве и расположение тоже такое же, но КБ формируется не с массива, а с именованного диапазона EXCEL... но я немножко забегая на будущее... по принципу "а мало ли...." во избежании ошибки.
за ListIndex спасибо, запомню что такое тоже есть... и при условии когда массив и КБ идентичны это будет поудобнее чем перебор.

Спасибо за подсказки!
 
Ну если с листа - то можно на листе формулой поискать.
 
на лист можно и Find натравить.
 
Ребята, поиск на листе это Вы уже не туда пошли... .find это я уже прошел и пользуюсь... стоял вопрос именно в массиве VBA  array который с листом никак не связан, а вот КБ формируется именно с листа через созданное имя в диспетчере имен.
Но вопрос уже был решен... я применил по наводке LVL именно перебор.
ListIndex от Hugo тоже интересно, но при условии что данные КБ идентичны расположению данных в array.
И эти два способа полностью подходят. Если уже крутить немного тему дальше... LVL предложил еще вариант через словарь... было бы интересно как с ним работать, потому что до него еще не добирался и пока что не знаю с чем его едят.
 
Да словарей тут вагон был...
Ищите по scripting.dictionary
Смысл такой - запоминаем в словаре слово и к нему ещё что-то (номер, массив, другой словарь... В данном случае номер).
Далее в любой момент обращаемся к словарю и по слову берём номер (ну или что там запомнили...) И то, что запомнили - можно в любой момент изменить.

Хотя конечно на 8 значений нет смысла словарь привлекать (тем более что искать нужно только 1 значение при каждом запуске кода) - оставляйте перебор.
Словарь нужен когда нужно найти например 10000 пар в двух несортированных списках, ну или подсчитать количество повторов уникальных.
Изменено: Hugo - 07.05.2013 23:27:13
 
Куда-то мой пост подевался)))
 
Сапожник без сапог :)
Что стережём, то и имеем :)
 
Цитата
Hugo пишет:
Словарь нужен когда нужно найти например 10000 пар в двух несортированных списках, ну или подсчитать количество повторов уникальных
с ADO (sql) проще
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Но дольше :)
С ADO проще, когда есть класс от nerv или Function ADO_R_Dmitry() :)
Но ведь есть строгие требования к данным. А с словарём простор для манёвра.
 
Цитата
Hugo пишет:
Но дольше
не понял

Цитата
Hugo пишет:
С ADO проще, когда есть класс от nerv или Function ADO_R_Dmitry()
ну, так зачем много раз одно и тоже набирать, если можно один раз сделать и потом использовать? Обычная практика. Всю лишнюю/скучную/глупую рутинную работу переложить на класс/функцию.

Цитата
Hugo пишет:
А с словарём простор для манёвра.
пример маневра
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Я как-то сравнивал скорость работы - словарь был быстрее. Можем ещё на какой задаче проверить.
Ну а пример маневра - например в столбце числа тестом, или даты не даты, или нужно отбирать только те строки, где есть определённый текст, ну или ещё другие "или"...
Насчёт рутины - в общем со словарями аналогично, часто можно с небольшими коррекциями использовать один уже написанный код :)
 
Цитата
marker_mc пишет:
стоял вопрос именно в массиве VBAarray который с листом никак не связан, а вот КБ формируется именно с листа через созданное имя в диспетчере имен.
Может имеет смысл заполнить массив с того же листа? тогда всё будет совпадать
 
WorksheetFunction.Match() вам в помощь, но находит не индекс массива, а номер начиная с единицы. если индекс тоже с единицы, то все ок, иначе надо корректировать..
Живи и дай жить..
 
Цитата
Hugo пишет:
Я как-то сравнивал скорость работы - словарь был быстрее.
я почему то сомневаюсь )

Цитата
Hugo пишет:
Ну а пример маневра - например в столбце числа тестом, или даты не даты, или нужно отбирать только те строки, где есть определённый текст, ну или ещё другие "или"...
все вышеописанное можно сделать с помощью ADO (SQL)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Цитата
nerv пишет:  я почему то сомневаюсь
а что мешает потестировать?  :)
я несколько раз сравнивал (для простых SQL-запрсов, без вычислений для каждой строчки) - SQL медленнее примерно в три раза.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Раз уж тема крутится дальше...
мне как вариант еще понравилось предложение ambasad, внести данные в массив с листа.
как записать в array именованный диапазон?
вместо этого
b = Array(bol, glush, ivash, kov, kul, nest, shap, shitl)

что то типа такого можно?

b = Array([именованный диапазон])
 
Код
b=range("XXX").value

b - динамический массив типа Variant
XXX - название именованого диапазона  ;)
 
LVL, это будет тогда не массив, а просто диапазон судя по записи
 
a = [именованный_диапазон].Value

Но получите двумерный массив.
 
но а записать в переменную как
Dim a() ???
это и будет обозначения того что это array?
 
Будет массив!
 
в какую переменную? Массив и есть переменная  ;)
 
Ок, попробую ради интереса еще так переделать. Спасибо. Хотя через цикл уже давно работает))))
Страницы: 1 2 След.
Наверх