Array.prototype.find()
Метод find() возвращает значение первого найденного в массиве элемента, которое удовлетворяет условию переданному в callback функции. В противном случае возвращается undefined .
Также смотрите метод findIndex() , который возвращает индекс найденного в массиве элемента вместо его значения.
Если вам нужно найти позицию элемента или наличие элемента в массиве, используйте Array.prototype.indexOf() или Array.prototype.includes() соответственно.
Синтаксис
Параметры
Функция, вызывающаяся для каждого значения в массиве, принимает три аргумента:
Текущий обрабатываемый элемент в массиве.
Индекс текущего обрабатываемого элемента в массиве.
Массив, по которому осуществляется проход.
Необязательный параметр. Значение, используемое в качестве this при выполнении функции callback .
Возвращаемое значение
Значение элемента из массива, если элемент прошёл проверку, иначе undefined .
Описание
Метод find вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве, до тех пор, пока она не вернёт true . Если такой элемент найден, метод find немедленно вернёт значение этого элемента. В противном случае, метод find вернёт undefined . До Firefox 34 функция callback не вызывалась для «дырок» в массивах (bug 1058394).
Функция callback вызывается с тремя аргументами: значением элемента, индексом элемента и массивом, по которому осуществляется проход.
Если в метод find был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае в качестве значения this будет использоваться значение undefined .
Метод find не изменяет массив, для которого он был вызван.
Диапазон элементов, обрабатываемых методом find , устанавливается до первого вызова функции callback . Элементы, добавленные в массив после начала выполнения метода find , не будут посещены функцией callback . Если существующие, непосещение элементы массива изменяются функцией callback , их значения, переданные в функцию, будут значениями на тот момент времени когда метод find посетит их; удалённые элементы все ещё будут посещены.
Примеры
Пример: поиск простого числа в массиве
Следующий пример находит в массиве положительных чисел элемент, являющийся простым числом (либо возвращает undefined , если в массиве нет простых чисел).
Полифил
Этот метод был добавлен в спецификации ECMAScript 6 и пока может быть недоступен во всех реализациях JavaScript. Однако, вы можете использовать следующий сниппет в качестве полифила:
Какой тип данных возвращает метод find
Поиск по массиву будет искать по тем критериям, которые вы придумали.
Время чтения: 5 мин
- Кратко
- Пример
- Интерактивный пример
- Как пишется
- Как понять
Обновлено 29 мая 2022
Кратко
Скопировать ссылку на секцию «Кратко» Скопировано
Метод массива find ( ) вернёт первый найденный в массиве элемент, который подходит под условие в переданной колбэк-функции. Если в массиве не найдётся ни одного подходящего элемента, то вернётся значение undefined .
Пример
Скопировать ссылку на секцию «Пример» Скопировано
Опишем функцию, которая позволит определить, есть ли в списке дел моё любимое занятие. Поставим в константу просмотр сериальчиков и будем проверять: если занятие из ToDo-списка совпадает с моим хобби, то вернём его. В списке дел на завтра нет просмотра сериалов, а значит, вернётся undefined .
Интерактивный пример
Скопировать ссылку на секцию «Интерактивный пример» Скопировано
Как пишется
Скопировать ссылку на секцию «Как пишется» Скопировано
В метод find ( ) необходимо передать аргументом функцию. Функция должна возвращать булевое значение true или false . find ( ) вернёт первый элемент, на котором переданная функция-колбэк вернула true .
Чтобы получить необходимый элемент, нужно определить условие поиска. В этом нам поможет функция-предикат. Предикат — это функция, которая возвращает булевое значение.
От результата выполнения функции зависит, вернёт ли find ( ) подходящий элемент:
- true — элемент проходит проверку.
- false — элемент не проходит проверку.
Опишем функцию-предикат is Odd , которая проверяет, является ли число нечётным: проверим остаток от деления на 2, и если остаток равен 1, то число нечётное:
Протестируем функцию на двух наборах данных. Первый набор состоит только из чётных значений. Второй массив включает в себя нечётные значения: 17, 19, 21.
Когда мы запустим метод find ( ) у первого массива, то нам вернётся undefined , так как ни одно значение не подходит под условие. В случае со вторым набором вернётся число 17 и только оно, потому что это число первое удовлетворило значению.
Функция, которую мы передаём в метод find , принимает три параметра:
- element — элемент массива в текущей итерации;
- index — индекс текущего элемента;
- arr — сам массив, который перебираем.
В коде is Odd мы не стали объявлять параметры index и arr , потому что не используем их.
Как понять
Скопировать ссылку на секцию «Как понять» Скопировано
Метод find ( ) возвращает элемент, который соответствует описанному в функции-предикате условию. Реализовать такую логику можно и через for , но метод find ( ) позволяет это сделать проще.
Ниже показан пример того, как решить задачу без find ( ) . Если мы уберём число 2 из массива, то функция будет возвращать undefined .
☝️ Обратите внимание: после того, как нужный элемент был найден, из функции find Two возвращается значение. Это ведёт к прерыванию цикла for . Мы сделали так, чтобы полностью симулировать работу метода find ( ) — он заканчивает работу сразу, как только нашёл нужный элемент. Это называется оптимизация. Не стоит тратить ресурс на то, что уже сделано и не пригодится в дальнейшем.
find ( ) позволит писать меньше кода и сделать его более понятным:
Методы .filter ( ) и find ( ) похожи. Главное отличие find ( ) от filter ( ) в том, что find ( ) возвращает первый подходящий элемент, а filter ( ) вернёт массив со всеми подходящими элементами.
Вариант реализации через .filter ( ) :
Читайте также
Функция как тип данных
С функцией можно работать, как с любым другим типом данных: сохранять в переменную, передавать, возвращать из функции.
Метод find()

