.Range (). Find () выдает ошибку «Требуется объект» при использовании объекта String - PullRequest
0 голосов
/ 25 января 2019

Это первый раз, когда я пишу код VBScript. Я пытаюсь перебрать столбец для поиска заданной строки и возврата адреса. Переменные 'i' и 'j' являются частью цикла, который работает нормально, поэтому я его опускаю.

toSearch = objToExcel.ActiveSheet.PivotTables("MyPivot").RowFields(i).PivotItems(j).Name
If toSearch <> "(blank)" Then
        Set foundRow = objToExcel.ActiveSheet.Range("A2:A20").Find(toSearch)
        MsgBox foundRow.Row
End If

Я получаю сообщение об ошибке для строки objToExcel.ActiveSheet.Range("A2:A20").Find(toSearch) с указанием 'Object Required: objToExcel.ActiveSheet.Range(...).Find(...)'.

Когда я заменяю строковый объект toSearch жестко закодированной строкой, такой как Find("Alex"), цикл работает нормально, и я получаю номер строки для строки. Более того, в цикле объект toSearch может правильно получить все строки из столбца. Когда я использую тот же объект в Find(), я получаю сообщение об ошибке.

Есть идеи, где я иду не так?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Все еще удивляетесь, почему ваш обходной путь работает ...

Пожалуйста, проверьте, если вы объявили foundRow как Dim ... as Long, Dim ... as Range, Dim ... as Variant (не рекомендуется) или просто Dim ... (никогда не рекомендуется). В обоих последних случаях Excel решает за вас, и, возможно, решение работает несколько строк кода раньше, но не здесь.

Range и Long будут работать, но есть некоторые различия:

Dim foundRow as Range
...
Set foundRow = objToExcel.ActiveSheet.Range("A2:A20").Find(toSearch)
If Not foundRow Is Nothing Then
    MsgBox foundRow.Row
Endif

или

Dim foundRow as Long
...
foundRow = objToExcel.ActiveSheet.Range("A2:A20").Find(toSearch).Row
MsgBox foundRow

Первое решение лучше, так как вы также можете справиться с не найденным.
Если он не найден по какой-либо причине (Range.Find даже не находит в скрытых или сгруппированных ячейках), прямое назначение во втором решении вызывает ошибку.

0 голосов
/ 25 января 2019

Не могли бы вы просто просмотреть диапазон, чтобы найти значение? Как:

For each cell in Range("A2:A20").cells
    if cell.value = toSearch then
        MsgBox cell.Row
        exit for
    end if
next

Вам нужно затемнить ячейку как диапазон до

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...