Excel vba find method not found

 

fafelbko

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

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

#1

06.09.2018 12:14:43

Добрый день коллеги.
Есть файл с двумя листами, на первом листе в любом столбце может появиться столбец «Код модели».
Мы находим этот столбец и с помощью ВПР сравниваем с базой на втором листе.
Затем подставляем в закладку в Worde.
VB почему-то ругается на Range(«H2:I27») и пишет «Method or data member not found»
Посоветуйте, как избежать этой ошибки?

Код
If Not Cells.Find(What:="Код модели") Is Nothing Then
Cells.Find(What:="Код модели").Activate
E_name = ActiveSheet.Cells(i, ActiveCell.Column).Text 
Sal = Application.WorksheetFunction.VLookup(E_name, Sheet1.Range("H2:I27"), 2, False)
.bookmarks("bookmark_14").Range.Text = Sal
    Else: MsgBox "Не найден столбец 'код модели'; обработка прервана", vbExclamation
        Exit Sub
End If
 

StoTisteg

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

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

#2

06.09.2018 12:20:39

Код
With Sheet1
Sal = Application.WorksheetFunction.VLookup(E_name, .Range(.Cells(2,8),.Cells(27,9)), 2, False)
End With

Ячейки должны быть с того же листа, что и включающий их диапазон.

Изменено: StoTisteg06.09.2018 12:20:46

 

fafelbko

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

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

Внёс ваше исправление, но точно такая же ошибка «Method or data member not found» и ругается теперь на .Cells

 

ivanok_v2

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

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

#4

06.09.2018 12:31:04

Цитата
fafelbko написал:
Sheet1

у вас точно так название?

 

StoTisteg

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

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

А переменная Sheet1 у вас вообще какого типа? И где ей присваивается значение?

 

Hugo

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

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

Подозреваю что нет объекта Sheet1. Файла нет (да и всего кода нет), поэтому остаётся только подозревать.

 

StoTisteg

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

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

Hugo, вот и я подозреваю, что её нет и имеется в виду Worksheets(«Sheet1»)…

 

StoTisteg

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

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

А ещё я в упор не понимаю, нафига нужен ВПР там, где работают Find и Offset…

Изменено: StoTisteg06.09.2018 12:58:36

 

fafelbko

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

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

#9

06.09.2018 12:46:02

Коллеги, прошу прощения, не дописал.
Обьявил

Код
Dim Worksheets("Sheet1") As Object

Ругается Type mismatch
Могу предоставить весь файл

Прикрепленные файлы

  • Рассылка_дилерам.xlsm (96.16 КБ)

 

ivanok_v2

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

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

#10

06.09.2018 12:48:42

Цитата
fafelbko написал:
Dim Worksheets(«Sheet1») As Object

fafelbko, у вас есть понятия работы кода?
так как ето говорит совсем обратное

 

fafelbko

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

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

Не совсем. Не могли бы подсказать?

 

StoTisteg

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

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

fafelbko, знаете, Вам нужно взять справочник и почитать там, что такое переменная, что означает Worksheets(«Sheet1») и понять, почему написанное Вами — мягко говоря, ерунда.

 

Юрий М

Модератор

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

Контакты см. в профиле

#13

06.09.2018 13:09:53

fafelbko, весь код не смотрел, но переменную Вы объявляете неправильно. Нужно примерно так:

Код
Dim Sht As Worksheet
Set Sht = Worksheets("Лист1")


 

_Boroda_

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

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

Контакты см. в профиле

#14

06.09.2018 13:14:39

Код
Sal = Application.WorksheetFunction.VLookup(E_name, Worksheets("Лист1").Range("H2:I27"), 2, False)

Изменено: _Boroda_06.09.2018 13:14:45

Скажи мне, кудесник, любимец ба’гов…

 

fafelbko

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

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

#15

06.09.2018 14:05:38

Коллеги. Прошу простить мою некомпетентность.
Спасибо большое в помощи с моим вопросом, всё работает!

Метод 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

Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.

Feb 23rd, 2018, 11:45 AM


#1

BettyCrocker is offline

Thread Starter


New Member


