Vba excel поиск по части слова

voidex

168 / 6 / 3

Регистрация: 05.07.2013

Сообщений: 62

1

Поиск в ячейках по части слова

25.12.2013, 10:04. Показов 8368. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем доброго времени суток
есть макрос(точнее его часть которую я бы хотел изменить

Visual Basic
1
2
3
4
5
 
pomenat = InputBox("введите слово")
 
For Z = Z To LastRow1
    If UCase(Cells(Z, c).Text) = UCase(pomenat) And.....

Как сделать так, чтобы можно было ввести(в inputbox) не полное содержание ячейки, которое надо обработать (например: желтый дом), а одно слово «желтый» или «дом» или если возможно(так для общего развития) вообще «жел»(если такое возможно)



0



Апострофф

Заблокирован

25.12.2013, 10:30

2

Метод Range.Find с параметром LookAt:=xlPart
или (тоже из справки)

Visual Basic
1
2
3
4
5
6
7
For Each c In [A1:C5]
'    If c.Font.Name Like "Cour*" Then
'        c.Font.Name = "Times New Roman"
    If c Like "*" & pomenat & "*" Then
        c.Font.Name = "Times New Roman"
    End If
Next

или InStr заюзать — самое доступное средство…



1



168 / 6 / 3

Регистрация: 05.07.2013

Сообщений: 62

25.12.2013, 10:53

 [ТС]

3

спасибо! instr то что нужно



0



 

Lina1515

Пользователь

Сообщений: 15
Регистрация: 21.08.2017

Всем доброго времени суток!
Я недавно начала работать в VBA, поэтому  у меня возник маленький вопрос. Я его оформила в Excel. Сама задача  очень простая, если её решать в Excel. Я бы использовала  =VLOOKUP(«*»&A2&»*»;Sheet2!B:D;3;0). Но я бы хотела это  автоматизировать в макросе. Я пыталась сделать через Formula.R1C1 и  Index Match, но насколько я поняла RC не может искать часть текста из  ячейки. Есть ли какие-нибудь другие варианты решения этого вопроса?

Может кто-то уже сталкивался?

Заранее спасибо за помощь!

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#2

06.09.2017 21:23:36

Цитата
Есть ли какие-нибудь другие варианты решения этого вопроса?  

Использовать Find

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#3

06.09.2017 21:37:33

Цитата
искать часть текста из  ячейки

Макрос, запускать при активном листе Tabelle1, значения подтягиваются в столбец В. В ячейке с Potato уберите пробел в конце

Код
Sub iType()
Dim i As Long
Dim iLastRow As Long
Dim FoundCell As Range
   iLastRow = Cells(Rows.Count, "C").End(xlUp).Row
   Range("B2:B" & iLastRow).ClearContents
 With Worksheets("Tabelle2")
  For i = 2 To iLastRow
    Set FoundCell = .Columns(2).Find(Cells(i, "A"), , xlValues, xlPart)
     If Not FoundCell Is Nothing Then
       Cells(i, "B") = .Cells(FoundCell.Row, "D")
     End If
  Next
 End With
End Sub
 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#4

06.09.2017 21:47:28

Код
Sub test()
Dim i&, cell As Range
With Sheets("Tabelle1")
    For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
        Set cell = Sheets("Tabelle2").Columns("b:b").Find(Trim(.Cells(i, 1).Value), lookat:=xlPart)
        If Not cell Is Nothing Then .Cells(i, 2).Value = cell(1, 3)
    Next i
End With
End Sub

«Все гениальное просто, а все простое гениально!!!»

 

Lina1515

Пользователь

Сообщений: 15
Регистрация: 21.08.2017

#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:

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • xlFormulas (-4123) – формулы.
LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
MatchCase Определяет учет регистра:

  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
MatchByte Условия поиска при использовании двухбайтовых кодировок:

  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes.

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

Знаки подстановки для поисковой фразы

Условные знаки в шаблоне поисковой фразы:

  • ? – знак вопроса обозначает любой отдельный символ;
  • * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
  • ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).

Простые примеры

При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:

  1. Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
  2. Если поисковая фраза в заданном диапазоне найдена не будет, метод 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

Понравилась статья? Поделить с друзьями:
  • Vba excel поиск по всем файлам
  • Vba excel поиск по textbox
  • Vba excel поиск нескольких значений
  • Vba excel поиск значения по всем листам
  • Vba excel поиск значения в таблице