Range.Find Функция - PullRequest
       3

Range.Find Функция

0 голосов
/ 13 июня 2019

Использование метода Range.Find не работает для имени файла. Диапазон DocPresent всегда "Ничто"

Я обрабатываю несколько листов Excel и хочу отслеживать, какие из них я уже обработал. Чтобы я не обработал лист снова при повторном запуске макроса

Dim wbname1 As String
wbname1 = ActiveWorkbook.Name

Range("A1").End(xlDown).Offset(1, 0) = wbname1


Dim DocPresent As Range
Set DocPresent = Range("A1:A1000").Find(What:=wbname1)

Я ожидаю, что диапазон вернет правильный диапазон, если найдет соответствующую ячейку.

1 Ответ

2 голосов
/ 13 июня 2019

Обратите внимание, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...