«Method or Data Member Not Found» VBA issues in excel

Hi there,

I have no clue what I’m doing but I have copied some code and adjusted to try and fit my purposes but for some reason the first line in my code is causing an issue. I keep getting the error message of «Method or Data Member Not Found» and then when I go to de-bug it is highlighting the first line, which reads:

Private Sub cmdAdd_Click()

I am trying to make a form to add the details of a new supplier to a spreadsheet. I have downloaded the practice sheet and opened that up and it’s working fine, but for some reason it has an issue with the first line in my sheet.

I have deleted some .exd files as suggested in another post but this hasn’t done anything.

Microsoft Office 365, Excel Version 1801 (Build 9001.2171)

I have no idea what VBA version I m running or even how to check — I also have no idea about coding, I just want a form!! Is there a simpler way to make a form to enter into a list of suppliers?? This seems so so long winded…

Entire Code Text:

Private Sub cmdAdd_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets(«Suppliers»)

‘find first empty row in database
iRow = ws.Cells.Find(What:=»*», SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1

‘check for a name
If Trim(Me.txtName.Value) = «» Then
Me.txtName.SetFocus
MsgBox «Please enter a supplier name»
Exit Sub
End If

‘copy the data to the database
‘use protect and unprotect lines,
‘ with your password
‘ if worksheet is protected
With ws
‘ .Unprotect Password:=»password»
.Cells(iRow, 1).Value = Me.txtName.Value
.Cells(iRow, 2).Value = Me.txtWebsite.Value
.Cells(iRow, 3).Value = Me.txtPhoneNo.Value
.Cells(iRow, 4).Value = Me.txtAccountNo.Value
.Cells(iRow, 5).Value = Me.txtEmail.Value
.Cells(iRow, 6).Value = Me.txtContact.Value
.Cells(iRow, 7).Value = Me.txtCategory.Value
.Cells(iRow, 8).Value = Me.txtOpened.Value
.Cells(iRow, 9).Value = Me.txtUsername.Value
.Cells(iRow, 10).Value = Me.txtPassword.Value
‘ .Protect Password:=»password»
End With

‘clear the data

Me.txtName.Value = «»
Me.txtWebsite.Value = «»
Me.txtPhoneNo.Value = «»
Me.txtAccountNo.Value = «»
Me.txtEmail.Value = «»
Me.txtContact.Value = «»
Me.txtCategory.Value = «»
Me.txtOpened.Value = «»
Me.txtUsername.Value = «»
Me.txtPassword.Value = «»
Me.txtName.SetFocus
End Sub


Feb 23rd, 2018, 05:37 PM


#2

Re: «Method or Data Member Not Found» VBA issues in excel

Hi BettyCrocker,
The highlight first line will be yellow to indicates error in routine.
If you scroll down the actual error line will be highlight too in blue.
which line is highlighted blue?


Feb 23rd, 2018, 08:57 PM


#3

Re: «Method or Data Member Not Found» VBA issues in excel

Is there a simpler way to make a form to enter into a list of suppliers??

this is simple, it may be possible to make the code shorter, but it may mean redesigning your form a bit

«Method or Data Member Not Found»

is this procedure (sub) actually in the code pane for the userform or in a general module? for the me keyword to be valid, the code would need to be in the form containing the textboxes, else you would need to specify the form by name

i do my best to test code works before i post it, but sometimes am unable to do so for some reason, and usually say so if this is the case.
Note code snippets posted are just that and do not include error handling that is required in real world applications, but avoid On Error Resume Next

dim all variables as required as often i have done so elsewhere in my code but only posted the relevant part

come back and mark your original post as resolved if your problem is fixed
pete


Mar 9th, 2018, 08:15 AM


#4

BettyCrocker is offline

Thread Starter


New Member


Re: «Method or Data Member Not Found» VBA issues in excel

«which line is highlighted blue?[/QUOTE]»

‘check for a name
If Trim(Me

.txtName.Value) = «» Then
Me.txtName.SetFocus
MsgBox «Please enter a supplier name»
Exit Sub
End If

«.txtName»


Mar 9th, 2018, 08:18 AM


#5

BettyCrocker is offline

Thread Starter


New Member


Re: «Method or Data Member Not Found» VBA issues in excel

«is this procedure (sub) actually in the code pane for the userform or in a general module? for the me keyword to be valid, the code would need to be in the form containing the textboxes, else you would need to specify the form by name «

I have zero clue what you’re asking me sorry.


Mar 9th, 2018, 04:43 PM


#6

Re: «Method or Data Member Not Found» VBA issues in excel

the error indicates there is no object (textbox) with the name txtName in the me object

Me would refer to a userform, worksheet or other object and for it to be valid the code would have to be in the code module for that object
possibly replace the ME keyword, with the name of the textboxes container, like userform1.txtname

or post a sample workbook (zip first) with userform that demonstrates the problem

i do my best to test code works before i post it, but sometimes am unable to do so for some reason, and usually say so if this is the case.
Note code snippets posted are just that and do not include error handling that is required in real world applications, but avoid On Error Resume Next

dim all variables as required as often i have done so elsewhere in my code but only posted the relevant part

come back and mark your original post as resolved if your problem is fixed
pete


Jun 9th, 2020, 06:33 AM


#7

kamalrana434 is offline


New Member


Re: «Method or Data Member Not Found» VBA issues in excel

Hi I am getting same error. Pls help

Sub Reset()

Dim iRow As Long

iRow = [Counta(Database!A:A)] ‘ idetifying the last row

With frmForm

.txtFinancialYear.Value = «»
.txtMonth.Value = «»
.txtProductionNos.Value = «»
.txtSquareFeet.Value = «»
.txtProductionValue.Value = «»


Jun 9th, 2020, 06:33 AM


#8

kamalrana434 is offline


New Member


Re: «Method or Data Member Not Found» VBA issues in excel

Hi I am getting same error. Pls help

Sub Reset()

Dim iRow As Long

iRow = [Counta(Database!A:A)] ‘ idetifying the last row

With frmForm

.txtFinancialYear.Value = «»
.txtMonth.Value = «»
.txtProductionNos.Value = «»
.txtSquareFeet.Value = «»
.txtProductionValue.Value = «»


Jun 9th, 2020, 04:06 PM


#9

Re: «Method or Data Member Not Found» VBA issues in excel

on which line does the error occur?
is this in access?

i do my best to test code works before i post it, but sometimes am unable to do so for some reason, and usually say so if this is the case.
Note code snippets posted are just that and do not include error handling that is required in real world applications, but avoid On Error Resume Next

dim all variables as required as often i have done so elsewhere in my code but only posted the relevant part

come back and mark your original post as resolved if your problem is fixed
pete


I am having a problem with a Range.Find method not working as desired.  I’m grabbing a particular range of columns (1 column), and then performing a find within that column for a particular value.  The find is returning nothing.  Yet, when I explicitly reference the cell from the range…ie Range.cell(10,1), I find the value that I was searching for.  I’ve tried all combinations of options with xlValue, xlWhole, etc.  Does anyone know of limitations with the Find method?  Are there alternatives?

Code:

Public Function findDate(lookupPN As String, lookupColumn As String, lookupDate As String, lookupSheet As String) As String
    Dim obj As Variant
    Dim row As Variant
    Dim col As Variant
    Dim tmp As Variant

   
    ‘Activate the correct workbook
    Workbooks(«Spreadsheet.xls»).Activate

   
    With Worksheets(lookupSheet).Columns(lookupColumn)
        ‘Find the row that the part number is in (doesn’t work)
        Set obj = .Find(lookupPN, LookIn:=xlValues)

       
        If IsEmpty(obj) = False Then
            row = obj.Cells(1, 1).row

           
            ‘Find the Column that the date is in
            Set obj = Worksheets(lookupSheet).Rows(row).Find(lookupDate, LookIn:=xlValues, lookAt:=xlWhole)
            If IsEmpty(obj) = False Then
                col = obj.Cells(1, 1).Column

           
                ‘Now Find the value of the Date

               
                findDate = Worksheets(lookupSheet).Rows(row + 1).Columns(col)
            Else
                MsgBox («Could not find date for part number»)
            End If
        Else
            MsgBox («Could not find Part Number»)
        End If
    End With

   
End Function

Содержание

  1. Метод Range.Find (Excel)
  2. Синтаксис
  3. Параметры
  4. Возвращаемое значение
  5. Примечания
  6. Примеры
  7. Поддержка и обратная связь
  8. Метод Find (объектная модель VBA Add-In)
  9. Синтаксис
  10. Замечания
  11. См. также
  12. Поддержка и обратная связь
  13. Поиск на листе Excel
  14. Поиск перебором значений
  15. Поиск функцией Find
  16. Примеры поиска функцией Find
  17. Поиск последней заполненной ячейки с помощью Find
  18. Поиск по шаблону (маске)
  19. Поиск в скрытых строках и столбцах
  20. Поиск даты с помощью Find
  21. Книги по теме:
  22. Посмотреть все книги по программированию
  23. Комментарии к статье:

Метод Range.Find (Excel)

Находит определенные сведения в диапазоне.

Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.

Синтаксис

выражение.Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

выражение: переменная, представляющая объект Range.

Параметры

Имя Обязательный или необязательный Тип данных Описание
What Обязательный Variant Искомые данные. Может быть строкой или любым типом данных Microsoft Excel.
After Необязательный Variant Ячейка, после которой нужно начать поиск. Соответствует положению активной ячейки, когда поиск выполняется из пользовательского интерфейса.

Обратите внимание, что параметр After должен быть одной ячейкой в диапазоне. Помните, что поиск начинается после этой ячейки; указанная ячейка не входит в область поиска, пока метод не возвращается обратно в эту ячейку.

Если не указать этот аргумент, поиск начинается после ячейки в левом верхнем углу диапазона. LookIn Необязательный Variant Может быть одной из следующих констант XlFindLookIn: xlFormulas, xlValues, xlComments или xlCommentsThreaded. LookAt Необязательный Variant Может быть одной из следующих констант XlLookAt: xlWhole или xlPart. SearchOrder Необязательный Variant Может быть одной из следующих констант XlSearchOrder: xlByRows или xlByColumns. SearchDirection Необязательный Variant Может быть одной из следующих констант XlSearchDirection: xlNext или xlPrevious. MatchCase Необязательный Variant Значение True, чтобы выполнять поиск с учетом регистра. Значение по умолчанию — False. MatchByte Необязательный Variant Используется только в том случае, если выбрана или установлена поддержка двухбайтовых языков. Значение True, чтобы двухбайтовые символы сопоставлялись только с двухбайтовым символами. Значение False, чтобы двухбайтовые символы сопоставлялись с однобайтовыми эквивалентами. SearchFormat Необязательный Variant Формат поиска.

Возвращаемое значение

Объект Range, представляющий первую ячейку, в которой обнаружены требуемые сведения.

Примечания

Этот метод возвращает значение Nothing, если совпадения не найдены. Метод Find не влияет на выделенный фрагмент или активную ячейку.

Параметры для аргументов LookIn, LookAt, SearchOrder и MatchByte сохраняются при каждом использовании этого метода. Если не указать значения этих аргументов при следующем вызове метода, будут использоваться сохраненные значения. Установка этих аргументов изменяет параметры в диалоговом окне Найти, а изменение параметров в диалоговом окне Найти приводит к изменению сохраненных значений, которые используются, если опустить аргументы. Чтобы избежать проблем, устанавливайте эти аргументы явным образом при каждом использовании этого метода.

Для повторения поиска используйте методы FindNext и FindPrevious.

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

Чтобы найти ячейки, отвечающие более сложным шаблонам, используйте инструкцию For Each. Next с оператором Like. Например, следующий код выполняет поиск всех ячеек в диапазоне A1:C5, где используется шрифт, имя которого начинается с букв Cour. Когда Microsoft Excel находит соответствующее значение, шрифт изменяется на Times New Roman.

Примеры

В этом примере показано, как найти все ячейки в диапазоне A1:A500 на листе 1, содержащие значение 2, и изменить значение ячейки на 5. Таким образом, значения 1234 и 99299 содержали 2 и оба значения ячеек станут 5.

В этом примере показано, как найти все ячейки в диапазоне A1:A500 на листе 1, содержащие подстроку «abc», и изменить ее на «xyz».

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Метод Find (объектная модель VBA Add-In)

Выполняет поиск указанной строки в активном модуле.

Синтаксис

object. Найти (target, startline, startcol, endline, endcol, [ wholeword ], [ matchcase ], [ patternsearch ]) — логическое значение

Синтаксис Find состоит из следующих частей:

Part Описание
object Обязательно. Выражение объекта, которое вычисляет объект в списке Применимо к.
конечный объект Обязательно. Строка, содержащая искомый текст или шаблон.
начальная строка Обязательно. Значение Long, указывающее строку, с которой вы хотите начать поиск; при обнаружении будет задана строка совпадения. Первая строка — число 1.
startcol Обязательно. Значение Long, указывающее столбец, с которого вы хотите начать поиск; при обнаружении будет задан столбец, содержащий совпадение. Первый столбец — 1.
endline Обязательно. Значение типа Long, определяющее последний столбец найденного совпадения, если таковое будет найдено. Последняя строка может быть указана как -1.
endcol Обязательно. Значение типа Long, определяющее последний столбец найденного совпадения, если таковое будет найдено. Последний столбец может быть обозначен как -1.
целое слово Необязательный параметр. Значение типа Boolean, определяющее, искать ли совпадение только для целых слов. Если оно равно True, выполняется поиск только целых слов. По умолчанию используется значение False.
matchcase Необязательный параметр. Значение типа Boolean, определяющее, должен ли совпадать регистр знаков. Если оно равно True, поиск чувствителен к регистру. По умолчанию используется значение False.
patternsearch Необязательный параметр. Логическое значение, указывающее, является ли целевая строка шаблоном, который может содержать подстановочные знаки, такие как звездочка (*) или вопросительный знак (?). Если задано значение True, целевая строка является шаблоном. По умолчанию используется значение False.

Замечания

Find возвращает значение True, если совпадение найдено, и False, если совпадение не найдено.

Аргументыmatchcase и patternsearch являются взаимоисключающими; Если оба аргумента передаются как True, возникает ошибка.

На содержимое диалогового окна Найти не влияет метод Find .

Указанный диапазон строк и столбцов является инклюзивным, поэтому поиск может найти шаблон в указанной последней строке, если endcol указан как -1 или длина строки.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Поиск на листе Excel

Поиск какого-либо значения в ячейках Excel довольно часто встречающаяся задача при программировании какого-либо макроса. Решить ее можно разными способами. Однако, в разных ситуациях использование того или иного способа может быть не оправданным. В данной статье я рассмотрю 2 наиболее распространенных способа.

Поиск перебором значений

Довольно простой в реализации способ. Например, найти в колонке «A» ячейку, содержащую «123» можно примерно так:

Минусами этого так сказать «классического» способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.

Поиск функцией Find

Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую «123» достаточно такого кода:

Вкратце опишу что делают строчки данного кода:
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»

Обратите внимание : Когда поиск достигнет конца диапазона, функция продолжит искать с начала диапазона. Таким образом, если значение найденной ячейки не менять, то приведенный выше пример зациклится в бесконечном цикле. Поэтому, чтобы этого избежать (зацикливания), можно сделать следующим образом:

Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.

В ниже следующем примере используется другой вариант продолжения поиска — с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.

Пример 3: Продолжение поиска с использованием Find с параметром After.

Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.

Пример 4: Найти все ячейки с шрифтом «курсив» и поменять их формат на обычный (не «курсив»)

Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)

Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.

