Обратите внимание, что Range("A1").End(xlDown)
может оказаться ниже A1000
, но ваш .Find
смотрит только до A1000
.
Так что либо используйте весь столбец Range("A:A").Find…
, либо найдите последнюю использованную ячейку Range("A1", Cells(Rows.Count, "A").End(xlUp)).Find…
И укажите рабочую книгу и рабочий лист для всех ваших диапазонов!
Dim wbname1 As String
wbname1 = ActiveWorkbook.Name
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("MySheet")
ws.Range("A1").End(xlDown).Offset(1, 0) = wbname1
Dim DocPresent As Range
Set DocPresent = ws.Range("A1", ws.Cells(ws.Rows.Count, "A").End(xlUp)).Find(What:=wbname1, LookAt:=xlWhole)
Обратите внимание, что ThisWorkbook
указывает на книгу, в которой выполняется этот код. Но ActiveWorkbook
указывает на книгу, которая имеет фокус (находится сверху) в момент выполнения кода. ActiveWorkbook
может легко измениться по клику пользователя, но ThisWorkbook
всегда одинаков.
Также обратите внимание, что метод Range.Find имеет параметр LookAt
, который должен всегда указываться xlWhole
или xlPart
. В противном случае VBA использует тот, который использовался последним либо VBA, либо пользовательским интерфейсом. Поэтому вы никогда не знаете, какой VBA будет использовать, поэтому всегда указывайте его.
Согласно комментарию ниже, вы должны проверить, был ли ваш метод Find
успешным, прежде чем использовать DocPresent
, чтобы не столкнуться с ошибкой:
If Not DocPresent Is Nothing Then
'do your stuff using DocPresent
Else
MsgBox "'" & wbname1 & "' was not found.", vbCritical
Exit Sub
End If