voidex 168 / 6 / 3 Регистрация: 05.07.2013 Сообщений: 62 |
||||
1 |
||||
Поиск в ячейках по части слова25.12.2013, 10:04. Показов 8368. Ответов 2 Метки нет (Все метки)
Всем доброго времени суток
Как сделать так, чтобы можно было ввести(в inputbox) не полное содержание ячейки, которое надо обработать (например: желтый дом), а одно слово «желтый» или «дом» или если возможно(так для общего развития
0 |
Заблокирован |
||||
25.12.2013, 10:30 |
2 |
|||
Метод Range.Find с параметром LookAt:=xlPart
или InStr заюзать — самое доступное средство…
1 |
168 / 6 / 3 Регистрация: 05.07.2013 Сообщений: 62 |
|
25.12.2013, 10:53 [ТС] |
3 |
спасибо! instr то что нужно
0 |
Lina1515 Пользователь Сообщений: 15 |
Всем доброго времени суток! Может кто-то уже сталкивался? Заранее спасибо за помощь! |
Kuzmich Пользователь Сообщений: 7998 |
#2 06.09.2017 21:23:36
Использовать Find |
||
Kuzmich Пользователь Сообщений: 7998 |
#3 06.09.2017 21:37:33
Макрос, запускать при активном листе Tabelle1, значения подтягиваются в столбец В. В ячейке с Potato уберите пробел в конце
|
||||
Nordheim Пользователь Сообщений: 3154 |
#4 06.09.2017 21:47:28
«Все гениальное просто, а все простое гениально!!!» |
||
Lina1515 Пользователь Сообщений: 15 |
#5 06.09.2017 21:51:09 Спасибо большое! |
Sub Макрос()
Dim shSrc As Worksheet, shRes As Worksheet
Dim A(), res()
Dim lr As Long, i As Long
‘1. Присваиваем имена листам, с которыми надо работать. Затем
‘ в коде можно удобно обращаться к этим листам.
Set shRes = Worksheets(«Tabelle1»)
Set shSrc = Worksheets(«Tabelle2»)
‘2. Копируем данные из столбца A в массив. Это нужно для ускорения макроса,
‘ т.к. с массивом быстрее работать, чем с эксель-ячейками.
‘ Поиск последней строки. End — не работает со скрытыми строками.
lr = shRes.Cells(shRes.Rows.Count, «A»).End(xlUp).row
A() = shRes.Range(«A2:A» & lr).value
‘3. Создание ячеек в массиве-результате. Сначала в него запишутся данные,
‘ а затем массив будет вставлен на лист. Это тоже нужно для ускорения макроса.
ReDim res(1 To UBound(A, 1), 1 To 1)
‘4. Включение перехватчика ошибок. Ошибка будет происходить, если на листе-источнике
‘ нет искомого текста.
On Error Resume Next
‘5. Поиск и запись результата в массив «res».
For i = 1 To UBound(A, 1)
res(i, 1) = WorksheetFunction.VLookup(«*/» & A(i, 1), shSrc.Columns(«B:D»), 3, 0)
Next i
‘6. Отключение перехватчика ошибок.
On Error GoTo 0
‘7. Вставка результата в эксель.
shRes.Range(«C2»).Resize(UBound(res, 1)).value = res()
End Sub
[свернуть]
Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.
Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.
Синтаксис метода Range.Find
Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat) |
Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.
В скобках перечислены параметры метода, среди них только What является обязательным.
Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.
Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.
Параметры метода Range.Find
Наименование | Описание |
---|---|
Обязательный параметр | |
What | Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра — Variant. |
Необязательные параметры | |
After | Ячейка, после которой следует начать поиск. |
LookIn | Уточняет область поиска. Список констант xlFindLookIn:
|
LookAt | Поиск частичного или полного совпадения. Список констант xlLookAt:
|
SearchOrder | Определяет способ поиска. Список констант xlSearchOrder:
|
SearchDirection | Определяет направление поиска. Список констант xlSearchDirection:
|
MatchCase | Определяет учет регистра:
|
MatchByte | Условия поиска при использовании двухбайтовых кодировок:
|
SearchFormat | Формат поиска – используется вместе со свойством Application.FindFormat. |
* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments
и MsgBox xlNotes
.
В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.
Знаки подстановки для поисковой фразы
Условные знаки в шаблоне поисковой фразы:
- ? – знак вопроса обозначает любой отдельный символ;
- * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
- ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).
Простые примеры
При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:
- Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
- Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.
В примерах используются переменные:
- myPhrase – переменная для записи поисковой фразы;
- myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.
Пример 1
Sub primer1() Dim myPhrase As Variant, myCell As Range myPhrase = «стакан» Set myCell = Range(«A1:L30»).Find(myPhrase) If Not myCell Is Nothing Then MsgBox «Значение найденной ячейки: « & myCell MsgBox «Строка найденной ячейки: « & myCell.Row MsgBox «Столбец найденной ячейки: « & myCell.Column MsgBox «Адрес найденной ячейки: « & myCell.Address Else MsgBox «Искомая фраза не найдена» End If End Sub |
В этом примере мы присваиваем переменной myPhrase значение для поиска – "стакан"
. Затем проводим поиск этой фразы в диапазоне "A1:L30"
с присвоением результата поиска переменной myCell. Далее проверяем переменную myCell, не содержит ли она значение Nothing, и выводим соответствующие сообщения.
Ознакомьтесь с работой кода VBA в случаях, когда в диапазоне "A1:L30"
есть ячейка со строкой, содержащей подстроку "стакан"
, и когда такой ячейки нет.
Пример 2
Теперь посмотрим, как метод Range.Find отреагирует на поиск числа. В качестве диапазона поиска будем использовать первую строку активного листа Excel.
Sub primer2() Dim myPhrase As Variant, myCell As Range myPhrase = 526.15 Set myCell = Rows(1).Find(myPhrase) If Not myCell Is Nothing Then MsgBox «Значение найденной ячейки: « & myCell Else: MsgBox «Искомая фраза не найдена» End If End Sub |
Несмотря на то, что мы присвоили переменной числовое значение, метод Range.Find найдет ячейку со значением и 526,15
, и 129526,15
, и 526,15254
. То есть, как и в предыдущем примере, поиск идет по подстроке.
Чтобы найти ячейку с точным соответствием значения поисковой фразе, используйте константу xlWhole параметра LookAt:
Set myCell = Rows(1).Find(myPhrase, , , xlWhole) |
Аналогично используются и другие необязательные параметры. Количество «лишних» запятых перед необязательным параметром должно соответствовать количеству пропущенных компонентов, предусмотренных синтаксисом метода Range.Find, кроме случаев указания необязательного параметра по имени, например: LookIn:=xlValues
. Тогда используется одна запятая, независимо от того, сколько компонентов пропущено.
Пример 3
Допустим, у нас есть многострочная база данных в Excel. В первой колонке находятся даты. Нам необходимо создать отчет за какой-то период. Найти номер начальной строки для обработки можно с помощью следующего кода:
Sub primer3() Dim myPhrase As Variant, myCell As Range myPhrase = «01.02.2019» myPhrase = CDate(myPhrase) Set myCell = Range(«A:A»).Find(myPhrase) If Not myCell Is Nothing Then MsgBox «Номер начальной строки: « & myCell.Row Else: MsgBox «Даты « & myPhrase & » в таблице нет» End If End Sub |
Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.
Just change LookAt:=xlWhole
to LookAt:=xlPart
Docs: Range.Find Method (Excel)
You can also use an ampersand (&
) to tidy up the returned result, it concatenates strings:
"Col: " & rFind.Column & ", Row: " & rFind.Row
' For example, gives the string "Col: 1, Row: 1" if found in A1
You say you want to search in «every column in a specific row» but you’re looking in «the first 100 rows in a specific column»?! Not sure whether that’s a typo or if your code is wrong. Either way, you could use the Rows
or Columns
objects. These should be used with fully qualifying your range, i.e. saying where it is.
ThisWorkbook.Sheets("Sheet1").Rows(1) ' Range of entire first row
ThisWorkbook.Sheets("Sheet1").Columns(1) ' Range of entire first column
ThisWorkbook.Sheets("Sheet1").Columns("A") ' Equivalent, range of entire first column
Rewrite:
Dim rFind As Range
With ThisWorkbook.Sheets("Sheet1").Columns("D")
Set rFind = .Find(What:=TextBox13.Value, LookAt:=xlPart, MatchCase:=False, SearchFormat:=False)
If Not rFind Is Nothing Then
MsgBox "Col: " & rFind.Column & ", Row: " & rFind.Row
End If
End With