В эксель функция поиск: ПОИСК, ПОИСКБ (функции ПОИСК, ПОИСКБ)
Содержание
Поиск на листе Excel, примеры использования Find на VBA
Поиск какого-либо значения в ячейках Excel довольно часто встречающаяся задача при программировании какого-либо макроса. Решить ее можно разными способами. Однако, в разных ситуациях использование того или иного способа может быть не оправданным. В данной статье я рассмотрю 2 наиболее распространенных способа.
Поиск перебором значений
Довольно простой в реализации способ. Например, найти в колонке «A» ячейку, содержащую «123» можно примерно так:
Sheets("Данные").Select For y = 1 To Cells.SpecialCells(xlLastCell).Row If Cells(y, 1) = "123" Then Exit For End If Next y MsgBox "Нашел в строке: " + CStr(y)
Минусами этого так сказать «классического» способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т. п.
Поиск функцией Find
Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую «123» достаточно такого кода:
Sheets("Данные").Select Set fcell = Columns("A:A").Find("123") If Not fcell Is Nothing Then MsgBox "Нашел в строке: " + CStr(fcell.Row) End If
Вкратце опишу что делают строчки данного кода:
1-я строка: Выбираем в книге лист «Данные»;
2-я строка: Осуществляем поиск значения «123» в колонке «A», результат поиска будет в fcell;
3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае — будет пустой, т.е. Nothing.
Полностью синтаксис оператора поиска выглядит так:
Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
What — Строка с текстом, который ищем или любой другой тип данных Excel
After — Ячейка, после которой начать поиск. Обратите внимание, что это должна быть именно единичная ячейка, а не диапазон. Поиск начинается после этой ячейки, а не с нее. Поиск в этой ячейке произойдет только когда весь диапазон будет просмотрен и поиск начнется с начала диапазона и до этой ячейки включительно.
LookIn — Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).
LookAt — Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).
SearchOrder — Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)
SearchDirection — Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)
MatchCase — Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)
MatchByte — Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)
SearchFormat — Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.
Чтобы продолжить поиск, можно использовать FindNext (искать «далее») или FindPrevious (искать «назад»).
Примеры поиска функцией Find
Пример 1: Найти в диапазоне «A1:A50» все ячейки с текстом «asd» и поменять их все на «qwe»
With Worksheets(1).Range("A1:A50") Set c = .Find("asd", LookIn:=xlValues) Do While Not c Is Nothing c.Value = "qwe" Set c = .FindNext(c) Loop End With
Обратите внимание: Когда поиск достигнет конца диапазона, функция продолжит искать с начала диапазона. Таким образом, если значение найденной ячейки не менять, то приведенный выше пример зациклится в бесконечном цикле. Поэтому, чтобы этого избежать (зацикливания), можно сделать следующим образом:
Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.
With Worksheets(1).Range("A1:A50") Set c = .Find("asd", lookin:=xlValues) If Not c Is Nothing Then firstResult = c.Address Do c.Font.Bold = True Set c = .FindNext(c) If c Is Nothing Then Exit Do Loop While c.Address <> firstResult End If End With
В ниже следующем примере используется другой вариант продолжения поиска — с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.
Пример 3: Продолжение поиска с использованием Find с параметром After.
With Worksheets(1).Range("A1:A50") Set c = .Find("asd", lookin:=xlValues) If Not c Is Nothing Then firstResult = c.Address Do c.Font.Bold = True Set c = .Find("asd", After:=c, lookin:=xlValues) If c Is Nothing Then Exit Do Loop While c.Address <> firstResult End If End With
Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.
Пример 4: Найти все ячейки с шрифтом «курсив» и поменять их формат на обычный (не «курсив»)
lLastRow = Cells.SpecialCells(xlLastCell).Row lLastCol = Cells.SpecialCells(xlLastCell).Column Application.FindFormat.Font.Italic = True With Worksheets(1).Range(Cells(1, 1), Cells(lLastRow, lLastCol)) Set c = .Find("", SearchFormat:=True) Do While Not c Is Nothing c.Font.Italic = False Set c = . Find("", After:=c, SearchFormat:=True) Loop End With
Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)
Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.
Хочу обратить внимание на то, что в этом примере я не стал использовать «защиту от зацикливания», как в Примерах 2 и 3, т.к. шрифт меняется и после «прохождения» по всем ячейкам, больше не останется ни одной ячейки с курсивом.
Свойство FindFormat можно задавать разными способами, например, так:
With Application.FindFormat.Font .Name = "Arial" .FontStyle = "Regular" .Size = 10 End With
Поиск последней заполненной ячейки с помощью Find
Следующий пример — применение функции Find для поиска последней ячейки с заполненными данными. Использованные в Примере 4 SpecialCells находит последнюю ячейку даже если она не содержит ничего, но отформатирована или в ней раньше были данные, но были удалены.
Пример 5: Найти последнюю колонку и столбец, заполненные данными
Set c = Worksheets(1).UsedRange.Find("*", SearchDirection:=xlPrevious) If Not c Is Nothing Then lLastRow = c.Row: lLastCol = c.Column Else lLastRow = 1: lLastCol = 1 End If MsgBox "lLastRow=" & lLastRow & " lLastCol=" & lLastCol
В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т. ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.
Поиск по шаблону (маске)
При поиске можно так же использовать шаблоны, чтобы найти текст по маске, следующий пример это демонстрирует.
Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.
With Worksheets(1).Cells Set c = .Find("т??т*", LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then firstResult = c.Address Do c.Font.Color = RGB(255, 0, 0) Set c = .FindNext(c) If c Is Nothing Then Exit Do Loop While c.Address <> firstResult End If End With
Для поиска функцией Find по маске (шаблону) можно применять символы:
* — для обозначения любого количества любых символов;
? — для обозначения одного любого символа;
~ — для обозначения символов *, ? и ~. (т.е. чтобы искать в тексте вопросительный знак, нужно написать ~?, чтобы искать именно звездочку (*), нужно написать ~* и наконец, чтобы найти в тексте тильду, необходимо написать ~~)
Поиск в скрытых строках и столбцах
Для поиска в скрытых ячейках нужно учитывать лишь один нюанс: поиск нужно осуществлять в формулах, а не в значениях, т.е. нужно использовать LookIn:=xlFormulas
Поиск даты с помощью Find
Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:
- Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
- В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas
Приведу несколько примеров поиска даты.
Пример 7: Найти текущую дату на листе независимо от формата отображения даты.
d = Date Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole) If Not c Is Nothing Then MsgBox "Нашел" Else MsgBox "Не нашел" End If
Пример 8: Найти 1 марта 2018 г.
d = #3/1/2018# Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole) If Not c Is Nothing Then MsgBox "Нашел" Else MsgBox "Не нашел" End If
Искать часть даты — сложнее. Например, чтобы найти все ячейки, где месяц «март», недостаточно искать «03» или «3». Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел — это выбрать формат в котором месяц прописью для ячеек с датами и искать слово «март» в xlValues.
Тем не менее, можно найти, например, 1 марта независимо от года.
Пример 9: Найти 1 марта любого года.
d = #3/1/1900# Set c = Cells. Find(Format(d, "m\/d\/"), LookIn:=xlFormulas, LookAt:=xlPart) If Not c Is Nothing Then MsgBox "Нашел" Else MsgBox "Не нашел" End If
— Excel
MS Office 2007: Microsoft Excel
Поиск решения двухпараметрической задачи в Excel
В предыдущих занятиях мы рассматривали возможности обработки и визуализации однопараметрической зависимости (функция зависит только от одной переменной). В реальности, такие простые зависимости встречаются достаточно редко. Чаще приходится сталкиваться с многопараметрическими функциями. Как обрабатывать такие зависимости и, каким образом их визуализировать, рассмотрим на примере двухпараметрической задачи.
Пусть был проведен эксперимент, например, измерили зависимость какого-то параметра от температуры и давления. Средняя температура была равна 100°С. Шаг изменения — 50°С. Среднее давление — 2 атм. Шаг изменения — 1 атм. Такая система будет описываться зависимостью
Z = f{X,Y),
являющейся поверхностью, которую часто показывают в виде, подобной контурной карте (Рис. 115).
Чтобы найти эту зависимость для нашего случая, воспользуемся заготовкой занятий 4 и 6. Для этого необходимо открыть сохраненный файл, и перейти на лист с данными. Выделив ярлык Листа правой кнопкой мыши, выбрать команду Переместить/скопировать.
В открывающемся диалоговом окне можно выбрать:
- место перемещения (копирования) нашего листа (в текущую книгу или новую). Выберите название текущей книги;
- перед каким листом мы хотим поместить текущий лист или его копию. Выберите «(переместить в конец)».
Не забудьте поставить галочку Создать копию, в противном случае лист просто переместиться в конец книги. Закончите клавишей ОК.
По умолчанию Excel создает копию с именем текущего листа, добавляя в конце в скобках номер копии. Для удобства переименуем его. Для этого, щелкнув правой кнопкой мыши по ярлыку листа, выберите команду Переименовать, введите новое имя, например, «Эксперимент_2» и завершите клавишей Enter.
Сначала перестроим таблицу исходных данных, как показано на Рис. 116.
Приведите таблицу эксперимента к виду, показанному на Рис. 116.
Для добавления столбца необходимо выделить столбец G, щелкнув по заголовку этого столбца, и выполнить команду Главная-Ячейки-Вставить-Вставить столбцы на лист.
Внесите необходимые изменения в таблицу. Для удаления строки необходимо ее выделить, щелкнув по заголовку этой строки, и выполнить команду Главная-Ячейки-Удалить-Удалить строки с листа.
Напомним, что заголовки столбцов Температура и Давление должны вводиться по формулам, чтобы сделать заготовку более универсальной. Заполним теперь данные таблицы Эксперимент.
Координаты точек 1-9 можно вычислить по следующим формулам:
При вводе формул не забывайте делать постоянными ссылки на Хср, Ycp и Шаг, чтобы использовать возможность копирования.
Значения Yэкспер мы должны взять из эксперимента (рис. 117). Yрасчет должны вычисляться по формуле:
Прежде, чем вводить формулу для Ypaсчет, необходимо модифицировать таблицу коэффициентов согласно Рис. 118, введя начальные значения коэффициентов 1.
Для подбора функции воспользуемся методом минимизации суммы квадратов разности экспериментальных (Yэкспер) и расчетных (Yрасчет) данных, который мы рассматривали в прошлом занятии.
Формулы расчета квадрата разности и формула расчета критерия Пирсона у нас на листе уже есть. Теперь достаточно поправить в них ссылки и выполнить.
Поиск решения выполняется, также как и в случае однопараметрической функции, но поскольку у нас зависимость более сложная, необходимо в диалоговом окне Поиск решения открыть подокно Параметры и установить следующие опции:
- Автоматическое масштабирование;
- разности — Центральные.
После этого в окне Поиск решения необходимо поправить ссылки на подбираемые ячейки (коэффициенты) и выбрать Найти решение. Если удовлетворительной точности не достигнуто с первой попытки, операцию поиска решения можно повторить.
Для того чтобы построить поверхность необходимо построить на листе матрицу данных (Рис. 119).
На этом же листе пониже введите заголовок таблицы. В ячейке Al 6 введите X/Y.
Далее необходимо заполнить в матрице данных диапазоны температур и давлений, при которых проводился наш эксперимент. Для этого в ячейки А17 и В16 вводятся минимальные значения температуры и давления соответственно. Отчитываются 11 ячеек вниз по столбцу А и вводится максимальное значение температуры (равное 150). Выделив интервал между минимальным и максимальным значениями, выбирается команда Главная-Редактирование – Заполнить — Прогрессия
В открывшемся окне (рис. 120) все оставляем без изменения и нажимаем ОК. Наш интервал температур заполнится значениями от минимального до максимального значений с определенным шагом. Те же самые действия необходимо выполнить в строке 16 для ввода значений давления, при которых проводился эксперимент.
Осталось ввести в матрицу данных только значения функции Ypacчет. Чтобы не вводить функцию снова, скопируем любую набранную формулу из столбца Yрасчет таблицы Эксперимент. Далее, выделив ячейку B17, в окно ввода формул вставляем скопированную формулу. В этой формуле ссылки на температуру и давление остались прикрепленными к столбцам таблицы Эксперимент, их необходимо перенести или изменить соответственно данным матрицы. Для этого в строке ввода формул ставим курсор мыши на формулу в любом месте и получаем разноцветные ссылки на элементы формулы в таблице Эксперимент. Все ссылки на температуру (а их три) аккуратно переносим в первую ячейку колонки температур в матрице, а ссылки на давление (тоже три) переносим на строку в первую ячейку в матрице данных.
Поскольку значения температур изменяются по колонке, необходимо все ссылки на температуру сделать смешанными, т.е. закрепить колонку знаком доллара ($А17). Изменение давления происходит по строке, значит, закрепляем строку (B$16). 2
Данные для построения поверхности готовы, осталось их только построить на диаграмме. Выделяем область матрицы данных с формулами, не захватывая значения температур и давления. Далее воспользуемся «Мастером диаграмм», выбрав тип диаграммы «Поверхность». Окончательный вид диаграммы будет примерно таким, как показано на Рис. 120.
Функция ПОИСКА Excel
Главная » Встроенные функции Excel » Текстовые функции Excel » Функция поиска Excel
Связанная функция:
Функция НАЙТИ
Описание функции указанный символ или подстрока в предоставленной текстовой строке.
Функция не чувствительна к регистру. Если вы хотите выполнить поиск с учетом регистра, используйте вместо этого функцию Excel Find.
Синтаксис функции поиска:
ПОИСК( текст_поиска, внутри_текста, [начальный_номер] )
Где аргументы функции:
текст_поиска | — | Символ или подстрока, которую вы хотите найти. |
внутри_текста | — | Текстовая строка для поиска. |
[start_num] | — | Необязательный аргумент, указывающий позицию в строке inside_text, с которой должен начинаться поиск. Если опущено, принимает значение по умолчанию 1 (т. е. поиск начинается с начала строки внутри_текста) |
Подстановочные знаки
Вы также можете использовать следующие подстановочные знаки в аргументе search_text:
? — соответствует любому одиночному символу
* — соответствует любой последовательности символов
, например. условие «A*e» будет соответствовать любой подстроке, начинающейся с «A» и заканчивающейся на «e».
Если предоставленный текст_искания найден, функция поиска возвращает число, представляющее его позицию в пределах_текста. Если предоставленный search_text равен не найдено , функция возвращает Excel #ЗНАЧ! ошибка.
Примеры функции поиска
В столбце B следующей электронной таблицы показаны примеры функции поиска Excel, используемой для поиска различных символов в текстовой строке «Исходный текст».
Формулы:
| Результаты:
|
Примечание. В примере. чувствительный, значения search_text в верхнем и нижнем регистре, «T» и «t», возвращают один и тот же результат (см. ячейки B1 и B2).
Дополнительные сведения и примеры функции поиска Excel см. на веб-сайте Microsoft Office.
Ошибка функции поиска
Если вы получаете сообщение об ошибке функции поиска Excel, скорее всего, это #ЗНАЧ! ошибка:
Общая ошибка
#ЗНАЧ! | — | Происходит, если:
|
Вернуться на страницу текстовых функций Excel
Вернуться на страницу Список всех встроенных функций Excel чувствителен к возврату позиции. «C» и «c» имеют разные значения, если вы используете метод FIND для получения позиции текста в исходной строке. Функция ПОИСК нечувствительна к регистру. Вы не можете использовать подстановочные знаки «*» и «?» в функции НАЙТИ.
Предположим, у нас есть предложение «У Excel много функций». Мы хотим найти позицию «множество» в этом предложении. Позиция означает, с какого числа в этом предложении начинается множество.
Для этого созданы функции ПОИСК и НАЙТИ в Excel. Обе функции принимают три аргумента; два уже должно быть ясно. См. почти одинаковый синтаксис НАЙТИ и ПОИСК:
НАЙТИ(Текст_для_поиска, Исходный_текст, [начальный_номер])
SEARCH(find_text,within_text,[start_num])
- Текст для поиска – «Много» в нашем примере предложения.
- Source_Text – Предложение, которое мы использовали. Естественно, это может быть ссылка на ячейку.
- Третий необязательный параметр — начальный номер . Он указывает, с какой позиции вы хотите начать поиск в исходном тексте. Например, мы хотим найти «с» в приведенном выше предложении из числа 6. Я покажу это на примере, чтобы было понятно.
- Если find_text не найден, #VALUE! Произошла ошибка, из-за которой вы можете управляться с помощью IFERROR.
- 1.
Разница между ПОИСК и НАЙТИ в Excel - 2.
Пример функции НАЙТИ - 3.
Функция Excel НАЙТИ является примером с учетом регистра - 4.
Использование функции НАЙТИ в тексте ячейки - 5.
Пример аргумента Start_Num в функции НАЙТИ - 6.
Обработка ошибки, если текст не найден функцией ЕСЛИОШИБКА - 7.
Функция ПОИСК Excel - 8.
Использование подстановочных знаков в функции ПОИСК
Разница между ПОИСК и НАЙТИ в Excel
Есть два отличия:
- Функция НАЙТИ чувствительна к регистру. «C» и «c» имеют разные значения, если вы используете функцию FIND для получения позиции текста в исходной строке.
- С другой стороны, функция ПОИСК нечувствительна к регистру.
- Вы не можете использовать подстановочные знаки «*» и «?» в функции НАЙТИ.
- Функция ПОИСК позволяет использовать подстановочные знаки.
См. следующий раздел с примерами для изучения функций и понимания различий.
Пример функции НАЙТИ
Позвольте мне начать с простого примера использования предложения и поиска позиции слова в этом предложении. Формула НАЙТИ применяется в ячейке D11 следующим образом:
=НАЙТИ(«Имя»,»Меня зовут Бен»)
Результат:
Слово «Имя» начинается с позиции 4 в данном предложении.
Знаете ли вы, что в Excel есть функции FINDB и SEARCHB, которые работают с языками, использующими набор двухбайтовых символов (DBCS). НАЙТИ/ПОИСК предназначен для набора однобайтовых символов (SBCS) – каждый символ считается равным 1.
Пример функции ПОИСК в Excel с учетом регистра
Теперь давайте рассмотрим пример функции ПОИСК с учетом регистра. Используя то же предложение, что и выше, за исключением того, что мы найдем местоположение «имя»:
.
=НАЙТИ(«имя»,»Меня зовут Бен»)
Видите ли, #ЗНАЧ! Произошла ошибка , когда мы изменили регистр «N» на «n» в функции НАЙТИ.
Использование функции НАЙТИ в тексте ячейки
В этом примере я буду использовать функцию НАЙТИ для поиска позиции буквы в ячейке A7. Столбец A содержит имена сотрудников только для демонстрации:
Формула НАЙТИ:
= НАЙТИ («ч», A7)
Результирующий лист:
Вы можете видеть, что положение «h» равно 2 в тексте A1 = Shabee
Пример аргумента Start_Num в функции FIND
2 текст в ячейке B3 ищется.
B3 содержит следующий текст:
«ИТ-эксперт / Excel / Powerpoint / Word»
Мы искали ‘p’, который встречается в позициях 6 и 26. Однако аргумент start_num указан, как показано ниже, и посмотрите результат:
= FIND(B10, B3,8)
Результат:
Понимаете, он вернул 26, потому что НАЙТИ начал поиск с позиции 8.
Обработка ошибки, если текст не найден функцией ЕСЛИОШИБКА
сообщение об ошибке, если данный поисковый термин не найден, вы можете использовать функцию ЕСЛИОШИБКА с НАЙТИ для отображения описательного сообщения, например. «Поисковое слово не найдено».
См. пример ниже, где пользователь может ввести любой текст в ячейку B10. Введенный текст будет искаться в ячейке B3. Я использовал комбинацию ЕСЛИОШИБКА/НАЙТИ и ввел различные тексты, в том числе несуществующий. Посмотрите на формулу и результаты:
Формула:
=ЕСЛИОШИБКА(НАЙТИ(B10,B3), «Заданный текст не найден!»)
Результаты. Вместо того, чтобы показывать ошибку, «Данный текст не найден!» отображается сообщение.
Примечание. Если вы скопируете/вставите эту формулу, внимательно проверьте двойные кавычки, иначе может возникнуть ошибка имени.
Функция ПОИСК Excel
Все приведенные выше примеры будут работать одинаково, если вы просто замените слово «НАЙТИ» на «ПОИСК», за исключением примера с учетом регистра. Итак, я не буду снова показывать все эти примеры для функции ПОИСК, а продолжу, показав, чем она отличается от функции НАЙТИ.
Итак, давайте сначала посмотрим на нечувствительность к регистру функции ПОИСК.
Для этого я использую тот же лист, что и в приведенном выше примере. В формуле ПОИСК я указал ячейку B8, содержащую текст «Счета». Посмотрите на результаты поиска различных текстов по этой формуле:
Формула ПОИСК:
=ПОИСК(B10,B8)
Результаты:
3 ” и возвращается позиция 1,
«T» не используется в «Учетных записях», но ПОИСК вернул позицию «t».