Excel vba find не работает

 

invirtus

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

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

Добрый день всем.

Возникла проблема с методом Find. Вчера убил два часа, но так и не понял, почему он то работает, то нет. Через Find и Offset я пытаюсь сэмулировать экселевский Vlookup. Есть исходный файл с двумя колонками — в первой список ИНН, во второй — список номеров поставщиков. Макрос в testFile находит ИНН (с этим он прекрасно справляется), а потом используя ИНН должен искать мне номер поставщика. Он то работал вчера, то нет. Когда не работал, я сохранял файл, закрывал, открывал, запускал макрос построчно и по коду следил, что происходит после выполнения каждой строки, и он находил поставщика. Потом закрывал файл, открывал, запускал просто так и он не находил поставщика. Выкладываю файл где ищется ИНН и файл со списком поставщиков (готовый макрос не влезает по максимальному объему файла). Необходимый макрос — Sub PriceListShow(). Ниже интересующий меня блок кода, я не пойму, почему он не работает (уже перебрал все возможные варианты, но он так и не ищет строку).

Я начал грешить на то, что у меня String, а в файле со списком поставщиков формат данных «цифровой», но смена переменной на Double никакого результата не принесла.
Как видите ниже, я перепробовал различные варианты запросов (даже vlookup), но опять таки к какому то очевидному пониманию не пришёл. Надеюсь вы мне поможете и/или подскажете, как улучшить код.
Спасибо.

Код
On Error Resume Next
Dim SupplierINN As String
Dim SupplierBlockStart As String
Dim SupplierBlockEnd As String
SupplierBlockStart = Worksheets("Данные поставщика").Range("A1:C100").Find("*Контак*ормация*поставщика*").Address
SupplierBlockEnd = Worksheets("Данные поставщика").Range("A1:C100").Find("лицо*поставщика*").Address
SupplierINN = Worksheets("Данные поставщика").Range(Worksheets("Данные поставщика").Range(SupplierBlockStart & ":" & SupplierBlockEnd).Find("*ИНН*").Address).Offset(, 1).Value

If SupplierINN = Empty Then
PriceListAuto.Supplier = "НЕТ ИНН"
PriceListAuto.Supplier.BackColor = RGB(254, 230, 61)
PriceListAuto.SupplierLabel = "На вкладке ""Данные поставщика"" не указан ИНН. Уточните ИНН / Введите вручную"
Else

'xSupplier = Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range(Range("A:A").Find(SupplierINN, , , xlPart).Address).Offset(, 2).Value
'If xSupplier = "" Then xSupplier = Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range(Range("A:A").Find(SupplierINN, , , xlWhole).Address).Offset(, 2).Value
'If xSupplier = "" Then xSupplier = Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range(Range("A:A").Find("*" & SupplierINN & "*", , , xlPart).Address).Offset(, 2).Value
'If xSupplier = "" Then xSupplier = Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range(Range("A:A").Find("*" & SupplierINN & "*", , , xlWhole).Address).Offset(, 2).Value
If xSupplier = "" Then xSupplier = Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Application.WorksheetFunction.VLookup(CDbl(SupplierINN), "A:C", 3, 0)

xSupplierName = Workbooks("Suppliers.xlsm").Worksheets("Suppliers").Range(Range("C:C").Find(xSupplier, , , xlPart).Address).Offset(, 1).Value
If xSupplier = "" Then
PriceListAuto.Supplier = "НЕ НАЙДЕН"
PriceListAuto.SupplierLabel = "Поставщик не найден. Проверьте список поставщиков или введите номер вручную"
Else
PriceListAuto.Supplier = xSupplier
PriceListAuto.Supplier.BackColor = RGB(107, 198, 6)
PriceListAuto.SupplierLabel = xSupplierName
End If
End If


Изменено: invirtus28.07.2015 10:03:13

Excel for Microsoft 365 Excel for Microsoft 365 for Mac Excel 2021 Excel 2021 for Mac Excel 2019 Excel 2019 for Mac Excel 2016 Excel 2016 for Mac Excel 2013 Excel 2010 Excel 2007 More…Less

This topic provides help for the most common scenarios for the #VALUE! error in the FIND/FINDB and SEARCH/SEARCHB functions.

