#excel #vba #parameters
#excel #vba #параметры
Вопрос:
Мой код довольно прост, я ищу определенное слово в столбце с другого листа. Я создал функцию «find», которая возвращает True или false в зависимости от того, находит она это слово или нет. Функция поиска имеет два параметра: конкретный столбец на листе и слово, которое он ищет. Смотрите код ниже:
Public Function FoundExp(expID As String, ByVal lsCol As listColumn) As Boolean
Dim exp As String
Dim listCol As ListColumn
exp = expID
Set listCol = lsCol
FoundExp = Not lsCol.Range.find(exp) Is Nothing 'changed per BigBen <--error thrown here
End Function
Когда я вызываю эту функцию из другого подраздела, я получаю сообщение об ошибке, в котором говорится, что объект не был установлен. Кроме того, когда я проверил тип данных, он отображается в виде строки.
Это вызывающая строка:
Есть идеи о том, что я делаю не так?
Редактировать: это может иметь какое-то отношение к тому, как я создаю экземпляр исходного столбца списка, который я передаю. Я вызываю функцию из отдельного подраздела, в данном случае в другом модуле, но конечная позиция подраздела будет в том же модуле, что и функция find .
Вызов sub выглядит так:
Sub Foo()
Dim tbl2 as ListObject
Dim lsCol as ListColumn
Set tbl2 = ws.ListObjects.("TableName")
Set lsCol = tbl2.ListColumns(2)
Debug.Print lsCol 'this reads column header text
Debug.Print VarType(lsCol) 'this reads as 8
FoundExp "foo", lsCol
End Sub
Комментарии:
1. Объекты всегда передавались по ссылке.
2. @user14797724 — неверно, распространенное заблуждение.
3.
listCol.Range.find(exp) = True
предполагается, чтоFind
это успешно, что не обязательно так. Вам нужно проверитьFind
, удалось ли выполнить.4. Вы не можете скопировать объект. Любая попытка просто увеличивает количество ссылок и возвращает тот же объект.
5. @BigBen Я, наконец, понимаю, что вы имеете в виду, когда говорите о необходимости проверить, удалось ли найти, используя логику If Not Is Nothing .