Range.Activate
ничего не возвращает, это как Sub
процедура:
Public Sub DoSomething()
' does something...
End Sub
Если вы сделали Set foo = DoSomething.Something
, вы получите ту же ошибку: требуется объект, в противном случаечто .Something
вызов члена недопустим (за исключением того, что теперь ошибка будет во время компиляции, а не во время выполнения из-за того, как работает связывание).
Set pesquisa = Worksheets("Petrobras").Activate...
Вы неActivate
любые листы не нужны.
Отчасти проблема заключается в неявном позднем связывании: Worksheets
возвращает Object
, поэтому все, что вы написали после этого, все эти цепочечные вызовы членов,может быть разрешено только во время выполнения.
Сделайте это с ранним ограничением, объявив явную переменную Worksheet
:
Dim sheet As Worksheet
Set sheet = Worksheets("Petrobras")
Теперь, если вы хотите активировать ее, вы можете сделатьsheet.Activate
(но вам не нужно). И если вы хотите получить Range
из этого листа, вы можете сделать .Range
вызов участника , и теперь среда IDE поможет вам сделать это :
Dim result As Range
Set result = sheet.Range("$W:$W").Find(...)
НИКОГДА не связывает все вызовы участников с тем, что возвращает Range.Find
. Если поиск дал результат, у вас есть объект Range
. Если этого не произошло, у вас есть Nothing
- и любой вызов участника, сделанный против Nothing
, всегда вызовет ошибку времени выполнения 91.
Сначала проверьте результат поиска:
If result Is Nothing Then
MsgBox "Could not find '" & Opp_Num_Search.Value & "' in column W."
Exit Sub
End If
Или:
If Not result Is Nothing Then
sheet.Range("A1149").Value = result.Value
End If
Обратите внимание, что A1149
является строковым литералом , представляющим адрес ячейки, и поэтому должен быть заключен в двойные кавычки ("
). Если он не заключен в двойные кавычки и выглядит как допустимое имя переменной, VBA будет обрабатывать его как переменную ..a, и это вызовет еще одну ошибку (1004), потому что Range
будет довольно неприятно работать сVariant/Empty
value.
Чтобы VBA не "объявляла" переменные "на лету" с опечаткой (и приводила к труднодоступным ошибкам), убедитесь, что у вас Option Explicit
в самом верхукаждый модуль в вашем проекте.
И последнее:
UserForm1.Hide
Это скрывает экземпляр по умолчанию из UserForm1
, который может илиможет не отображаться текущий объект / экземпляр, и сама форма не может знать, как он был показан:
UserForm1.Show '<~ shows the default instance
With New UserForm1
.Show '<~ shows a new (non-default) instance
End With
По этой причине вам следует избегать ссылки на экземпляр по умолчанию вкод формы позади. Вместо этого используйте Me
:
Me.Hide
Таким образом, вы ссылаетесь на любой экземпляр формы, отображаемый в данный момент , независимо от того, является ли он экземпляром по умолчанию или нет. См. UserForm1.Show для получения дополнительной информации, советов, ошибок и распространенных ошибок, связанных с пользовательскими формами.
Обратите внимание, что Rubberduck имеет довольно много проверок , которые могут идентифицировать и предупредить вас о(и часто автоматически исправляет) большинство из этих проблем. Rubberduck - это бесплатный надстройка VBIDE с открытым исходным кодом, которой я управляю.