A few things to know about FIND and SEARCH functions

  • The FIND and SEARCH functions are very similar. They both work in the same way — locate a character or a text string in another text string. The difference between these two functions is that FIND is case-sensitive, and SEARCH is not case-sensitive. So if you don’t want to match case in a text string, use SEARCH.

  • If you want a function that returns the string based on the character number you specify, use the MID function along with FIND. You can find information and examples of using MID and FIND combinations in the FIND help topic.

  • The syntax of these functions is the same, find_text, within_text, [start_num]). In simple English, the syntax means What do you want to find?, Where do you want to find it?, What position do you want to start from?

Problem: the value in the find_text argument cannot be found in the within_text string

If the function cannot find the text to be found in the specified text string, it will throw a #VALUE! error.

For example, a function like:

  • =FIND(«gloves»,»Gloves (Youth)»,1)

Will throw the #VALUE! error, because there is no matching “gloves” in the string, but there is “Gloves”. Remember that FIND is case-sensitive, so make sure the value in find_text has an exact match in the string in the within_text argument.

However, this SEARCH function will return a value of 1, since it’s not case-sensitive:

  • =SEARCH(«gloves»,»Gloves (Youth)»,1)

Solution: Correct the syntax as necessary.

Problem: The start_num argument is set to zero (0)

The start_num argument is an optional argument, and if you omit it, the default value will be assumed to be 1. However, if the argument is present in the syntax and the value is set to 0, you will see the #VALUE! error.

Solution: Remove the start_num argument if it is not required, or set it to the correct appropriate value.

Problem: The start_num argument is greater than the within_text argument

For example, the function:

  • =FIND(“s”,”Functions and formulas”,25)

Looks for “s” in the “Functions and formulas” string (within_text) starting at the 25th character (start_num), but returns a #VALUE! error because there are only 22 characters in the string.

Tip: To find the total number of characters in a text string, use the LEN function

Solution: Correct the starting number as necessary.

Need more help?

You can always ask an expert in the Excel Tech Community or get support in the Answers community.

See Also

Correct a #VALUE! error

FIND/FINDB functions

SEARCH/SEARCHB FUNCTIONS

Overview of formulas in Excel

How to avoid broken formulas

Detect errors in formulas

All Excel functions (alphabetical)

All Excel functions (by category)

Need more help?

Содержание

  1. How to correct a #VALUE! error in FIND/FINDB and SEARCH/SEARCHB functions
  2. A few things to know about FIND and SEARCH functions
  3. Problem: the value in the find_text argument cannot be found in the within_text string
  4. Problem: The start_num argument is set to zero (0)
  5. Problem: The start_num argument is greater than the within_text argument
  6. Need more help?
  7. Excel VBA: `range.find ()` не находит значения, которые отображаются как `####`
  8. 5 ответов
  9. Vba excel не работает find
  10. Excel VBA: `range.find ()` не находит значения, которые отображаются как `####`
  11. 5 ответов
  12. VBA Excel. Метод Find объекта Range
  13. Предназначение и синтаксис метода Range.Find
  14. Синтаксис метода Range.Find
  15. Параметры метода Range.Find
  16. Знаки подстановки для поисковой фразы
  17. Простые примеры

How to correct a #VALUE! error in FIND/FINDB and SEARCH/SEARCHB functions

This topic provides help for the most common scenarios for the #VALUE! error in the FIND/FINDB and SEARCH/SEARCHB functions.

A few things to know about FIND and SEARCH functions

The FIND and SEARCH functions are very similar. They both work in the same way — locate a character or a text string in another text string. The difference between these two functions is that FIND is case-sensitive, and SEARCH is not case-sensitive. So if you don’t want to match case in a text string, use SEARCH.

If you want a function that returns the string based on the character number you specify, use the MID function along with FIND. You can find information and examples of using MID and FIND combinations in the FIND help topic.

The syntax of these functions is the same, find_text, within_text, [start_num]). In simple English, the syntax means What do you want to find?, Where do you want to find it?, What position do you want to start from?

Problem: the value in the find_text argument cannot be found in the within_text string

If the function cannot find the text to be found in the specified text string, it will throw a #VALUE! error.

For example, a function like:

Will throw the #VALUE! error, because there is no matching “gloves” in the string, but there is “Gloves”. Remember that FIND is case-sensitive, so make sure the value in find_text has an exact match in the string in the within_text argument.

However, this SEARCH function will return a value of 1, since it’s not case-sensitive:

Solution: Correct the syntax as necessary.

Problem: The start_num argument is set to zero (0)

