2015-01-15 2 views
1

Я застрял на этом в течение нескольких часов, и .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 
+5

Ошибка в строке '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/ –

+2

Стоит добавить: обычно это не проблема, потому что FindNext() вернет обратно как только он найдет последнее значение поиска в диапазоне (и поэтому c никогда не будет ничем), но в вашем случае вы удаляете каждое значение по ходу, поэтому после последнего значения нет другого значения для возврата назад. В этом конкретном случае вам даже не нужно отслеживать «адрес» - это действительно полезно, только если вам нужно определить, когда Find обертывает bacxk в первую ячейку. –

+1

Быстрое исправление того, о чем упомянул Тим, заключается в том, чтобы просто изменить 'Not c Is Nothing' на 'c <> ""'. Я протестировал вышеуказанный код (с упомянутой настройкой), и он работал без ошибок. Я не смог воспроизвести описанную вами ошибку. –

ответ

0

Перезагрузка Excel исправила проблему. Это был простой и простой глюк, не уверенный, что вызвало поведение. Спасибо всем, кто помог.

1
Sub StraitFromMSDN() 

Dim c As Range 

With ActiveSheet.Range("a1:a500") 
    If Not .Find(What:=2, LookIn:=xlValues) Is Nothing Then 'test if there is any value you are looking for 
     Set c = .Find(What:=2, LookIn:=xlValues) 
    End If 
End With 

End Sub 

Это будет найти только одну ячейку, содержащую значение 2. Если вы хотите, чтобы найти все их, дайте мне знать, за этим стоит более сложный код.

+0

Спасибо за ответ и чек, если он есть, но проблема была просто сбой. Я должен был ответить на мой вопрос раньше, чтобы люди не тратили на это больше времени. +1 жаль. – nateAtwork