Страницы: 1
RSS
Метод Find не ищет строку, Find с переменным успехом то ищет, то не ищет строку без видимых изменений
 
Добрый день всем.

Возникла проблема с методом 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


Изменено: invirtus - 28.07.2015 10:03:13
 
Код
Sub ПримерFind()
'Пример выполения поиска по диаппазону листа
'взят в контексте из рабочей процедуры
Set myRange = oSht.Range(oSht.Cells(10, 1), oSht.Cells(1000, 1).Offset(, 7))
' ...
'iWord - string - слово или фраза для поиска, можно циклом массив iWord(x) просматривать
      With myRange
          Set myRange = .Find(What:=Trim(iWord), LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False) 'поиск по критерию
              If Not myRange Is Nothing Then
                  iAddress$ = myRange.Address 'контрольный стартовый адрес
                  Do
''                  Эта часть кода только как пример работы с найденным словом по Find,
''                  дальше ограничение только Ваша фантазия и знания VBA
''                  Всё что незакоментировано относится к Find
'                  xRow = myRange.Row 'строка поиска
'                  Название_листа = nameSht '& ", cтр." & xRow
'                  temp = Название_листа & _
'                     ": Предмет - " & Chr(34) & oSht.Cells(xRow, 2).Value & Chr(34) & _
'                     "; код - " & oSht.Cells(xRow, 3).Value & _
'                     "; сума - " & oSht.Cells(xRow, 4).Value & " грн." & _
'                     "; підрозділ - " & oSht.Cells(xRow, 7).Value
'                  'проверяем уникальность данных словарем 'Загружаем уникальные в словарь
'                      If Not myColl.Exists(temp) Then myColl.Add temp, 0

                  Set myRange = .FindNext(After:=myRange) 'продолжение поиска
                  Loop Until myRange.Address = iAddress$  'контроль стартового адреса
              End If
      End With
'...
End Sub
 
Спасибо. Подумаю.
Но на самом деле меня просто интересует, почему вот эта строка не находит в таблице supplier.xlsx номер поставщика, при том, что SupplierINN четко определен и найден, и ему присвоено значение. Я не могу понять, почему. Даже если я SupplierINN сделаю не string, a double (цифра), всё равно не ищет.
Код
xSupplier = Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range(Range("A:A").Find(SupplierINN, , xlValues, xlPart).Address).Offset(, 2).Value
 
Мне тоже ни Стринг ни дабл не помогли. попробуйте variant, либо не объявляйте переменную и понаблюдайте за работой
 
Отключите On Error Resume Next и посмотрите причины ошибок.  
 
В файлах нет макросов (они в *.xlsx не живут)
Согласие есть продукт при полном непротивлении сторон
 
Да, спасибо, не подумал. Жалуется на Object variable not set  (Error 91), но не совсем понимаю, что он хочет. Почему это работает прекрасно:
Код
SupplierINN = Worksheets("Данные поставщика").Range(Worksheets("Данные поставщика").Range(SupplierBlockStart & ":" & SupplierBlockEnd).Find("*ИНН*").Address).Offset(, 1).Value

отличается от этого?
Код
xSupplier = Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range(Range("A:A").Find(SupplierINN, , , xlPart).Address).Offset(, 2).Value
это вызывает Object variable not set  (Error 91)
 
Цитата
Sanja написал: В файлах нет макросов (они в *.xlsx не живут)
А в файлах и нет макросов. У меня есть, а в выложенных нет. Код выложен в виде текста, а более ничего не требуется.
Изменено: invirtus - 28.07.2015 18:17:28
 
Object variable not set: объекта не существует (поиск не нашел нужной ячейки в АКТИВНОЙ книге).
Изменено: Влад - 28.07.2015 12:17:51 (уточнение причины)
 
Ага, и я про "*.xlsx" намекал
Согласие есть продукт при полном непротивлении сторон
 
Я конечно может чего не понимаю (расширение файла надо писать при ссылке на Workbooks?), но вот...
 
Цитата
Sanja написал: Ага, и я про "*.xlsx" намекал
При чем здесь xlsx? Я могу ссылаться для поиска на любой файл, хоть на txt или csv при желании. Макрос у меня живет естественно в xlsm, он просто не может подругому.
Это я сюда другие файлы выложил, а код не исправил. У меня и файл xlsm и ссылка на файл xlsm.
Изменено: invirtus - 28.07.2015 18:17:49
 
Если делаю активной PrismaTools.xlsm, то код ниже срабатывает и находит всё. А если просто открыта рядом, но не активна, то вызывает Object variable not set  (Error 91)

Вот почему макрос вчера то находил, то не находил номер поставщика (а из-за on error resume next я ошибку не ловил)... ох, два часа коту под хвост
Код
Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range(Range("A:A").Find(SupplierINN,, xlValues, xlPart).Address).Offset(, 2).Value
Изменено: invirtus - 28.07.2015 11:14:32
 
При правильной записи кода поиск будет выполняться и при неактивной книге (см. пост ниже)
Изменено: Влад - 28.07.2015 12:11:24
 
Range в скобках нужно указывать явно (книга, лист)
Код
Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range(Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range("A:A").Find(SupplierINN,, xlValues, xlPart).Address).Offset(, 2).Value

Но эту хитрую конструкцию можно и упростить
Код
Workbooks("PrismaTools.xlsm").Worksheets("Suppliers").Range("A:A").Find(SupplierINN,, xlValues, xlPart).Offset(, 2).Value
 
Всё, я понял. Протестирую. Спасибо.
 
Всем спасибо большое. Уже второй раз на эту досадную ошибку (не указываю полный путь внутри скобок) наступаю. Надеюсь запомню.
Страницы: 1
Читают тему
Наверх