2014-08-04 3 views
0

Я борюсь с этим битом кода VBA. По какой-то причине я продолжаю получать: «Сообщение об ошибке« 1004 »: ошибка, определяемая приложением или объектная ошибка». Моя единственная мысль о том, почему это может быть, это то, что у меня есть макрос, связанный с кнопкой команды, привязанной к определенному листу - если это ошибка, как я могу ее решить? В противном случае, что может быть ошибкой здесь?Excel VBA Определенная приложением или объектная ошибка

Линия, вызывающая ошибку, начинается с MsgBox.

Sub Process() 
    Sheets("Intermediate").Cells(2, 1).Select 
    Dim contains As Range, lastRow As Long 
    Do Until IsEmpty(ActiveCell) 
     MsgBox Sheets("Document Library").Columns(1).Find(ActiveCell.Value) 
     ActiveCell.Offset(1, 0).Select 
    Loop 
End Sub 

Спасибо!

+0

извини, забыл упомянуть об этом. Это линия, начинающаяся с MsgBox. – stamblerre

+3

См. [ЭТО] (http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/) о том, как использовать '.Find' –

+0

Также избегайте использования [.Select] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros/10718179#10718179) Также вы можете найти последнюю ячейку в Col A используя [ЭТО] (http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba/11169920#11169920), а затем использовать FOR LOOP? –

ответ

1

Метод Range.Find возвращает объект Range. Для функции MsgBox требуется вывод строки. Поэтому попробуйте следующее:

MsgBox Sheets("Document Library").Columns(1).Find(ActiveCell.Value).Value 

Обратите внимание, что в зависимости от типа значения в ячейке может потребоваться преобразование в строку.

+1

+1. Обратите внимание на то, что эта строка будет продолжаться до ошибки *, если * результат '.Find' равен' Nothing' i.e, значение не найдено. Требуется дополнительная логика, чтобы проверить это и избежать ошибки :) –

+0

hm, по-прежнему не работает по какой-то причине, но спасибо. Я думаю, что моя проблема связана с тем, что у меня много листов, поскольку лист, который я нахожу, не является активным листом. Может ли так быть? – stamblerre

+0

@DavidZemens, спасибо, хорошая точка. –

2

В дополнении к использованию ссылки Сиды в качестве ссылки, стоит отметить, что различные настройки для Find() являются стойких - то есть, если вы использовали Find определенным образом (через пользовательский интерфейс или с помощью VBA), то в следующий раз, когда вы вызываете Find, те же настройки будут использоваться, если вы не укажете иное.

Таким образом, это всегда хорошая практика, чтобы указать все параметры, вы заботитесь о (например, lookAt, lookIn) каждый раз, когда вы используете Find или вы не можете получить результаты, которые вы ожидаете.

Кроме того, вам нужно обрабатывать событие, где вы не найдете значение разыскивается - в этом случае возвращается Найти Nothing:

Sub Process() 
    Dim f as Range, c As Range, rngSearch as Range 

    Set rngSearch = Sheets("Document Library").Columns(1) 
    Set c = Sheets("Intermediate").Cells(2, 1) 

    Do While Len(c.Value)>0 
     'specify exactly how you want Find() to operate.... 
     Set f = rngSearch.Find(What:=c.Value, lookin:=xlValues, lookat:=xlWhole) 
     If Not f Is Nothing Then 
      debug.print c.value & " found at " & f.address() 
     Else 
      debug.print c.value & " not found!" 
     End If 
     Set c = c.Offset(1, 0) 
    Loop 

End Sub 
Смежные вопросы