Я застрял на этом в течение нескольких часов, и .find, похоже, работал на меня в более ранних версиях той же программы. Я не уверен, какая версия Excel была сохранена как раньше, когда range.find работал (2010 или 2003), но теперь он не работает в Excel 2010. Чтобы исключить другие части моего кода в качестве источника ошибки, я буквально скопировал и вложил следующее из MSDN в мой редактор, поместил его в свою собственную подпрограмму, объявил переменные и все равно получил ту же «Определенную приложением или объектную ошибку», когда код был запущен. Вот код, который произвел ошибку на линии, я заметил, где я отклонилась от того, что было на msdn:Range.Find прямо с MSDN не работает, определенная или объектная ошибка
Sub StraitFromMSDN()
'Only line that was changed:
'With Worksheets(1).Range("a1:a500")
With ActiveSheet.Range("a1:a500")
'These two lines were added:
Dim c As Range
Dim firstAddress As String
'Error occurs on the following line:
Set c = .Find(2, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub
Кто-нибудь знает, почему это будет происходить? Я относительно новичок в vba, поэтому возможно, что мне не хватает чего-то простого. Заранее спасибо!
EDIT:
я все еще получаю ошибку, когда я беру нижнюю часть из:
Sub StraitFromMSDN()
Dim c As Range
With ActiveSheet.Range("a1:a500")
'Error occurs here:
Set c = .Find(What:=2, LookIn:=xlValues)
End With
End Sub
Ошибка в строке 'Loop While Not C is Nothing & c.Address <> firstAddress' В VBA' And' не является «короткой цепью» (оба аргумента всегда оцениваются), поэтому даже если 'c 'is' Nothing', он все равно попытается оценить 'c.Address' (и это вызовет ошибку, когда c - Nothing). Это необходимо разбить на два теста - сначала для c, а затем для адреса. См. (Например) http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/ –
Стоит добавить: обычно это не проблема, потому что FindNext() вернет обратно как только он найдет последнее значение поиска в диапазоне (и поэтому c никогда не будет ничем), но в вашем случае вы удаляете каждое значение по ходу, поэтому после последнего значения нет другого значения для возврата назад. В этом конкретном случае вам даже не нужно отслеживать «адрес» - это действительно полезно, только если вам нужно определить, когда Find обертывает bacxk в первую ячейку. –
Быстрое исправление того, о чем упомянул Тим, заключается в том, чтобы просто изменить 'Not c Is Nothing' на 'c <> ""'. Я протестировал вышеуказанный код (с упомянутой настройкой), и он работал без ошибок. Я не смог воспроизвести описанную вами ошибку. –