Страницы: 1
RSS
Макрос с Find выдает ошибку
 
Название в первом списке может быть сокращено, во второй же оно написано полностью.  
(Т.е. в первой Бондар во второй полностью Бондаренко)  
 
Я через Find ищу каждое слово во втором списке и в соседний столбец вывожу полное название.  
 
У меня почему-то как-то одни и те же строчки то обрабатываются, то выдают ошибки.  
Подскажите пожалуйста, что не так?  
 
Для примера можно запустить Макросс1() (он выдаст ошибку на третьей строке), а потом запустить Макросс2()  - он обработает третью строку и запнется на седьмой)    
Эти макросы идентичны, кроме первой строки.
 
*Первая строчка не вставилась*  
 
"Добрый день, помогите пожалуйста решить задачку:  
У меня есть два списка на разных листах."
 
Не верно расположен блок обработки ошибок:  
 
Sub Макросс1()  
Range(Cells(1, 1), Cells(10, 1)).Select  
On Error GoTo Errr  
For Each cell In Selection  
iPersona = cell.Value  
cell.Offset(0, 1) = ""  
 
rr = Sheets("Контакты").Columns("D:D").Find(What:=iPersona).Row  
iPersonFull = Sheets("Контакты").Columns("D:D").Rows(rr)  
cell.Offset(0, 1) = iPersonFull  
cell.Offset(0, 1).Font.ColorIndex = 1  
 
Next  
 
Errr: 'обработка ошибки  
If cell.Offset(0, 1) = "" Then  
cell.Offset(0, 1) = iPersona  
cell.Offset(0, 1).Font.ColorIndex = 3  
End If  
End Sub
Учимся сами и помогаем другим...
 
ber$erk, Ваш вариант дальше второй строки не идёт :-)
 
А как же быть? В таком случае при первой ошибуке он выходит из цикла и получается, что обработались только значения до первой попавшейся ошибки, а потом выход из цикла и конец. Весь оставшийся список не обработался.
 
Другой_, попробуйте искать частичное совпадение - параметр lookAt:=xlPart  
Но возникнет проблема: что делать, если таковых будет несколько?
 
{quote}{login=Юрий М}{date=27.07.2012 11:39}{thema=}{post}ber$erk, Ваш вариант дальше второй строки не идёт :-){/post}{/quote}  
Это потому что я не проверял алгоритм, а объяснил причину возникновения ошибки.  
Раз на то пошло, то правильный вариант такой:  
 
Sub Макросс1()  
Range(Cells(1, 1), Cells(10, 1)).Select  
Dim searchCell As Range  
 
On Error Resume Next  
For Each cell In Selection  
iPersona = cell.Value  
cell.Offset(0, 1) = ""  
 
 
Set searchCell = Sheets("Контакты").Columns("D:D").Find(What:=iPersona)  
If searchCell Is Nothing Then  
   If cell.Offset(0, 1) = "" Then  
   cell.Offset(0, 1) = iPersona  
   cell.Offset(0, 1).Font.ColorIndex = 3  
   End If  
Else  
iPersonFull = Sheets("Контакты").Columns("D:D").Rows(rr)  
cell.Offset(0, 1) = iPersonFull  
cell.Offset(0, 1).Font.ColorIndex = 1  
End If  
Next  
 
 
 
End Sub
Учимся сами и помогаем другим...
 
Попробуйте такой вариант:  
Sub Шмакрос3()  
Dim Rng As Range, TextToFind As String  
   With Sheets("Контакты")  
       For i = 1 To 55  
           TextToFind = Cells(i, 1)  
           Set Rng = .Columns(4).Find(what:=TextToFind, LookIn:=xlFormulas, lookAt:=xlPart)  
           If Not Rng Is Nothing Then  
               Cells(i, 2) = Rng.Value  
           Else  
               Cells(i, 2) = "Нет такого"  
           End If  
       Next  
   End With  
End Sub
 
поторопился:  
строчку заменить надо  
iPersonFull = Sheets("Контакты").Columns("D:D").Rows(searchCell.Row)
Учимся сами и помогаем другим...
 
Спасибо)  
Правда, пока осталось не понятно, почему в предыдущий раз то обрабатывало строчку нормально, но нет.. Нельзя что-ли обработку ошибки в цикле использовать..  
 
А можно ещё узнать, как я могу узнать номер строки в которой нашелся результат поиска? Например, если, я захочу взять результат из соседнего столбца от найденного значения.  
Вот так не хочет выдавать rr = searchCell.Rows
 
*ага, понял про rr = searchCell.Row
 
А всё-таки, почему нельзя блок обработки ошибки внутрь вставлять, что таоке присходило, что ошибка вылезала?
 
Мой вариант не устраивает? И никаких ошибок, требующих дальнейшей обработки :-)
 
Юрий, я пробовал, у меня то же самое, ошибка вылезает.  
(А насчет дублей в данном случае эта проблема не стоит.)  
 
Sub Макросс1()  
Range(Cells(1, 1), Cells(10, 1)).Select  
 
For Each cell In Selection  
iPersona = cell.Value  
cell.Offset(0, 1) = ""  
 
On Error GoTo Errr  
rr = Sheets("Контакты").Columns("D:D").Find(What:=iPersona, lookAt:=xlPart).Row  
iPersonFull = Sheets("Контакты").Columns("D:D").Rows(rr)  
cell.Offset(0, 1) = iPersonFull  
cell.Offset(0, 1).Font.ColorIndex = 1  
 
Errr: 'обработка ошибки  
If cell.Offset(0, 1) = "" Then  
cell.Offset(0, 1) = iPersona  
cell.Offset(0, 1).Font.ColorIndex = 3  
End If  
 
 
Next  
 
End Sub
 
{quote}{login=Другой_}{date=27.07.2012 12:49}{thema=}{post}Юрий, я пробовал, у меня то же самое, ошибка вылезает.{/post}{/quote}У меня никаких ошибок не возникает. См. файл.  
Что за ошибка у Вас?
 
Юрий, вашим вариантом у меня никаких ошибок не возникает. Скорее всего я им воспользуюсь, он очень лаконичный.  
 
Но всё-таки хотелось бы мою ошибку узнать, что бы не повторять в будущем.  
У меня возникает ошибка "Run-time error 91    
Object variable or With block variable not set" (прикрепил файл Макрос1)  
 
Что такое происходит, что вылезает ошибка?
 
rr = searchCell.Row    
Вы пытаетесь переменной присвоить номер стройки, где найдено значение. А значение НЕ НАЙДЕНО. Какая это может быть строка?
 
{quote}{login=Другой_}{date=27.07.2012 01:51}{thema=}{post}Юрий, вашим вариантом у меня никаких ошибок не возникает. {/post}{/quote}А перед этим писали: "Юрий, я пробовал, у меня то же самое, ошибка вылезает." :-) Соберитесь с мыслями :)
 
Юрий, спасибо.  
 
Последний вопросик)  
А разве On Error GoTo Errr не должен направить на метку Errr ?  
Ведь он для этого тут и стоит же..
Страницы: 1
Читают тему
Наверх