Как использовать функцию поиска - PullRequest
1 голос
/ 30 октября 2019

Недавно я написал некоторый код для получения ввода из текстового поля пользовательской формы и поиска его в моей базе данных. В случае обнаружения я бы хотел, чтобы оно вернуло значение и вставило его в ячейку A1149;Я написал код ниже, но он выдает ошибку # 424 «Требуется объект». Я очень новичок в VBA, поэтому любая помощь очень ценится.

Private Sub CMDSearch_Click()

     Dim pesquisa As Range

     Set pesquisa = Worksheets("Petrobras").Activate.Range("$W:$W") _
         .Find(What:=Opp_Num_Search.Value, LookIn:=xlValues, Lookat:=xlWhole).Activate

     Worksheets("Petrobras").Range(A1149).Value = pesquisa.Value

     UserForm1.Hide

End Sub

1 Ответ

2 голосов
/ 30 октября 2019

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 с открытым исходным кодом, которой я управляю.

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