Хочу обратить внимание на то, что в этом примере я не стал использовать «защиту от зацикливания», как в Примерах 2 и 3, т.к. шрифт меняется и после «прохождения» по всем ячейкам, больше не останется ни одной ячейки с курсивом.

Свойство FindFormat можно задавать разными способами, например, так:

Поиск последней заполненной ячейки с помощью Find

Следующий пример — применение функции Find для поиска последней ячейки с заполненными данными. Использованные в Примере 4 SpecialCells находит последнюю ячейку даже если она не содержит ничего, но отформатирована или в ней раньше были данные, но были удалены.

Пример 5: Найти последнюю колонку и столбец, заполненные данными

В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т.ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.

Поиск по шаблону (маске)

При поиске можно так же использовать шаблоны, чтобы найти текст по маске, следующий пример это демонстрирует.

Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.

Для поиска функцией Find по маске (шаблону) можно применять символы:
* — для обозначения любого количества любых символов;
? — для обозначения одного любого символа;

— для обозначения символов *, ? и

. (т.е. чтобы искать в тексте вопросительный знак, нужно написать

?, чтобы искать именно звездочку (*), нужно написать

* и наконец, чтобы найти в тексте тильду, необходимо написать

Поиск в скрытых строках и столбцах

Для поиска в скрытых ячейках нужно учитывать лишь один нюанс: поиск нужно осуществлять в формулах, а не в значениях, т.е. нужно использовать LookIn:=xlFormulas

Поиск даты с помощью Find

Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:

  • Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
  • В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas

Приведу несколько примеров поиска даты.

Пример 7: Найти текущую дату на листе независимо от формата отображения даты.

Пример 8: Найти 1 марта 2018 г.

Искать часть даты — сложнее. Например, чтобы найти все ячейки, где месяц «март», недостаточно искать «03» или «3». Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел — это выбрать формат в котором месяц прописью для ячеек с датами и искать слово «март» в xlValues.

Тем не менее, можно найти, например, 1 марта независимо от года.

Пример 9: Найти 1 марта любого года.

Книги по теме:

Посмотреть все книги по программированию

Комментарии к статье:

10.09.17 Дмитрий Очень толковая и полезная статья. Помогла мне существенно ускорить мой код. Спасибо!
23.11.17 Гость Спасибо, хорошая статья.
03.12.17 Владимир Спасибо! Использую в своих проектах.
07.12.17 Эд Спасибо, очень пригодилась Ваша статья!
19.01.18 Николай .find не ищет значение в ячейке, если ячейка в скрытой строке.
.match позволяет не беспокоится о том, что на листах с источниками данных строка с искомым значением будет скрыта из-за установленного фильтра.
05.02.18 Владимир Большое спасибо! Очень толково и понятно.
11.03.18 Гость Здравствуйте,
А если мне требуется найти ячейку в определенном столбце с определенным значением, например «строка 1» и если я нахожу такую, то через несколько строк(неизвестно сколько) мне нужно раскрасить следующую ячейку в другом столбце(самую ближайшую) и остановить цикл, и опять по новой искать дальше «строка 1». Можете посоветовать?
26.03.18 Гость Спасибо! Все бы так описывали! Все доступно и понятно))
23.05.18 Аркадий В VBA я новичок. Активно использую интернет для своих вопросов, однако таких информативных, лаконичных и простых в понимании сайтов не много. Огромное спасибо автору! Адрес уже в закладках.
21.07.18 Гость Спасибо! Уже несколько недель искала подобное!
25.07.18 Joann Метод .find (в случае далнейших множественных обращений к этому механизму) разумно вынести в отдельную функцию, как из управляющей процедуры передать в эту функцию ее параметры (обязательный текстовый параметр ‘what:=’ — передается без проблем, а вот значения (‘xlValues’, ‘xlWhole’, . ) для ‘LookIn:=’, ‘LookAt:=’, . — приводят к ошибке)?
15.08.18 Марат Спасибо за статью, пополнил свои знания в части метода Find. Простые переборы хороши на небольших диапазонах. А когда нужно обработать сотни тысяч ячеек, Find — хороший инструмент!
28.08.18 Гость Познавательно и подробно. Спасибо за статью.
16.10.18 Гость Хорошая статья. Спасибо
29.10.18 Sega Полезная статейка. Спасибо.
14.11.18 Гость Статья для начинающих, а тонкости поиска по дате нет ни одного примера
02.02.19 Ибрагим Чушь полная, плагиат!
01.03.19 inexsu.wordpress.com Loop While Not c Is Nothing And c.Address <> firstResult
Когда c станет Nothing, c.Address даст ошибку
Решение https://inexsu.wordpress.com/2018/03/05/range-findnext-method/
01.03.19 Администратор Вы правы, такое действительно может произойти, например, если менять значения найденных ячеек. Т.е., например, ищем значения «asd» и меняем их на «qwe». При замене последнего значения, FindNext ничего уже не найдет, вернет Nothing и произойдет ошибка в условии.
Внес изменения в статье. Спасибо вам за подсказку.
07.04.19 Гость Добрый день. есть 2 таблица на разных листах. макрос нашел нужные ячейки с ИНН по 1 условию, затем мне надо чтобы макрос нашел в таблице 2 на листе 2 все названия клиентов с инн по условию 1 из таблицы 1 с листа 1. как тогда использовать find.
07.04.19 Гость Лучше использовать функцию ВПР
21.05.19 Гость Очень подробная статья. Отдельное спасибо за множество примеров.
17.10.19 Михаил Спасибо большое все понятно доступно и очень полезно
31.10.19 Гость Спасибо.
01.11.19 Гость ку
01.11.19 Гость 2 раза
19.11.19 Kamol Отлично.
Поиск с двумя значениями Пример в колонке А=»123″ и В=»456″
25.12.19 Гость Спасибо!
05.03.20 Гость Добрый день!
Спасибо за код автору
Вопрос