Возвращает значение первого элемента в массиве, который соответствует условию в переданной функции.
Спецификация: ECMAScript 2015 (6th Edition, ECMA-262)
Синтаксис
Параметры
- currentValue – значение текущего элемента.
- index – индекс массива текущего элемента.
- arr – массив, к которому принадлежит текущий элемент (по которому осуществляется проход).
Возвращаемое значение
Возвращает значение первого элемента массива, для которого функция обратного вызова возвратит true , если ни один элемент не удовлетворяет условию в переданной функции – возвращает undefined .
Описание
- Если он находит элемент массива, для которого callback возвращает логическое значение true , find() возвращает значение этого элемента массива (и не проверяет оставшиеся значения).
- В противном случае find() возвращает undefined .
Примечание: Метод find() не вызывает функцию для элементов массива, которые не имеют значений.
Примечание: Метод find() не изменяет исходный массив.
Примеры
В следующем примере метод find используется для того, чтобы найти нечетное число в массиве:
VBA Excel. Метод Find объекта Range
Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.
Синтаксис метода Range.Find
Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.
В скобках перечислены параметры метода, среди них только What является обязательным.
Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.
Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.
Параметры метода Range.Find
- xlValues (-4163) – значения;
- xlComments (-4144) – примечания*;
- xlNotes (-4144) – примечания*;
- xlFormulas (-4123) – формулы.
- xlWhole (1) – полное совпадение;
- xlPart (2) – частичное совпадение.
- xlByRows (1) – поиск по строкам;
- xlByColumns (2) – поиск по столбцам.
- xlNext (1) – поиск вперед;
- xlPrevious (2) – поиск назад.
- False (0) – поиск без учета регистра (по умолчанию);
- True (1) – поиск с учетом регистра.
- False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
- True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes .
В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.
Знаки подстановки для поисковой фразы
Условные знаки в шаблоне поисковой фразы:
- ? – знак вопроса обозначает любой отдельный символ;
- * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
Простые примеры
При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:
- Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
- Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.
В примерах используются переменные:
- myPhrase – переменная для записи поисковой фразы;
- myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.
Пример 1
В этом примере мы присваиваем переменной myPhrase значение для поиска – «стакан» . Затем проводим поиск этой фразы в диапазоне «A1:L30» с присвоением результата поиска переменной myCell. Далее проверяем переменную myCell, не содержит ли она значение Nothing, и выводим соответствующие сообщения.
Ознакомьтесь с работой кода VBA в случаях, когда в диапазоне «A1:L30» есть ячейка со строкой, содержащей подстроку «стакан» , и когда такой ячейки нет.
Пример 2
Теперь посмотрим, как метод Range.Find отреагирует на поиск числа. В качестве диапазона поиска будем использовать первую строку активного листа Excel.
Несмотря на то, что мы присвоили переменной числовое значение, метод Range.Find найдет ячейку со значением и 526,15 , и 129526,15 , и 526,15254 . То есть, как и в предыдущем примере, поиск идет по подстроке.
Чтобы найти ячейку с точным соответствием значения поисковой фразе, используйте константу xlWhole параметра LookAt:
Аналогично используются и другие необязательные параметры. Количество «лишних» запятых перед необязательным параметром должно соответствовать количеству пропущенных компонентов, предусмотренных синтаксисом метода Range.Find, кроме случаев указания необязательного параметра по имени, например: LookIn:=xlValues . Тогда используется одна запятая, независимо от того, сколько компонентов пропущено.
Пример 3
Допустим, у нас есть многострочная база данных в Excel. В первой колонке находятся даты. Нам необходимо создать отчет за какой-то период. Найти номер начальной строки для обработки можно с помощью следующего кода:
Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.
58 комментариев для “VBA Excel. Метод Find объекта Range”
21/08/20
как задать поиск точного, но регистронезависимого значения ?
напр. дано
Иванов
диван
Иван
ивановский район
myPhrase = «иван»
машина должна найти 4-ое слово «Иван»
- LookAt:=1 – поиск полного совпадения искомой фразы со значением ячейки. Указывать обязательно, так как по умолчанию – поиск по частичному совпадению.
- MatchCase:=0 – поиск без учета регистра. Указывать не обязательно, так как используется по умолчанию.
а как выделить цветом и/или проинформировать о том что это третья ячейка ?
Заливка найденной ячейки зеленым цветом, просмотр ее адреса и номера строки:
А как задать поиск точного, но регистрозависимого значения, с поиском совпадения внутри, но с учетом последних двух символов, в данном примере это _5?
напр. дано
Иванов_123
диван_123
Иван_2_5
Иван_3
Иван_321_3
ивановский район_521
myPhrase = “Иван, где в конце _5”
машина должна найти 3-е слово “Иван_2_5”
Привет, Иван! Так как в начале вопроса написано «А как задать поиск точного, но регистрозависимого значения…», я в предпоследней строке (myPhrase = “иван, где в конце _5”) исправил строчную «и» на заглавную.
- * – звездочка обозначает любое количество любых символов.
- LookAt:=2 – поиск частичного совпадения искомой фразы со значением ячейки. Указывать не обязательно, так как используется по умолчанию.
- MatchCase:=1 – поиск с учетом регистра. Указывать обязательно, так как по умолчанию – поиск без учета регистра.
Привет Евгений! Благодарю! Пусть остается регистронезависимый.
И хотелось бы увидеть еще один пример, где слово Иван — есть переменная, но с окончанием «*_5»
Предположим переменная — Dim myIvan As Range
Как в этом случае будет выглядеть запись синтаксиса?
Если оставить регистронезависимый поиск по частичному совпадению, тогда параметры поиска можно не указывать:
Здравствуйте! Помогите пожалуйста написать код … При условии, что есть диапазон со значениями дат, а нужно произвольную ячейку с датой сравнить с этим диапазоном. Если не находит совпадений то оставить эту дату в этой ячейке. Спасибо заранее
Здравствуйте. Если в искомом диапазоне есть два и > искомых значения и все эти значения нужно вывести, например, в MsgBox или debug.print. С помощью цикла задача выполняется достаточно легко. А как это сделать с помощью Find, ведь он ищет только первое значение, т.е. как-то нужно включить опцию «найти все» ?
Добрый день, Вадим!
Для продолжения поиска используйте метод Range.FindNext.
Как задать поиск после указанной строки?
Привет, Кирилл!
Для указания строки используйте параметр After . Например, после 10 строки (то есть с 11-й):
Здравствуйте.
Подскажите, а откуда информация что .Find работает быстрее циклов VBA?
Добрый день, Антон!
Это была ошибка. Тест на моем компьютере показал, что цикл For Each… Next находит значение в последней ячейке первого столбца за 1,53 сек., а метод Find – за 2,20 сек. Спасибо за обратную связь!
Здравствуйте, Евгений. Имеется таблица. В левой колонке — цифры(отфильтрованы в порядке возрастания). Задача-по значению первой колонке найти остальные параметры. Точного совпадения нет. Написать поиск в VBA.(что-то типа ИНДЕКС(ПОИСКПОЗ) или ВПР в Excel). Поиск с помощью FIND-ничего не дает. Требуется только точное совпадение. Поиск в цикле-та же песня. Подскажите пожалуйста как решить этот вопрос. Cпасибо.
Здравствуйте, Михаил!
Возможно, вам подойдет метод WorksheetFunction.Match (поиск позиции).
Помогите плизз. Есть 3 столбца. Надо оставить «Дебитор доставки» остальные удалить. Создаю 2 запроса одинаковых. С 3 столбцом все нормально а вот 1-2 удаляются вместе. И как задать в одном запросе удаление дебитора и юр. адрес клиента
( Set A = .Find(What:=(«Юр. адрес клиента»,»Дебитор»), LookIn:=xlValues, lookat:=xlPart) ) — так не работает.
Дебитор
Дебитор доставки
Юр. адрес клиента
Сделал. Сначала переименовал, а потом удалил.
Добрый день. Очень интересная статья
Подскажите пожалуйста, как добиться следующего цикла.
Например: надо найти ячейки со словом «ЖКХ» и «квартплата» в столбце А и проставить это наименование в столбец В.
А1 оплата ЖКХ
А2 квартплата за Иванова
А3 квартплата за ЖКХ
Соответственно в столбце В должно быть
В1 ЖКХ
В2 квартплата
В3 квартплата ЖКХ (или хотябы по первому поисковому слову ЖКХ)
Заранее спасибо.
Здравствуйте, Сергей!
Для поиска совпадений в количестве более одного вместе с методом Range.Find для продолжения поиска используется метод Range.FindNext:
В этом примере слово «ЖКХ» заменит слово «квартплата» в ячейке справа, если они оба будут найдены в одной ячейке слева.
Доброго времени суток, Евгений! Подскажите, пожалуйста, есть файл в нем надо найти скрытое слово, то есть мы не знаем что ищем. Как в таком случае искользовать VBA Find function? Спасибо!
Добрый день, Ainur!
Если искомое слово (или его часть) неизвестно, то найти его с помощью метода Find невозможно.
Евгений, огромное спасибо за помощь
Здравствуйте!
Спасибо за статью.
Может, кто знает: как найти ячейку по значению, если в ней формула? И в VBA, и в таблицах любопытно.
Добрый день!
Значения ищутся по умолчанию, не зависимо от того, есть ли в ячейке формула или нет. А вот чтобы найти формулу, необходимо указать явно, что ищется формула:
Спасибо.
Что нужно указать, чтобы найти ячейку, в которой формула, но ищется которая по значению?
Нужно проверить наличие формулы:
Т.е. .Find в этом случае не работает ∎
Ждал такого ответа.
Спасибо и примите восхищение поддержкой.
Евгений, здравствуйте! Огромное спасибо за статью. Подскажите пожалуйста, подойдет ли Find Range для решения следующей задачи:
Имеется некоторая база с неким продуктом, у каждого продукта свой каталожный номер, каталожные номера записаны в столбец, а в строках содержится остальная информация по товару (цена, производитель, срок гарантии, импортер и т.д.), можно ли использовать Find для автоматического заполнения строки после ввода каталожного номера в ячейку? Если совсем обывательским языком говорить, то программа должна делать следующее: введенное в ячейку значение сравнивает со всеми значениями ячеек в этом столбце, которые расположены выше изменяемой ячейки. Если каталожный номер (читай значение) совпадает с уже встречающимся выше каталожным номером, то программа автоматически заполняет строку значениями, которые соответствуют данному кат. номеру, в ином случае, когда совпадающего значения не найдено — оставляет строку пустой. Спасибо за ваше время и еще раз за вашу статью!
Здравствуйте, Дмитрий!
Вы можете использовать метод Range.Find для решения своей задачи. А если столбец с каталожными номерами является первым в таблице, вы также можете использовать метод WorksheetFunction.VLookup.
Добрый день.
Подскажите, как присвоить из таблицы нужное мне значение (Цена без НДС) ?
Прошу прощения, на работе нет программиста, приходится самому учиться(
Пример ниже не правильный.