The start_num argument is an optional argument, and if you omit it, the default value will be assumed to be 1. However, if the argument is present in the syntax and the value is set to 0, you will see the #VALUE! error.

Solution: Remove the start_num argument if it is not required, or set it to the correct appropriate value.

Problem: The start_num argument is greater than the within_text argument

For example, the function:

=FIND(“s”,”Functions and formulas”,25)

Looks for “s” in the “Functions and formulas” string ( within_text) starting at the 25th character ( start_num), but returns a #VALUE! error because there are only 22 characters in the string.

Tip: To find the total number of characters in a text string, use the LEN function

Solution: Correct the starting number as necessary.

Need more help?

You can always ask an expert in the Excel Tech Community or get support in the Answers community.

Источник

Excel VBA: `range.find ()` не находит значения, которые отображаются как `####`

Я пытаюсь найти конкретное значение в определенном столбце. Например, значение 100000 в столбце B . Следующий код работает, только если столбец достаточно широк, чтобы отобразить полное число:

Как только столбец сужается, Excel отображает только ##### вместо 100000 в определенной ячейке, метод find возвращает Nothing .

Есть ли способ использовать метод find, основанный на фактических значениях, а не на отображении значений? Если нет, есть ли альтернативы For Each cell In rng.Cells ? В конце концов, я освобождаю метод, который использует наименьшее количество ресурсов.

Примечание: searchRange — это только один столбец, searchValue либо не существует, либо существует только один раз.

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

5 ответов

Может воспроизвести сбой Find , если ширина столбца слишком мала.

Match не имеет этой проблемы.

В зависимости от вашего варианта использования это может быть вариант, а если нет, то может быть Range.AutoFit ? Хотя с «Я пытаюсь найти определенное значение в определенном столбце», похоже, что это может быть вариант.

Вы можете либо получить диапазон в массив и зациклить массив, либо просто использовать MATCH:

Проблема с find заключается в том, что по какой-то причине он ищет только отображаемые значения, идентично поведению окна поиска, которое вы получаете при нажатии crtl+F или выборе опции «Найти и выбрать» на ленте «Главная». В настоящее время нет известного способа исправить это (просматривая xlValues ​​и тому подобное, как указано в комментариях) Поскольку есть разные способы обойти это, самый (самый медленный), но самый надежный — это использовать цикл foreach следующим образом:

Просто убедитесь, что вы устанавливаете свой диапазон как определенное значение, например Range(«A1:B87») вместо Columns(2) , так как это вызовет ошибку несоответствия типов. Если вы хотите найти столбец B, используйте Range(«B:B») .

Источник

Vba excel не работает find

Sub tt()
Dim sh As Worksheet, wsDataSheet As Object, lLastrow As Long
Dim iCell As Range, iCell1 As Range, i As Long, iCell2 As Range, iCell3 As Range
Dim iSearchText$, iSearchText1$
‘——————————————————————————————————-
iSearchText$ = «Номер один*»
iSearchText1$ = «Номер Два»
Set wsDataSheet = ActiveWorkbook.Sheets(«Вывод»)
‘——————————————————————————————————-
lLastrow = wsDataSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
For Each sh In Worksheets
If sh.Name = wsDataSheet.Name Then GoTo Point
‘——————————————————————————————————-
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
‘——————————————————————————————————-
If Not iCell Is Nothing Then
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 6)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
‘——————————————————————————————————-
wsDataSheet.Cells(lLastrow, 1).Value = iCell
wsDataSheet.Cells(lLastrow, 2).Value = iCell1
wsDataSheet.Cells(lLastrow, 3).Value = iCell2
wsDataSheet.Cells(lLastrow, 4).Value = iCell3
lLastrow = lLastrow + 1
End If
‘——————————————————————————————————-
Point:
Next sh

без него вылезает ошибка 91
просто хочу понять и прошу мне такому не догоняющему объяснить. чтобы применять с умом