Как сделать поиск слова по, но с любым регистром и любым набором символов
Пример: Я ввожу слово через Textbox
В таблице есть слово компьютер, колодец, ком
Нужно, чтобы программа находила по запросу «омпьюте», «пьюте» слово компьютер а по запросу «ком» слова компьютер и ком 19.05.20 ГостьSpenser.Hebe as long as the kung fu is deep, the iron shovel is ground into a needle. 07.06.20 Светлана Добрый день! Подскажите, пожалуйста, в примере №7 «Найти текущую дату. «
как найти ячейку с текущей датой и выделить эту ячейку цветом? Очень надо. 07.06.20 Светлана Всё сделала. Спасибо за примеры. 19.06.20 Гость Статья толковая, жаль своего примера не нашел 11.09.20 Гость Спасибо! 18.10.20 Гость Спасибо, очень толково и полезно!! 09.11.20 Александр 1. В примерах 2, 3 и 6 проверка «If c Is Nothing Then Exit Do» не нужна, потому что НИКОГДА не сработает и не приведёт к выходу из цикла. Раз мы попали в цикл — значит была найдена хотя бы одна ячейка с искомым значением и значит последующий поиск заведомо даст результат, даже если такая ячейка всего одна.
Значения в ячейках не меняются, поэтому для выхода из цикла достаточно условия «c.Address = firstResult». А это условие будет выполнено, как только поиск вернётся на первую найденную ячейку с искомым значением.
2. В примере 3 продолжение поиска выполнено оператором «Set c = .Find(«asd», After:=c, lookin:=xlValues)». Такой вариант, разумеется, работает, но на мой взгляд лишь затуманивает головы. В ДАННОМ СЛУЧАЕ надо не городить огород, а воспользоваться оператором FindNext, который и предназначен для того, чтобы продолжить поиск с ячейки, следующей после последней найденной: «Set c = .FindNext(c)». Я исхожу из простого принципа: если в языке есть специальный инструмент для выполнения специальных действий, то эти действия и надо выполнять с помощью этого инструмента.
Гвоздь можно забить пассатижами, но для этого больше подойдёт молоток ) 24.11.20 Гость » Добрый день!
Спасибо за код автору
Вопрос

Как сделать поиск слова по, но с любым регистром и любым набором символов
Пример: Я ввожу слово через Textbox
В таблице есть слово компьютер, колодец, ком
Нужно, чтобы программа находила по запросу «омпьюте», «пьюте» слово компьютер а по запросу «ком» слова компьютер и ком»

Источник

Like this post? Please share to your friends:
  • Excel vba find first empty cell
  • Excel vba find all values in a column
  • Excel vba find all rows
  • Excel vba find all method
  • Excel vba find all in range