Возникла проблема с методом 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
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 (цифра), всё равно не ищет.
При чем здесь xlsx? Я могу ссылаться для поиска на любой файл, хоть на txt или csv при желании. Макрос у меня живет естественно в xlsm, он просто не может подругому. Это я сюда другие файлы выложил, а код не исправил. У меня и файл xlsm и ссылка на файл xlsm.
Если делаю активной PrismaTools.xlsm, то код ниже срабатывает и находит всё. А если просто открыта рядом, но не активна, то вызывает Object variable not set (Error 91)
Вот почему макрос вчера то находил, то не находил номер поставщика (а из-за on error resume next я ошибку не ловил)... ох, два часа коту под хвост