Я пытаюсь использовать макрос для поиска в книге Excel определенной строки. Я хочу взять адреса ячеек, в которых найдена строка, и поместить их один за другим в столбец I текущего листа. Мой код и проблемы ниже.

Option Explicit

Sub Find_Data()

Dim datatoFind As String
Dim rangeSearch As Range
Dim rangeLast As Range
Dim foundRange As Range
Dim strFirstAddress As String
Dim sheetCount As Integer
Dim sheetCounter As Integer
Dim currentSheet As Integer
Dim foundmatrixCounter As Integer
foundmatrixCounter = 2 'initialize this to the second row so the total can be placed in the first row when done

'set search range
Set rangeSearch = ActiveSheet.Range("B2:X100")

'set last cell in range
Set rangeLast = rangeSearch.Cells(rangeSearch.Cells.Count)

currentSheet = ActiveSheet.Index
datatoFind = InputBox("Please enter the value to search for")
If datatoFind = "" Then Exit Sub
sheetCount = ActiveWorkbook.Sheets.Count

For sheetCounter = 1 To sheetCount
    Sheets(sheetCounter).Activate
    Set foundRange = Cells.Find(What:=datatoFind, After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate
    'if datatoFind is found in search range
    If Not foundRange Is Nothing Then
        'save the address of the first occurrence of datatoFind, in the strFirstAddress variable
        strFirstAddress = foundRange.Address
        Do
            'Find next occurrence of datatoFind
            Set foundRange = foundRange.FindNext(foundRange)
            'Place the address of this occurrence in the next cell down in the column that holds found values (i column)
            Cells(foundmatrixCounter, 9).Value = foundRange.Address
            'Increment the loop counter for the i column
            foundmatrixCounter = foundmatrixCounter + 1
            'The Loop ends on reaching the first occurrence of datatoFind
        Loop Until foundRange.Address = strFirstAddress
    End If
    Cells(1, 9).Value = foundmatrixCounter 'Put the total number of instances, in this case foundmatrixCounter, in Z1
Next sheetCounter

If foundRange Is Nothing Then
MsgBox ("Value not found")
Sheets(currentSheet).Activate
End If
End Sub

Я получаю ошибку

Ошибка выполнения 424 (требуется объект)

На следующей строке:

Set foundRange = Cells.Find(What:=datatoFind, After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate

Не уверен, что насчет строки или кода в целом здесь может быть что-то не так.

0
Tyler Cheek 2 Дек 2014 в 22:53
1
Удалите .Activate, потому что, когда он ничего не находит, он не может активировать ячейку, что вызывает ошибку
 – 
tigeravatar
2 Дек 2014 в 22:57
На самом деле, ошибка произойдет независимо от того, найдет ли он что-то.
 – 
Ron Rosenfeld
2 Дек 2014 в 23:03
1
В самом деле? Это странно. Когда я тестирую его без .Activate, он успешно работает для меня. Конечно, когда я запускаю его с помощью .Activate, я получаю сообщение об ошибке «Переменная объекта не установлена» вместо ошибки, которую получает OP / пожимает плечами.
 – 
tigeravatar
2 Дек 2014 в 23:19
Возможно, я не понял или неправильно понял то, что вы написали. При наличии «.Activate» произойдет ошибка, независимо от того, было ли что-то найдено. Без .Activate работает нормально.
 – 
Ron Rosenfeld
3 Дек 2014 в 00:12

2 ответа

Удалите .Activate в конце строки.

Активировать ничего не нужно. Но также этот формат неверен. Это было бы похоже на:

Dim R as Range
set R = Range("A1").Activate

Поскольку Range("A1").Activate не является объектом (это логическое значение), это приведет к той же ошибке.

2
Ron Rosenfeld 2 Дек 2014 в 23:05

Рон прав. Установите свой объект диапазона, а затем проверьте, был ли найден datatoFind, проверив объект диапазона на ничего. Затем вы можете активировать диапазон.

Set foundRange = Cells.Find(What:=datatoFind, After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) If Not foundRange Is Nothing Then foundRange.Activate

0
Cory 3 Дек 2014 в 01:05
Почему ОП должен «Активировать» диапазон?
 – 
Ron Rosenfeld
3 Дек 2014 в 01:31
Честно говоря, я не читал весь код, а только тот отрывок, который вызывал ошибку. После прочтения полного кода нет смысла активировать диапазон.
 – 
Cory
3 Дек 2014 в 21:32
Я так не думал, но я иногда что-то пропускаю, отсюда и мой вопрос.
 – 
Ron Rosenfeld
3 Дек 2014 в 21:37