Sub tt()
Dim sh As Worksheet, wsDataSheet As Object, lLastrow As Long
Dim iCell As Range, iCell1 As Range, i As Long, iCell2 As Range, iCell3 As Range
Dim iSearchText$, iSearchText1$
‘——————————————————————————————————-
iSearchText$ = «Номер один*»
iSearchText1$ = «Номер Два»
Set wsDataSheet = ActiveWorkbook.Sheets(«Вывод»)
‘——————————————————————————————————-
lLastrow = wsDataSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
For Each sh In Worksheets
If sh.Name = wsDataSheet.Name Then GoTo Point
‘——————————————————————————————————-
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
‘——————————————————————————————————-
If Not iCell Is Nothing Then
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 6)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
‘——————————————————————————————————-
wsDataSheet.Cells(lLastrow, 1).Value = iCell
wsDataSheet.Cells(lLastrow, 2).Value = iCell1
wsDataSheet.Cells(lLastrow, 3).Value = iCell2
wsDataSheet.Cells(lLastrow, 4).Value = iCell3
lLastrow = lLastrow + 1
End If
‘——————————————————————————————————-
Point:
Next sh

без него вылезает ошибка 91
просто хочу понять и прошу мне такому не догоняющему объяснить. чтобы применять с умом Elhust

Каждый сам выбирает правила игры

Ответить

Sub tt()
Dim sh As Worksheet, wsDataSheet As Object, lLastrow As Long
Dim iCell As Range, iCell1 As Range, i As Long, iCell2 As Range, iCell3 As Range
Dim iSearchText$, iSearchText1$
‘——————————————————————————————————-
iSearchText$ = «Номер один*»
iSearchText1$ = «Номер Два»
Set wsDataSheet = ActiveWorkbook.Sheets(«Вывод»)
‘——————————————————————————————————-
lLastrow = wsDataSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
For Each sh In Worksheets
If sh.Name = wsDataSheet.Name Then GoTo Point
‘——————————————————————————————————-
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
‘——————————————————————————————————-
If Not iCell Is Nothing Then
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 6)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
‘——————————————————————————————————-
wsDataSheet.Cells(lLastrow, 1).Value = iCell
wsDataSheet.Cells(lLastrow, 2).Value = iCell1
wsDataSheet.Cells(lLastrow, 3).Value = iCell2
wsDataSheet.Cells(lLastrow, 4).Value = iCell3
lLastrow = lLastrow + 1
End If
‘——————————————————————————————————-
Point:
Next sh

без него вылезает ошибка 91
просто хочу понять и прошу мне такому не догоняющему объяснить. чтобы применять с умом Автор — Elhust
Дата добавления — 14.04.2017 в 08:15

Источник

Excel VBA: `range.find ()` не находит значения, которые отображаются как `####`

Я пытаюсь найти конкретное значение в определенном столбце. Например, значение 100000 в столбце B . Следующий код работает, только если столбец достаточно широк, чтобы отобразить полное число:

Как только столбец сужается, Excel отображает только ##### вместо 100000 в определенной ячейке, метод find возвращает Nothing .

Есть ли способ использовать метод find, основанный на фактических значениях, а не на отображении значений? Если нет, есть ли альтернативы For Each cell In rng.Cells ? В конце концов, я освобождаю метод, который использует наименьшее количество ресурсов.

Примечание: searchRange — это только один столбец, searchValue либо не существует, либо существует только один раз.

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

5 ответов

Может воспроизвести сбой Find , если ширина столбца слишком мала.

Match не имеет этой проблемы.

В зависимости от вашего варианта использования это может быть вариант, а если нет, то может быть Range.AutoFit ? Хотя с «Я пытаюсь найти определенное значение в определенном столбце», похоже, что это может быть вариант.

Вы можете либо получить диапазон в массив и зациклить массив, либо просто использовать MATCH:

Проблема с find заключается в том, что по какой-то причине он ищет только отображаемые значения, идентично поведению окна поиска, которое вы получаете при нажатии crtl+F или выборе опции «Найти и выбрать» на ленте «Главная». В настоящее время нет известного способа исправить это (просматривая xlValues ​​и тому подобное, как указано в комментариях) Поскольку есть разные способы обойти это, самый (самый медленный), но самый надежный — это использовать цикл foreach следующим образом:

Просто убедитесь, что вы устанавливаете свой диапазон как определенное значение, например Range(«A1:B87») вместо Columns(2) , так как это вызовет ошибку несоответствия типов. Если вы хотите найти столбец B, используйте Range(«B:B») .

Источник

VBA Excel. Метод Find объекта Range

Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.

Предназначение и синтаксис метода Range.Find

Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

Синтаксис метода Range.Find

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, если поисковая фраза не найдена.

Источник

Понравилась статья? Поделить с друзьями:
  • Excel vba find если не находит
  • Excel vba find в строке
  • Excel vba find в диапазоне
  • Excel vba find with range
  • Excel vba find searchformat